Как в 1С составить запрос для получения всех оборотов по счету, отфильтрованных по наличию корреспонденции с другим счетом?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет Промышленность, строительство и АПК
← На главную

При разработке отчетов на платформе 1С:Предприятие 8 часто возникает задача специфической фильтрации данных в регистре бухгалтерии. Одной из классических проблем является вывод всех оборотов по конкретному счету (например, 08 «Вложения во внеоборотные активы»), но только для тех аналитических объектов (субконто), по которым в выбранном периоде зафиксирован оборот с определенным корреспондирующим счетом (например, 01 «Основные средства»).

Рассмотрим подробнее, почему стандартный фильтр в параметрах виртуальной таблицы здесь не подходит и как правильно выстроить логику запроса, используя пакетные запросы и временные таблицы.

Анализ проблемы: почему простой запрос не работает

Разберем типичную ошибку начинающего разработчика. Если мы укажем в параметрах виртуальной таблицы Хозрасчетный.Обороты условие КорСчет В ИЕРАРХИИ (&Счет01), система вернет нам только те записи, где в проводке напрямую участвуют счета 08 и 01. Однако задача стоит иначе: нам нужно увидеть все затраты по объекту строительства (08 счет в корреспонденции с 10, 60, 70 и т.д.), но только в том случае, если этот объект хотя бы раз «встретился» в проводке с 01 счетом (т.е. был введен в эксплуатацию).

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

Шаг 1: Создание списка целевых объектов во временной таблице

Для начала нам нужно определить список «Объектов строительства», которые удовлетворяют нашему критерию. Для этого мы создадим первый запрос в пакете, который выберет только уникальные ссылки на субконто. Выясним причину использования именно Субконто1: в типовых конфигурациях (БП 3.0, ERP) именно на этом субконто счета 08.03 ведется учет по объектам строительства.

Посмотрим на пример кода первого запроса:


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ХозрасчетныйОбороты.Субконто1 КАК ОбъектСтроительства
ПОМЕСТИТЬ ВТ_ОбъектыС01Счетом
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНачала, &ДатаОкончания, , Счет В ИЕРАРХИИ (&Счет08), , , КорСчет В ИЕРАРХИИ (&Счет01), ) КАК ХозрасчетныйОбороты
ГДЕ
    НЕ ХозрасчетныйОбороты.Субконто1 ЕСТЬ NULL
;

Важный момент: Обратите внимание на использование ВЫБРАТЬ РАЗЛИЧНЫЕ. Нам не нужны дубликаты объектов, так как эта таблица послужит лишь фильтром. Также рекомендуется добавить индексацию по полю ОбъектСтроительства, чтобы последующее соединение работало максимально быстро.

Шаг 2: Получение всех оборотов по списку объектов

Теперь, когда у нас есть «белый список» объектов во временной таблице ВТ_ОбъектыС01Счетом, мы можем извлечь все обороты по счету 08. Рассмотрим, как правильно связать данные. Существует два подхода: использование оператора В в параметрах виртуальной таблицы или ВНУТРЕННЕЕ СОЕДИНЕНИЕ.

Наиболее производительным способом в 1С считается передача фильтра в параметры виртуальной таблицы через подзапрос. Проанализируем этот метод:


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

В этом случае система на уровне СУБД сначала ограничит выборку только нужными объектами строительства, а затем выберет по ним все корреспондирующие счета (не только 01, но и 10, 60 и т.д.).

Специфика работы с субконто разных типов

В процессе обсуждения на форумах часто возникает вопрос: «Нужно ли подключать справочник Основные Средства?». Давайте разберем этот нюанс. На счете 08.03 используется справочник Объекты строительства, а на счете 01 — Основные средства. Это разные справочники.

Если вам нужно вывести в отчете инвентарный номер или другие реквизиты ОС, которое получилось в результате ввода в эксплуатацию, вам придется делать ЛЕВОЕ СОЕДИНЕНИЕ с еще одной виртуальной таблицей — ОборотыДтКт. Именно в ней можно увидеть связку: какой объект строительства (Кредит 08) превратился в какое основное средство (Дебет 01).

Пример получения связки объект-ОС:


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

Оптимизация и рекомендации

Рассмотрим несколько практических советов для повышения эффективности запроса:

  1. Использование массивов счетов: Если структура плана счетов заранее известна и не меняется динамически, лучше передавать в параметры Счет В (&МассивСчетов) вместо Счет В ИЕРАРХИИ (&СчетГруппа). Оператор В ИЕРАРХИИ создает дополнительную нагрузку на сервер БД.
  2. Порядок субконто: Всегда проверяйте, на каком месте (индексе) стоит нужное вам субконто на конкретных счетах. В запросе можно использовать ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.ОбъектыСтроительства) в параметре «УсловиеСубконто», чтобы гарантировать точность обращения.
  3. Периодичность: Если отчет должен выводить данные по дням или месяцам, не забудьте указать соответствующий параметр периодичности в виртуальной таблице Обороты, иначе вы получите одну общую сумму за весь период.
  4. Учет пустых значений: При работе с 08 счетом важно отсекать пустые субконто, так как на некоторых субсчетах аналитика может быть не обязательной, что приведет к некорректным результатам в соединении.

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

← На главную