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