Как получить остатки в 1С с исключением или отбором по типу регистратора

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

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

Архитектурные причины ограничения платформы 1С

Разберем, почему попытка установить отбор по полю Регистратор в параметрах виртуальной таблицы Остатки() вызывает ошибку или оказывается невозможной:

  1. Устройство таблиц итогов: Виртуальная таблица Остатки() обращается к физическим таблицам итогов СУБД. Итоги хранятся строго в разрезе измерений (Измерения) регистра. Поле Регистратор является системным реквизитом таблицы движений и не входит в структуру итогов, поэтому остатки в разрезе документов платформа физически не хранит.
  2. Особенность таблицы ОстаткиИОбороты(): Использование периодичности Регистратор в виртуальной таблице остатков и оборотов также не решит задачу получения изолированного остатка по документу. В данном случае колонка начального и конечного остатка покажет полный срез остатка регистра на момент проведения документа, а не результат работы только этого документа.

Методологическая проблема отбора остатков по регистратору

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

Рассмотрим понятный пример:

  1. Документ Приход ТМЗ сформировал приход 3 единиц номенклатуры.
  2. Документ Приход ОС сформировал приход еще 3 единиц той же номенклатуры.
  3. Документ списания вывел из учета 4 единицы.

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

Технические варианты решения в запросах

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

Способ 1. Корректировка общего остатка через обороты исключаемого регистратора

Посмотрим на наиболее оптимальный технический алгоритм. Чтобы не читать всю таблицу движений за всю историю учета (что приводит к высокой нагрузке на СУБД), объединим получение актуальных итогов и расчет оборотов по исключаемому типу регистратора:

  1. Из виртуальной таблицы Остатки(&Период) извлекаем актуальный остаток на нужную дату.
  2. Из таблицы оборотов за весь период рассчитываем суммарный оборот только по исключаемым документам.
  3. Корректируем полученный остаток путем вычитания оборотов исключаемого типа регистратора из общего остатка.

Для оптимизации плана SQL-запроса при отборе по типу документа в таблице оборотов или движений рекомендуется использовать явное приведение типов с помощью функции ВЫРАЗИТЬ. Это позволяет избежать неявных соединений (LEFT JOIN) со всеми таблицами документов, входящими в составной тип Регистратор:


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

Способ 2. Учетные и архитектурные альтернативы

Разберем способы правильного оформления учета, если задачу можно решить на уровне конфигуратора или методологии:

  1. Использование аналитического измерения (Партии / Субконто): Если добавить в регистр измерение или субконто с типом Документ (например, разрез Партия или ДокументОснование), документ становится полноправным разрезом учета. В таком случае фильтрация в таблице Остатки() по значению или типу субконто выполняется штатными средствами платформы с максимальной производительностью.
  2. Разделение по счетам учета: Если разграничить учет ТМЦ и ОС на различных субсчетах плана счетов, то фильтрация остатков будет выполняться по счету учета без необходимости анализировать типы регистраторов.
← На главную