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