Добавил:
sora.alai.102@gmail.com Делаю работы на заказ. Какие именно? Пишите. Или регайтесь на бирже, где я работаю: https://vsesdal.com/promo?ref=748568 Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

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

.pdf
Скачиваний:
2182
Добавлен:
25.11.2018
Размер:
31.3 Mб
Скачать

Рис. 3.28. Вывод остатков заданного товара на складах на заданный период

На этом же примере поясним ряд особенностей использования периодов и моментов времени при получении остатков.

Параметр Период виртуальной таблицы остатков может принимать значения типа Дата, МоментВремени и Граница. В рассмотренном примере (см. рис. 3.28) Период имеет тип

Дата.

При получении таблицы остатков с указанием параметра Период типа Дата необходимо учитывать, что дата в системе «1С:Предприятие» включает в свой состав время. Даже если время не указано явно, оно принимает значение 00:00:00. Таблица остатков строится на начало секунды, т. е. не включая границы заданного периода. Поэтому результат, полученный выше (см. рис. 3.28), не включает движений по регистру, сформированных документами за 03.02.2013.

Таких документов было два – Поступление товаров №5 и Поступление товаров №6.

Первым документом было зафиксировано поступление товара Клавиатура Apple Pro Keyboards на склад Главный в количестве 10. Вторым документом было зафиксировано поступление товара Клавиатура Apple Pro Keyboards на склад Склад отдела продаж в

количестве 5.

Теперь зададим значение параметра Период как Момент времени документа

Поступление товаров №6 от 03.02.2013 и посмотрим, как изменится результат (рис. 3.29).

Рис. 3.29. Вывод остатков заданного товара на складах на заданный период

Мы видим, что в результат запроса попали движения документа Поступление товаров №5, но не включены движения самого документа Поступление товаров №6.

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

Для случаев, когда необходимо получить данные об остатках, включая движения, относящиеся к дате или моменту времени, применяют значения параметра Период с типом значения Граница и видом границы Включая.

Зададим значение параметра Период как Граница на момент времени документа

Поступление товаров №6 от 03.02.2013 с видом границы Включая и посмотрим, как изменится результат (рис. 3.30).

Рис. 3.30. Вывод остатков заданного товара на складах на заданный период

Мы видим, что теперь остатки получены, включая движения указанного документа. Поскольку больше документов за 03.02.2013, влияющих на остатки товара Клавиатура Apple Pro Keyboards в информационной базе нет, то аналогичный результат можно получить, задав значение параметра Период как дату – 04.02.2013.

Пример 2

Рассмотрим еще одну тонкость, касающуюся отбора по товару при получении таблицы остатков.

Получим остатки заданного товара за весь период времени без разреза по складам

(листинг 3.24).

Листинг 3.24. Вывод остатков заданного товара за весь период

В итоге для товара Клавиатура Apple Pro Keyboards мы получим следующий результат

(рис. 3.31).

Рис. 3.31. Вывод остатков заданного товара за весь период

Если в качестве значения параметра Товар задать отсутствующий в остатке товар, например, Телефон LG W7200, то результат запроса будет пустым (рис. 3.32).

Рис. 3.32. Вывод остатков товара, которого нет в остатке

Если же из текста запроса убрать все измерения (листинг 3.25), то результат запроса для отсутствующего в остатке товара будет содержать одну строку с нулевым количеством

(рис. 3.33).

Листинг 3.25. Вывод остатков заданного товара за весь период

Рис. 3.33. Вывод остатков товара, которого нет в остатке

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

Рассмотрим следующую задачу. Предположим, необходимо выбрать только те склады, у которых нет никаких остатков по номенклатуре. Это можно сделать с помощью следующего запроса (листинг 3.26).

Листинг 3.26. Вывод складов, не имеющих остатков по номенклатуре

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

Врезультате на дату 01.02.2013 мы получим следующий результат (рис. 3.34).

Рис. 3.34. Вывод складов, не имеющих остатков по номенклатуре

Пример 3

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

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

(листинг 3.27).

Листинг 3.27. Вывод номенклатуры, которая числилась на складе в течение дня

В итоге на дату 01.03.2013 мы получим следующий результат (рис. 3.35).

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

Проверка остатков

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

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

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

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

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

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

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

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

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

РезервыНоменклатуры.

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

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

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

ВидГраницы.Включая)).

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

подробнее

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

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

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

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

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

(рис. 3.36).

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

Получение оборотов

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

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

<Имя измерения> – поле, содержащее значения измерения регистра с именем, заданным в конфигурации. Количество таких полей равно количеству измерений, определенных для регистра как объекта конфигурации; <Имя общего реквизита> – поле, содержащее значения общего реквизита с именем,

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