Paste1C
  • API
  • О проекте
  • Контакты
  • Регистрация
  • Вход
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
   
    //  1. Получение запросом данных из ТАБЛИЧНОЙ ЧАСТИ документа
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; // нужен так, как временную таблицу мы используем во втором запросе
    Запрос.Текст =
        "ВЫБРАТЬ
        |   Товары.Номенклатура КАК Номенклатура,
        |   СУММА(Товары.Количество) КАК Количество
        |ПОМЕСТИТЬ Товары 											//вот эту таблицу мы используем дальше ТОВАРЫ
        |ИЗ
        |   Документ.РеализацияТоваровУслуг.Товары КАК Товары
        |ГДЕ
        |   Товары.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |   Товары.Номенклатура										// не забываем группировать данные, что бы одинаковые строчки схлопнулись а их количесвто просуммировалось
        |
        |ИНДЕКСИРОВАТЬ ПО
        |   Номенклатура
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |   Товары.Номенклатура КАК Номенклатура,					// так как мы данные поместили в ВТ нам надо их достать ( это те же данные, что и выше)
        |   Товары.Количество КАК Количество
        |ИЗ
        |   Товары КАК Товары";
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    РезультатЗапроса = Запрос.Выполнить();
   
    //  2. Передаем данные в РЕГСТР Формирование движений-расход регистра
    //Движения.СвободныеОстатки.Очистить();						<------ Это строчка лишняя, так как Движения.СвободныеОстатки ничего нет
    ВыборкаТовары = РезультатЗапроса.Выбрать();
    Пока ВыборкаТовары.Следующий() Цикл
        Движение = Движения.СвободныеОстатки.ДобавитьРасход();
        Движение.Период = Дата;										// достаем не из запроса, а из шапки документа (склад если в шапке был бы, мы бы так же его достали бы)
        Движение.Номенклатура = ВыборкаТовары.Номенклатура;			//в ВыборкаТовары у нас находится все то что у нас в разделе ВЫБРАТЬ в запросе
        Движение.Количество = ВыборкаТовары.Количество;
    КонецЦикла;
   
    //  3. Запись данных в БД (БАЗУ ДАННЫХ) 						Именно совокупность этих 2 строчек, производит запись данных из документа
    Движения.СвободныеОстатки.Записывать = Истина;				//	в РЕГИСТР и в БАЗУ ДАННЫХ.
    Движения.Записать();										//  <------------вот на этом моменте мы записали данные, если бы не эта строчка, то это произошло бы в КОНЦЕ ПРОЦЕДУРЫ. 
																//А нам нужно именно здесь, так как дальше строися запрос, который уже будет искать в наших новых записях
   
    //  4. Проверка только что записанных данных в БД. Запрос, получающий отрицательные остатки из регистра
    Запрос.Текст =												// Обратите внимание, так как у нас есть в-первом запросе Менеджер Временных таблиц, у нас там хранятся наши товары, которые в документе
        "ВЫБРАТЬ
        |   Остатки.Номенклатура КАК Номенклатура,				//<---- лишняя строчка, так как нигде мы внизу не используем
        |   ПРЕДСТАВЛЕНИЕССЫЛКИ(Остатки.Номенклатура) КАК НоменклатураПредставление, // не забываем о представлении, так как сообщение пользователю нельзя выводить ссылку
        |   -Остатки.КоличествоОстаток КАК Дефицит									 // тут просто взяли и добавили минут, что бы в сообщении убрать минус ( так как - на - дает плюс)
        |ИЗ
        |   РегистрНакопления.СвободныеОстатки.Остатки(
        |           &МоментВремени,
        |           Номенклатура В
        |               (ВЫБРАТЬ
        |                   Товары.Номенклатура КАК Номенклатура
        |               ИЗ
        |                   Товары КАК Товары)) КАК Остатки							// а вот наша временная таблица, где находится именно тот товар, который мы прямо сейчас записали в БД, то есть мы не весь регистр перебираем, а только ту часть регистра, которая имеет такой же товар как и унас в документе.
        |ГДЕ
        |   Остатки.КоличествоОстаток < 0";
   
    ГраницаКонтроля = Новый Граница(МоментВремени(), ВидГраницы.Включая);			//обратите внимание в старой методики проходит просто МоментВремени()
    Запрос.УстановитьПараметр("МоментВремени", ГраницаКонтроля);
    РезультатЗапроса = Запрос.Выполнить();
   
    //  5.Если проверку наши данные не прошли, то мы запрещаем проводить документ и выводим сообщение пользователю. Вывод сообщений о недостатке товаров
   
 	Если Не РезультатЗапроса.Пустой() Тогда											//у нас если запрос нашел что-то отрицательной это означает, что он не пустой, а значит нам такой документ нельзя проводить
        Отказ = Истина;																// ИМЕННО эта запись ОТМЕНЯЕТ ПРОВЕДЕНИЕ ДОКУМЕНТА. ОТКАЗ - ЭТО ПАРАМЕТР ДАННОЙ ПРОЦЕДУРЫ, ОН НА САМОМ ВВЕРХУ
        ВыборкаОшибки = РезультатЗапроса.Выбрать();
        Пока ВыборкаОшибки.Следующий() Цикл
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Товара "+ВыборкаОшибки.НоменклатураПредставление+" недостаточно в количестве "+ВыборкаОшибки.Дефицит+" шт.";
            Сообщение.Сообщить();
        КонецЦикла;
    КонецЕсли;
   
КонецПроцедуры
{"contextData":{"NaN":{}},"contextMarkers":[]}

Публикация кода

Размещая информацию на сайте, Вы подтверждаете согласие со всеми пунктами Пользовательского соглашения

Замечание к коду:

  • Загрузить конфигурацию
    • ERP 2.4
    • Управление торговлей 10.3
    • Управление торговлей 11.4
    • Бухгалтерия 2.0
    • Бухгалтерия 3.0
    • ЗУП 3.1
    • Розница 2.3
    • УНФ 1.6
    • БСП 3.1
  • Тема
    • Светлая
    • Светлая c подсветкой запросов
    • Темная
    • Темная с подсветкой запросов
  • Режим запроса
  • Поделиться
Код:

© Александр Шкураев 2025