При работе с бухгалтерскими регистрами в «1С:Предприятие 8» (особенно в конфигурациях на базе обычных форм, таких как УПП 1.3) программисты часто сталкиваются с задачей: нужно получить обороты по счетам, но ограничить выборку только теми документами, у которых заполнен определенный реквизит (например, Проект, Подразделение или Сделка), при этом сам реквизит не является измерением регистра. Рассмотрим, как правильно решить эту задачу, избежав типичных ошибок производительности.
Виртуальная таблица РегистрБухгалтерии.Хозрасчетный.Обороты по умолчанию предоставляет агрегированные данные (итоги). В ней нет поля Регистратор, так как данные могут быть сгруппированы за период (месяц, год). Следовательно, мы не можем напрямую обратиться через точку к реквизиту документа, который сделал проводку. Чтобы решить эту задачу, нам необходимо «спуститься» до уровня конкретных записей регистра.
Для того чтобы в виртуальной таблице появилось поле Регистратор, необходимо указать соответствующую периодичность в параметрах таблицы. Разберем синтаксис:
РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНач, &ДатаКон, Регистратор, ...)
Третий параметр — Периодичность. Установив значение Регистратор, мы указываем системе, что хотим видеть детальные записи по каждому документу. Важный нюанс: использование этой периодичности заставляет платформу игнорировать предварительно рассчитанные итоги и обращаться к физическим таблицам движений, что может замедлить выполнение запроса на больших объемах данных.
Поскольку реквизит Проект в документах типа «Платежное поручение» часто находится в табличной части (например, «Расшифровка платежа»), прямое соединение может привести к дублированию сумм. Проанализируем ситуацию: если в одном документе две строки в табличной части с одним и тем же проектом, простое соединение удвоит оборот по этому регистратору.
Для корректной фильтрации сначала соберем уникальные ссылки на документы, подходящие под наш критерий, во временную таблицу. Используем ключевое слово РАЗЛИЧНЫЕ.
ВЫБРАТЬ РАЗЛИЧНЫЕ
Платежка.Ссылка КАК Ссылка
ПОМЕСТИТЬ втДокументыСПроектом
ИЗ
Документ.ПлатежноеПоручениеИсходящее.РасшифровкаПлатежа КАК Платежка
ГДЕ
Платежка.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
И Платежка.Проект = &Проект
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ РАЗЛИЧНЫЕ
ПлатежкаВх.Ссылка
ИЗ
Документ.ПлатежноеПоручениеВходящее.РасшифровкаПлатежа КАК ПлатежкаВх
ГДЕ
ПлатежкаВх.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ПлатежкаВх.Проект = &Проект
;
В этом блоке кода мы создаем список документов. Обратите внимание, что мы используем ОБЪЕДИНИТЬ ВСЕ для объединения результатов по разным типам документов, предварительно отобрав РАЗЛИЧНЫЕ ссылки внутри каждого запроса. Это гарантирует, что один регистратор встретится в таблице втДокументыСПроектом только один раз.
Теперь, когда у нас есть список «правильных» документов, мы можем соединить его с виртуальной таблицей оборотов. Выясним причину выбора ВНУТРЕННЕГО СОЕДИНЕНИЯ: нам нужны только те строки из регистра, которые имеют соответствие в нашем списке документов.
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Обороты.Счет КАК Счет,
Обороты.Субконто1 КАК Субконто,
Обороты.КорСчет КАК КорСчет,
Обороты.СуммаОборотДт КАК СуммаОборотДт,
Обороты.СуммаОборотКт КАК СуммаОборотКт
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(
&ДатаНач,
&ДатаКон,
Регистратор,
Счет В ИЕРАРХИИ(&Счет),
,
Организация = &Организация,
,
) КАК Обороты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ втДокументыСПроектом КАК втДокументы
ПО Обороты.Регистратор = втДокументы.Ссылка
ИТОГИ
СУММА(СуммаОборотДт),
СУММА(СуммаОборотКт)
ПО
Счет ТОЛЬКО ИЕРАРХИЯ,
Субконто ТОЛЬКО ИЕРАРХИЯ
Рассмотрим несколько профессиональных советов, которые помогут сделать отчет стабильнее:
Проект в табличных частях документов в типовой УПП часто не индексировано. Если документов очень много, первый запрос будет работать медленно. Рекомендуется проверить наличие индекса или использовать механизм Дополнительных сведений, если это возможно.РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто. Там поле Регистратор доступно сразу, но группировку сумм по Дт/Кт придется делать вручную с помощью конструкции ВЫБОР КОГДА ... ТОГДА.ВНУТРЕННЕГО СОЕДИНЕНИЯ можно использовать условие ГДЕ Обороты.Регистратор В (ВЫБРАТЬ Ссылка ИЗ втДокументыСПроектом). На современных версиях SQL Server оптимизатор запросов часто отрабатывает такой вариант идентично соединению, но использование временных таблиц в 1С считается более надежным способом контроля плана запроса.Операция (бухгалтерский и налоговый учет) или Корректировка записей регистров. Если проект указан там, ваш запрос должен уметь обрабатывать и эти типы документов, иначе данные будут неполными.Таким образом, мы проанализировали механизм работы с виртуальными таблицами оборотов и научились накладывать фильтры по аналитике, не входящей в состав измерений регистра. Главное — помнить про периодичность Регистратор и обязательное использование временных таблиц для фильтрации во избежание «раздувания» итоговых сумм.