В режиме "Конфигуратор"
страницаВ режиме «Конфигуратор»
Сделаем заготовку. После цикла обхода результата запроса и перед концом процедуры напишем следующие строки (листинг 14.35).
Листинг 14.35. Фрагмент процедуры «ОбработкаПроведения()»
…
КонецЦикла;
Движения.Записать();
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
// Проверить отрицательные остатки
КонецЕсли;
КонецПроцедуры
Сначала мы записываем движения в регистры.
Затем определяем режим проведения документа. При выполнении процедуры ОбработкаПроведения() вторым параметром (Режим) в нее передается режим проведения документа, и значение этой переменной сравнивается со значением системного перечисления РежимПроведенияДокумента. В случае оперативного проведения мы будем выполнять контроль остатков.
Теперь сделаем заготовку запроса для проверки отрицательных остатков.
Так как нам придется снова получать остатки только для той номенклатуры, которая в документе, укажем, что этот запрос будет использовать тот же самый менеджер временных таблиц МенеджерВТ (листинг 14.36).
Листинг 14.36. Фрагмент процедуры «ОбработкаПроведения()»
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
// Проверить отрицательные остатки
Запрос3 = Новый Запрос;
Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос3.Текст = "";
КонецЕсли;
Установим курсор внутрь кавычек и вызовем конструктор запроса. Подтвердим создание нового запроса.
Выберем таблицу ОстаткиМатериалов.Остатки и из нее два поля: Материал и КоличествоОстаток.
Зададим параметры этой таблицы. В параметре Условие напишем:
Листинг 14.37. Условие виртуальной таблицы
Материал В (
ВЫБРАТЬ
НоменклатураДокумента.Номенклатура
ИЗ
НоменклатураДокумента)
И Склад = &Склад
То есть мы получаем итоги только для той номенклатуры, которая содержится в нашей временной таблице, и только по складу, который указан в документе.
Затем на закладке Условия перенесем в список условий поле КоличествоОстаток, установим флажок Произвольное и укажем, что нас интересуют только отрицательные остатки (листинг 14.38).
Листинг 14.38. Условие запроса
ОстаткиМатериаловОстатки.КоличествоОстаток < 0
Нажмем ОК. Текст запроса будет выглядеть следующим образом (листинг 14.39).
Листинг 14.39. Текст запроса
// Проверить отрицательные остатки
Запрос3 = Новый Запрос;
Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос3.Текст = "
|ВЫБРАТЬ
| ОстаткиМатериаловОстатки.Материал КАК Материал,
| ОстаткиМатериаловОстатки.КоличествоОстаток КАК КоличествоОстаток
|ИЗ
| РегистрНакопления.ОстаткиМатериалов.Остатки( , Материал В (
| ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура
| ИЗ
| НоменклатураДокумента)
| И Склад = &Склад) КАК ОстаткиМатериаловОстатки
|ГДЕ
| ОстаткиМатериаловОстатки.КоличествоОстаток < 0";
Теперь осталось только установить параметр запроса, обойти результат запроса и вывести сообщения об отрицательных остатках (листинг 14.40).
Листинг 14.40. Фрагмент процедуры «ОбработкаПроведения()»
// Проверить отрицательные остатки
Запрос3 = Новый Запрос;
Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос3.Текст = "
|ВЫБРАТЬ
| ОстаткиМатериаловОстатки.Материал,
…
|ГДЕ
| ОстаткиМатериаловОстатки.КоличествоОстаток < 0";
Запрос3.УстановитьПараметр("Склад", Склад);
РезультатЗапроса = Запрос3.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Не хватает " + Строка(- ВыборкаДетальныеЗаписи.КоличествоОстаток) + " единиц материала """ + ВыборкаДетальныеЗаписи.Материал + """";
Сообщение.Сообщить();
Отказ = Истина;
КонецЦикла;
Кратко поясним добавленный текст.
При выполнении проверки в запрос в параметре Склад передается склад, указанный в документе.
Затем выполняется запрос для получения отрицательных остатков номенклатуры, содержащейся во временной таблице и на складе, указанном в параметре Склад.
После этого выборка записей запроса обходится в цикле, и, если есть такие записи, они выводятся в сообщениях пользователю.
При этом параметру Отказ процедуры проведения документа присваивается значение Истина, то есть документ не проводится, начатая транзакция отменяется, и состояние данных, измененных в процессе проведения, возвращается в исходное, до начала проведения документа.