Файл: Хрусталева Е. Ю. Язык запросов 1С-Предприятия 8 (2013).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.03.2019

Просмотров: 51863

Скачиваний: 8727

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Рис. 3.35. Вывод номенклатуры, которая числилась на складе в течение дня (фрагмент)

Проверка остатков
Данные об остатках товаров на складах часто используются для проверки наличия
товара в требуемом количестве при проведении документов, учитывающих расход
товара. Общая методика контроля остатков при проведении документа заключается в
том, что сначала формируются и записываются движения документа в регистрах. После
этого, когда движения уже записаны, читаются остатки товаров из регистров. Если
появились отрицательные остатки, значит, такой документ не должен проводиться. Нужно
сообщить пользователю, каких товаров не хватает, и отменить проведение документа.

Обычно контроль остатков выполняется при оперативном проведении документов, но
могут быть случаи, когда нужно проконтролировать остатки товаров при проведении
документов, которым запрещено оперативное проведение. Например, в нашей
демонстрационной конфигурации существует документ ЗаказПокупателя, который
проводится неоперативно. При проведении данного документа необходимо отложить
товар в резерв (сформировать движения по регистру РезервыНоменклатуры), но при
этом выполнить контроль возможности проведения данной операции.

Отложить товар в резерв можно только в том случае, если его хватает, то есть если
достаточно свободного (незарезервированного) остатка товара на складах. То есть
остаток товара, накопленный в регистре ТоварыНаСкладах, не должен быть меньше, чем
остаток товара, накопленный в регистре РезервыНоменклатуры (с учетом резерва по
текущему документу), иначе документ ЗаказПокупателя, резервирующий товар, не
может быть проведен.

Ниже (листинг 3.28) приведен текст процедуры ОбработкаПроведения() документа
ЗаказПокупателя. Процедура приводится полностью для того, чтобы лучше был понятен
контекст применения запросов, используемых при проведении документа. Но дальше мы
подробно рассмотрим только фрагменты, выделенные жирным шрифтом, касающиеся
использования языка запросов в обработке проведения.

Листинг 3.28. Пример процедуры «ОбработкаПроведения» документа «Заказ покупателя»


background image

background image

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


background image

движений документа и в запросе к регистрам накопления для контроля свободных
(незарезервированных) остатков товаров.

Поскольку в документе может присутствовать нескольких строк с одинаковой
номенклатурой, данные табличной части группируются по полю Номенклатура, чтобы
получить суммарное Количество товара в документе.

Далее во втором запросе Запрос2 выполняется запрос к временной таблице
НоменклатураДокумента, содержащей перечень заказанных товаров, и в цикле обхода
выборки результата запроса формируются движения по регистру
РезервыНоменклатуры.

Напомним, что временная таблица, полученная при выполнении первого запроса,
становится доступной второму и третьему запросу, благодаря использованию общего
менеджера временных таблиц МенеджерВТ.

После этого в третьем запросе Запрос3 выполняется контроль достаточности свободного
(незарезервированного) остатка товаров. Для этого выполняется запрос для получения
отрицательных свободных остатков номенклатуры, содержащейся в табличной части
проводимого документа. Запрос реализован левым соединением данных временной
таблицы с данными виртуальных таблиц остатков из регистров ТоварыНаСкладах и
РезервыНоменклатуры. В результат запроса отбираются записи, в которых количество
резерва по товару в регистре РезервыНоменклатуры превосходит его остаток в
регистре ТоварыНаСкладах.

Поскольку документу запрещено оперативное проведение (свойство документа
Оперативное проведение установлено в значение Запретить), остатки номенклатуры
нужно контролировать на момент времени документа, включая движения самого
документа. Поэтому в качестве параметра Период при установке параметра запроса в
виртуальные таблицы остатков передается значение момента времени документа,
включая движения самого документа (Новый Граница(МоментВремени(),
ВидГраницы.Включая)).

Обратите внимание, что виртуальные таблицы остатков получены с применением отбора
к исходным записям регистров накопления по тем номенклатурным позициям, которые
входят в состав проводимого документа. Как уже говорилось, это повышает
быстродействие и эффективность выполнения запроса за счет ограничения объема
расчета остатков на этапе построения виртуальной таблицы.

подробнее

Раздел «

Использовать параметры виртуальных таблиц

».

Поскольку может иметь место ситуация, когда данные по неким номенклатурным
позициям в регистре отсутствуют, то для выходных полей запроса КоличествоОстаток
применена функция ЕСТЬNULL() для преобразования возможных Null значений в


background image

числовое значение 0. Это сделано для того, чтобы впоследствии выполнять
арифметические действия с данными результата запроса, так как иначе они окажутся
непригодными для подобных действий.

После этого выборка записей запроса обходится в цикле, и если есть такие записи, в
которых количество резерва по товару в регистре РезервыНоменклатуры превосходит
его остаток в регистре ТоварыНаСкладах, сообщение о них выводится пользователю. В
этом случае параметр Отказ процедуры обработчика события получает значение
Истина, что приведет к откату транзакции записи документа с проведением.

Для вывода пользователю информации о нехватке товаров в запросе получается
представление номенклатуры, и именно это представление показывается пользователю
(рис. 3.36).

Рис. 3.36. Информация о нехватке товаров при их резервировании

Получение оборотов
Задачи получения итогов оборотов могут решаться и для регистров накопления остатков,
и для оборотных регистров. Для получения данных по оборотам из регистра накопления
запросом используется виртуальная таблица оборотов Обороты(). Ее данные
представляют собой обороты ресурсов в разрезе измерений. Обороты ресурсов
получаются только по активным записям.

Виртуальная таблица Обороты имеет следующий состав полей:

<Имя измерения> – поле, содержащее значения измерения регистра с именем,
заданным в конфигурации. Количество таких полей равно количеству измерений,
определенных для регистра как объекта конфигурации;
<Имя общего реквизита> – поле, содержащее значения общего реквизита с именем,
заданным в конфигурации. Такие поля создаются для общих реквизитов, являющихся
разделителями (режим разделения данных – Разделять), с режимом использования
разделяемых данных НезависимоИСовместно, в которых участвует данный регистр;
<Имя ресурса>Оборот – поле, содержащее обороты ресурса регистра с именем,
заданным в конфигурации. Количество таких полей равно количеству ресурсов,
определенных для регистра как объекта конфигурации. Имена полей соответствуют
именам ресурсов, как они заданы в конфигураторе, с добавлением слова Оборот.
Для регистров оборотов оборот подсчитывается как сумма всех движений. Для
регистров остатков оборот подсчитывается как сумма всех движений Приход со
знаком «+» (плюс) и Расход со знаком «-» (минус);