Как заменить значение субконто на произвольный текст и настроить выбор оборотов по типу счета в отчетах СКД

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

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

Решение задачи по подмене текста в поле Субконто

Рассмотрим ситуацию, когда вместо стандартного представления документа или значения аналитики в колонке «Субконто» нам необходимо вывести текст «Возврат проданной продукции». Это часто требуется для упрощения восприятия отчета бухгалтером. Самый простой и эффективный способ — использование конструкции ВЫБОР непосредственно в тексте запроса набора данных СКД.

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


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

В данном примере мы используем функцию ТипЗначения(), которая позволяет определить, каким именно документом была сделана запись. Если условие выполняется, поле Субконто1 принимает строковое значение. Важный нюанс: при такой подмене поле теряет тип «Ссылка», и пользователь не сможет расшифровать его (открыть документ нажатием), так как теперь это просто строка. Если вам нужно сохранить возможность расшифровки, рекомендуется использовать «Выражение представления» в настройках поля на закладке «Наборы данных» в СКД.

Исключение пустых значений и регламентных операций

Часто программисты сталкиваются с тем, что в отчет попадают записи, где Субконто1 пустое, например, при выполнении регламентной операции «Закрытие месяца». Чтобы отчет выглядел чисто, нам нужно отсечь такие данные. Проанализируем ситуацию: если мы видим пустые строки, нам необходимо либо добавить условие в параметры виртуальной таблицы, либо обработать NULL и Неопределено в запросе.

Выясним причину появления пустых строк: они возникают, когда на счете не ведется аналитика по данному субконто или документ-регистратор не заполняет эти измерения. Чтобы этого избежать, добавим фильтр:


ГДЕ
    НЕ ХозрасчетныйОбороты.Субконто1 ЕСТЬ NULL
    И ХозрасчетныйОбороты.Субконто1 <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

Автоматический выбор суммы (Дебет или Кредит) по виду счета

Вторая важная задача — корректное отображение суммы оборота. В бухгалтерском учете логика получения итогового значения зависит от типа счета. Для активных счетов нас обычно интересует СуммаОборотДт, а для пассивных — СуммаОборотКт. Чтобы автоматизировать этот процесс, мы можем заранее получить информацию о виде счета из плана счетов.

Рассмотрим по шагам, как это реализовать через временную таблицу:

  1. Создаем временную таблицу ВТ_Счета, куда выбираем необходимые счета и их вид (Активный, Пассивный или Активно-Пассивный).
  2. Соединяем эту таблицу с виртуальной таблицей оборотов регистра бухгалтерии.
  3. Используем условие для выбора нужного ресурса.

// Шаг 1: Получаем свойства счетов
ВЫБРАТЬ
    Хозрасчетный.Ссылка КАК Счет,
    Хозрасчетный.Вид КАК ВидСчета
ПОМЕСТИТЬ ВТ_Счета
ИЗ
    ПланСчетов.Хозрасчетный КАК Хозрасчетный
ГДЕ
    Хозрасчетный.Ссылка В ИЕРАРХИИ(&МассивСчетов);

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

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


ВЫБОР
    КОГДА ХозрасчетныйОбороты.Счет.Код ПОДОБНО "60%" 
        ТОГДА ХозрасчетныйОбороты.СуммаОборотКт
    ИНАЧЕ ХозрасчетныйОбороты.СуммаОборотДт
КОНЕЦ КАК СуммаОборот

Особенности работы с полями составного типа в СКД

Нужно помнить, что поле Субконто1 имеет составной тип данных. Когда мы в запросе пишем ТОГДА "Текст" ИНАЧЕ ХозрасчетныйОбороты.Субконто1, система 1С приводит всё поле к составному типу, включающему строку и все возможные ссылки субконто. В СКД это может привести к тому, что группировки будут работать медленнее.

Рекомендация: Если вы точно знаете, что в Субконто1 в данном контексте всегда лежит ссылка на конкретный справочник (например, НоменклатурныеГруппы), лучше явно использовать функцию ВЫРАЗИТЬ(). Это оптимизирует работу SQL-запроса и поможет избежать ошибок при выводе данных.

Рассмотрим пример с типизацией:

ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто1 КАК Справочник.НоменклатурныеГруппы)

Подводя итог, можно сказать, что гибкость СКД позволяет решать практически любые задачи по трансформации данных «на лету». Главное — соблюдать баланс между удобством представления для пользователя (строковые замены) и сохранением типизации данных для корректной работы системы.

← На главную