644 документа
← К списку

В режиме "Конфигуратор"

страница

В режиме «Конфигуратор»

Сделаем заготовку. После цикла обхода результата запроса и перед концом процедуры напишем следующие строки (листинг 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.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

Сообщение = Новый СообщениеПользователю();

Сообщение.Текст = "Не хватает " + Строка(- ВыборкаДетальныеЗаписи.КоличествоОстаток) + " единиц материала """ + ВыборкаДетальныеЗаписи.Материал + """";

Сообщение.Сообщить();

Отказ = Истина;

КонецЦикла;

Кратко поясним добавленный текст.

При выполнении проверки в запрос в параметре Склад передается склад, указанный в документе.

Затем выполняется запрос для получения отрицательных остатков номенклатуры, содержащейся во временной таблице и на складе, указанном в параметре Склад.

После этого выборка записей запроса обходится в цикле, и, если есть такие записи, они выводятся в сообщениях пользователю.

При этом параметру Отказ процедуры проведения документа присваивается значение Истина, то есть документ не проводится, начатая транзакция отменяется, и состояние данных, измененных в процессе проведения, возвращается в исходное, до начала проведения документа.