Байланысты: Сборник лабораторных работ для студентов учебных заведений (1)
«Продать товар "в минус" нельзя, то есть в момент продажи нужно проверять остаток товара». К сожалению, регистра накопления недостаточно для того, чтобы вести учет отрицательных остатков. Нужно описать алгоритм работы документа «ПродажаТоваров».
Отроем модуль объекта документа «ПродажаТоваров» и дополним процедуру «ОбработкаПроведения».
Проверять остатки товаров будем следующим образом:
1. Сделаем движение данных из документа в регистр накопления.
2. Проверим, появились ли в регистре остатки, значение которых меньше нуля (то есть отрицательные).
3. Если есть отрицательные остатки, то отменим сделанное движение в регистр накопления и выведем пользователю сообщение об ошибке.
Чтобы сделать движение данных их документа в регистр накопления, допишем после окончания цикла строку «Движения.Записать();». Метод записывает только те движения документа, у которых установлен флаг «Записывать», при этом флаг в итоге снимается, что не приводит к повторной записи движений по окончании транзакции проведения. И главное, «Движения.Записать();» всегда записывают движения в том порядке, в котором таблицы указаны в дереве метаданных, что на порядок уменьшает шансы взаимных блокировок, ведь все транзакции в одинаковом порядке блокируют таблицы.
Теперь, когда движение было сделано, можно обратиться к данным регистра накопления.
Чтобы это сделать, воспользуемся конструктором запроса с обработкой результата. Этот конструктор можно открыть из контекстного меню щелчком правой кнопки мыши по области модуля. Данный конструктор обязательно должен быть вызван внутри процедуры «ОбработкаПроведения».
Соглашаемся с созданием нового запроса. Открывается окно конструктора запроса с обработкой результата. Переходим на вкладку «Таблицы и поля».
Открывшееся окно имеет три части:
Часть слева отображает все объекты конфигурации, имеющиеся в нашей базе данных. Нужно выбрать лишь те объекты, из которых мы хотим получать данные.
Посередине находятся таблицы – это выбранные нами объекты, откуда мы хотим получать данные для конкретного запроса.
Справа поля – это те значения (поля), которые мы хотим получить.
Данные будем брать не из регистра накопления напрямую, а из виртуальной таблицы, которую создает этот регистр автоматически. Данная виртуальная таблица способна обработать основную таблицу и самостоятельно посчитать остатки товаров.
Нам нужны поля «Товар» и «КоличествоОстаток» из таблицы «ОстаткиТоваровНаСкладахОстатки».
Чтобы перенести данные из одного окна в другое, просто перетащите нужные поля с помощью мыши либо воспользуйтесь стрелочками, расположенными между окнами.
Переходим на вкладку «Условие» и добавим новое условие. Пусть в запрос попадут только данные с отрицательными остатками.
По окончании работы с данным конструктором нажимаем на кнопку «ОК».
Конструктор выдаст предупреждение об ошибке, которое следует проигнорировать. Для корректной работы запроса нужно удалить знак амперсанта (&) перед нулем в условии. Запрос должен выглядеть следующим образом:
С помощью данного запроса из базы данных можно получить отрицательные остатки по всем товарам со всех складов. Но нам нет необходимости получать такую большую выборку, нужно сузить запрос до склада, который указан в шапке документа и товаров, перечисленных в табличной части.
Откроем конструктор запроса. Для этого нужно щелкнуть в любом месте самого запроса (черный текст в двойных кавычках) правой кнопкой мыши и вызвать конструктор запроса.
Далее следует наложить условия на виртуальную таблицу регистра накопления.
Данное условие поможет ограничить запрос по складу и по тем товарам, которые находятся в табличной части документа.
Нажимаем на кнопку ОК. Текст запроса изменился:
Мы добавили параметры. Теперь запрос будет проводить поиск только по конкретному складу и конкретному списку товаров. Осталось лишь указать этот склад и товары сразу после текста запроса.
Ну, и последний шаг – выдать сообщение пользователю, если запрос вернул отрицательные остатки. В первую очередь, добавим блок условия:
Внутрь цикла можно попасть только в том случае, если запрос пришел не пустой, то есть если были найдены отрицательные остатки. В таком случае нужно отменить проведение документа и выдать пользователю сообщение. Переместим весь оставшийся код внутрь данного цикла, а также сократим название переменной «ВыборкаДетальныеЗаписи» на «Выборка» для удобства.
Код процедуры полностью должен выглядеть следующим образом:
Переходим в режим «1С:Предприятие».
Добавим новый документ «Продажа товаров» так, чтобы хотя бы одного из товаров не хватало на складе.
Если все было сделано правильно, и вы пытаетесь продать товаров больше, чем имеется на складе, то система выдаст ошибку:
«Необходимо построить отчет по остаткам товаров». Построим отчет. Для этого воспользуемся соответствующим объектом конфигурации.