Как получить остатки номенклатуры по партиям и документам поступления в 1С 7.7?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

При разработке отчетов и обработок в платформе 1С 7.7 (в частности, в конфигурациях «Торговля и Склад» или «Комплексная конфигурация») часто возникает необходимость получить не просто общее суммарное количество товара на складе, а подробный остаток в разрезе приходных документов или конкретных партий. Рассмотрим, как правильно составить запрос к регистру остатков и какие нюансы платформы необходимо учитывать.

Разбор логики партионного учета

Для хранения партионных остатков ТМЦ в типовых конфигурациях 1С 7.7 используется регистр остатков ПартииНаличие. В его измерениях хранятся ссылки на фирму, номенклатуру, место хранения (МОЛ/склад) и элемент справочника Партии.

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

Частая ошибка разработчиков заключается в попытке наложить фильтр по документам движения за определенный период. В этом случае документы поступления, сформировавшие остаток за пределами выбранного интервала времени, не попадают в результат. Чтобы получить корректный остаток на фиксированную дату, требуется запрашивать остатки на эту дату (конечный остаток), используя корректные группировки.

Формирование запроса к регистру «ПартииНаличие»

Рассмотрим по шагам написание текста запроса 1С 7.7, который выбирает конечные остатки товаров в разрезе организаций, складов и конкретных партий (приходных документов).


ТекстЗапросаХранение = "
|Период С КонДата По КонДата;     
|Фирма        = Регистр.ПартииНаличие.Фирма;             
|Номенклатура = Регистр.ПартииНаличие.Номенклатура;
|Поставщик    = Регистр.ПартииНаличие.Номенклатура.Поставщик;
|Количество   = Регистр.ПартииНаличие.Количество;
|СкладЗ       = Регистр.ПартииНаличие.МОЛ;
|ДатаПартииЗ  = Регистр.ПартииНаличие.ДатаПартии;
|ЦенаПартииЗ  = Регистр.ПартииНаличие.СуммаРуб;
|ПартияЗ      = Регистр.ПартииНаличие.Партия;
|Функция КоличествоКонОст = КонОст(Количество);
|Группировка Номенклатура Без Групп;
|Группировка ПартияЗ;
|Условие (Фирма в ВбрФирма);    
|";

Разберем детали этого запроса:

  1. Конструкция Период С КонДата По КонДата; устанавливает расчет остатков на конец указанной даты.
  2. Поле ПартияЗ ссылается на измерение регистра Партия. Добавление оператора Группировка ПартияЗ; детализирует остаток номенклатуры до конкретных приходных партий.
  3. Агрегатная функция КонОст(Количество) вычисляет конечный остаток по каждой партии на момент окончания периода.
  4. Обращаясь в цикле обхода результатов запроса к свойству Запрос.ПартияЗ.ДокПоступления, можно получить непосредственную ссылку на первичный документ поступления товара.

Альтернативный способ получения остатков через объектную технику

Помимо использования текста запроса, в 1С 7.7 получить партионные остатки можно с помощью методов объекта регистра и таблицы значений. Этот вариант удобен при написании сервисных обработок.

Рассмотрим следующий алгоритм:

  1. Создаем объект регистра с помощью функции СоздатьОбъект("Регистр.ПартииНаличие").
  2. Включаем режим временного расчета методом ВременныйРасчет(1).
  3. Выполняем расчет итогов на нужную дату с помощью процедуры РассчитатьРегистрыНа(ВыбраннаяДата).
  4. Выгружаем полученные итоги в таблицу значений через метод ВыгрузитьИтоги(ТЗ, 1, 1).
  5. При необходимости применяем к полученной таблице значений методы свёртки и фильтрации по полям Фирма, МОЛ, Номенклатура и Партия.

Обратите внимание: прямое использование метода Регистр.ПартииНаличие.Остаток(...) в 1С 7.7 требует последовательной передачи всех измерений регистра. Если пропустить промежуточное измерение (например, не передать конкретную партию), корректный срез получить не удастся, поэтому предпочтительными остаются способы с текстом запроса или выгрузкой итогов.

Особенности и ограничения партионного учета

При реализации выгрузки остатков в разрезе документов обратим внимание на важные особенности настройки системы:

1. Настройки стратегии списания партий. Разрез по документам поступления присутствует и актуален только при включенном партионном учете (методы FIFO, LIFO или по партиям). Если в константах или настройках учетной политики базы выбран способ оценки ТМЦ «по средней», партии в регистре не детализируются по отдельным документам поступления или рассчитываются суммарно.

2. Производительность запросов. Избегайте лишних обращений через точку к реквизитам справочников внутри блока Условие или при объявлении переменных запроса (например, Регистр.ПартииНаличие.Номенклатура.Поставщик), если база работает в файловом режиме (DBF). Это может вызывать существенное замедление работы.

3. Точность расчета на момент времени. Если требуется сформировать остатки по партиям не на конец дня, а на конкретную позицию документа внутри дня, в условии периода передается позиция документа: Период С ПозДока По ПозДока;.

← На главную