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