Как получить остатки товаров на складе на момент времени конкретного документа?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Часто в процессе разработки отчетов по складскому учету возникает задача: необходимо проанализировать состояние запасов не на конец дня или фиксированную дату, а строго на момент времени выполнения конкретной операции (например, документа РеализацияТоваровУслуг). В этой статье мы подробно разберем, как реализовать такой механизм в 1С, избегая при этом проблем с производительностью и сложных переборов данных в циклах.

Использование виртуальной таблицы ОстаткиИОбороты с периодичностью Регистратор

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

Для того чтобы воспользоваться этим методом, выполним следующие действия:

  1. В конструкторе запросов выберем виртуальную таблицу регистра накопления ОстаткиИОбороты.
  2. В настройках параметров виртуальной таблицы укажем периодичность — Регистратор.
  3. В параметрах Условие добавим фильтры по Складу и Номенклатуре, чтобы минимизировать объем обрабатываемых данных.
  4. При выводе данных в отчете мы получим остатки, зафиксированные именно в момент проведения документа-регистратора.

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

Реализация через соединение таблиц по моменту времени

В случаях, когда необходимо сопоставить данные из разных источников (например, документы с одного склада и остатки на другом), можно применить алгоритм соединения по МоментуВремени. Это критически важно, так как МоментВремени в 1С — это уникальный идентификатор, учитывающий не только дату, но и последовательность проведения документов.

Рассмотрим структуру такого запроса:


ВЫБРАТЬ
    ОстаткиСклад1.Номенклатура,
    МАКСИМУМ(ОстаткиСклад2.Регистратор.МоментВремени) КАК МоментВремени
ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&Начало, &Конец, Регистратор, , ) КАК ОстаткиСклад2
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДокументыРеализации КАК ОстаткиСклад1
    ПО ОстаткиСклад1.Номенклатура = ОстаткиСклад2.Номенклатура
    И ОстаткиСклад1.МоментВремени <= ОстаткиСклад2.Регистратор.МоментВремени
СГРУППИРОВАТЬ ПО
    ОстаткиСклад1.Номенклатура, ОстаткиСклад1.МоментВремени

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

Применение СКД для автоматизации расчетов

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

Разберем этапы настройки:

Использование СКД предпочтительнее, так как система самостоятельно строит оптимальный план запроса. Однако помните о важности индексирования: всегда ограничивайте выборку по Номенклатуре. Если попытаться «прогнать» через расчеты весь регистр накопления без отборов, отчет будет формироваться крайне медленно.

Важные рекомендации по производительности

При работе с остатками «на момент времени» важно учитывать следующие нюансы:

  1. Избегайте избыточных данных: Всегда используйте фильтры по номенклатуре и складу. Чем меньше записей участвует в соединении, тем быстрее работает база данных.
  2. Используйте МоментВремени: Никогда не полагайтесь на простую Дату. Документы могут иметь одинаковое время (до секунды), и их порядок в базе определяется именно объектом МоментВремени.
  3. Индексация: Если вы используете временные таблицы для хранения списка документов для анализа, убедитесь, что они созданы с правильными индексами по полям, участвующим в соединении (Номенклатура, МоментВремени).

Надеемся, эти методы помогут вам реализовать качественный и быстрый отчет для анализа остатков на ваших складах. Практикуйтесь с использованием ОстаткиИОбороты и СКД — это золотой стандарт разработки в 1С!

← На главную