Как в запросе 1С объединить два разных вида субконто в одну колонку для группировки

Программист 1C:Бухгалтерия Бухгалтерский учет
← На главную

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

Анализ проблемы: почему нельзя просто выбрать Субконто3

В регистре бухгалтерии 1С субконто хранятся в пронумерованных полях: Субконто1, Субконто2, Субконто3. Однако индекс субконто (его номер) на разных счетах может отличаться. Если мы просто выберем поле Субконто3, мы рискуем получить «кашу» из разнородных данных или пустые значения, так как на одном счете третья аналитика может быть включена, а на другом — нет.

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

Способ 1. Использование объединения запросов (UNION ALL)

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

Проанализируем пример кода, в котором мы объединяем данные по разным видам субконто в одну колонку ВидСтатьиИВидОплаты:


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

ОБЪЕДИНИТЬ ВСЕ

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

Важные моменты реализации:

  1. Параметры виртуальной таблицы: Обратите внимание на параметр &ВидыСубконто. Если мы передаем в него массив с конкретными видами субконто, 1С гарантирует, что в поле Субконто1 попадет первый элемент массива, в Субконто2 — второй и так далее. Это позволяет нам «выровнять» аналитику, даже если в плане счетов она стоит на разных позициях.
  2. Псевдонимы полей: Чтобы объединение сработало корректно, имена колонок в первом запросе должны совпадать с именами во втором. Мы используем ВидСтатьиИВидОплаты как общий контейнер.
  3. Фильтрация счетов: В каждой части объединения мы указываем свой список счетов (&Счета1 и &Счета2), для которых актуален тот или иной вид аналитики.

Способ 2. Динамическое определение типа через ВЫБОР КОГДА

Если количество данных не слишком велико, или нам нужно обработать ситуацию в рамках одного счета, мы можем воспользоваться оператором ВЫБОР. Рассмотрим ситуацию, когда нам нужно проверить, заполнено ли субконто определенного типа.

Проанализируем следующий фрагмент логики в запросе:


ВЫБРАТЬ
    ВЫБОР
        КОГДА ТИПЗНАЧЕНИЯ(Выплаты.Субконто3) = ТИП(Справочник.СтатьиДвиженияДенежныхСредств)
            ТОГДА Выплаты.Субконто3
        КОГДА ТИПЗНАЧЕНИЯ(Выплаты.Субконто3) = ТИП(Справочник.ВидыОплат)
            ТОГДА Выплаты.Субконто3
        ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СтатьиДвиженияДенежныхСредств.ПустаяСсылка)
    КОНЕЦ КАК ОбщаяАналитика,
    Выплаты.СуммаОборот КАК Сумма
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(...) КАК Выплаты

Этот метод позволяет собрать значения разных типов в одну колонку, но он имеет существенный недостаток: результат будет иметь составной тип данных. При выводе в отчет это может привести к сложностям с иерархией и группировками. Поэтому первый способ с ОБЪЕДИНИТЬ ВСЕ считается более предпочтительным для профессиональной разработки.

Особенности работы с итогами и группировками

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

Выполним следующие шаги:

  1. Создадим временную таблицу ВТ_Данные, куда поместим результаты всех объединений.
  2. В основном запросе обратимся к этой временной таблице.
  3. Применим секцию СГРУППИРОВАТЬ ПО или ИТОГИ.

ВЫБРАТЬ
    Выплаты.Категория КАК Категория,
    Выплаты.ВидСтатьиИВидПлатежа КАК ВидСтатьиИВидПлатежа,
    СУММА(Выплаты.ОплМАР) КАК ОплМАР
ИЗ
    Выплаты КАК Выплаты
СГРУППИРОВАТЬ ПО
    Выплаты.Категория,
    Выплаты.ВидСтатьиИВидПлатежа
ИТОГИ
    СУММА(ОплМАР)
ПО
    ОБЩИЕ,
    Категория ИЕРАРХИЯ,
    ВидСтатьиИВидПлатежа

Рекомендации по оптимизации

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

Во-первых, всегда используйте параметры виртуальных таблиц (период, счет, условие) вместо секции ГДЕ в конце запроса. Это позволяет серверу СУБД отсечь ненужные записи на этапе формирования выборки.

Во-вторых, если вы используете механизм Система Компоновки Данных (СКД), то задача объединения субконто может быть решена еще проще. В СКД можно использовать виртуальные поля вида Субконто[ИмяВидаСубконто]. Система сама проанализирует метаданные и «подтянет» значение из нужного индекса (1, 2 или 3) в зависимости от настроек счета.

В-третьих, следите за тем, чтобы в объединяемых запросах типы данных в колонках были совместимы. Если в одной части Субконто3 — это справочник, а в другой оно пустое (NULL), лучше явно привести его к пустой ссылке нужного типа с помощью функции ЕСТЬNULL(Субконто3, ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка)). Это избавит вас от проблем с отображением пустых строк в группировках отчета.

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

← На главную