При разработке отчетов на базе Системы компоновки данных (СКД) часто возникают задачи по кастомизации вывода данных. Типовой вывод названий документов или номенклатуры не всегда информативен для конечного пользователя. В этой статье мы разберем, как подменить стандартное значение Субконто на произвольную строку при выполнении определенных условий, а также рассмотрим механизм корректного получения сумм в зависимости от того, является ли счет активным или пассивным.
Рассмотрим ситуацию, когда вместо стандартного представления документа или значения аналитики в колонке «Субконто» нам необходимо вывести текст «Возврат проданной продукции». Это часто требуется для упрощения восприятия отчета бухгалтером. Самый простой и эффективный способ — использование конструкции ВЫБОР непосредственно в тексте запроса набора данных СКД.
Проанализируем пример кода, который позволяет проверить тип регистратора и вывести нужную нам строку:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ХозрасчетныйОбороты.ПериодМесяц КАК ПериодМесяц,
ХозрасчетныйОбороты.Организация КАК Организация,
ВЫБОР
КОГДА ТипЗначения(ХозрасчетныйОбороты.Регистратор) = Тип("Документ.ВозвратТалоновОтПокупателя")
ТОГДА "Возврат проданной продукции"
ИНАЧЕ ХозрасчетныйОбороты.Субконто1
КОНЕЦ КАК Субконто1,
ХозрасчетныйОбороты.СуммаОборотДт КАК Сумма
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Авто, Счет В ИЕРАРХИИ (&МассивСчетов), , , , ) КАК ХозрасчетныйОбороты
В данном примере мы используем функцию ТипЗначения(), которая позволяет определить, каким именно документом была сделана запись. Если условие выполняется, поле Субконто1 принимает строковое значение. Важный нюанс: при такой подмене поле теряет тип «Ссылка», и пользователь не сможет расшифровать его (открыть документ нажатием), так как теперь это просто строка. Если вам нужно сохранить возможность расшифровки, рекомендуется использовать «Выражение представления» в настройках поля на закладке «Наборы данных» в СКД.
Часто программисты сталкиваются с тем, что в отчет попадают записи, где Субконто1 пустое, например, при выполнении регламентной операции «Закрытие месяца». Чтобы отчет выглядел чисто, нам нужно отсечь такие данные. Проанализируем ситуацию: если мы видим пустые строки, нам необходимо либо добавить условие в параметры виртуальной таблицы, либо обработать NULL и Неопределено в запросе.
Выясним причину появления пустых строк: они возникают, когда на счете не ведется аналитика по данному субконто или документ-регистратор не заполняет эти измерения. Чтобы этого избежать, добавим фильтр:
ГДЕ
НЕ ХозрасчетныйОбороты.Субконто1 ЕСТЬ NULL
И ХозрасчетныйОбороты.Субконто1 <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
Вторая важная задача — корректное отображение суммы оборота. В бухгалтерском учете логика получения итогового значения зависит от типа счета. Для активных счетов нас обычно интересует СуммаОборотДт, а для пассивных — СуммаОборотКт. Чтобы автоматизировать этот процесс, мы можем заранее получить информацию о виде счета из плана счетов.
Рассмотрим по шагам, как это реализовать через временную таблицу:
ВТ_Счета, куда выбираем необходимые счета и их вид (Активный, Пассивный или Активно-Пассивный).
// Шаг 1: Получаем свойства счетов
ВЫБРАТЬ
Хозрасчетный.Ссылка КАК Счет,
Хозрасчетный.Вид КАК ВидСчета
ПОМЕСТИТЬ ВТ_Счета
ИЗ
ПланСчетов.Хозрасчетный КАК Хозрасчетный
ГДЕ
Хозрасчетный.Ссылка В ИЕРАРХИИ(&МассивСчетов);
// Шаг 2: Выбираем данные с проверкой вида счета
ВЫБРАТЬ
ХозрасчетныйОбороты.Счет,
ВЫБОР
КОГДА ВТ_Счета.ВидСчета = ЗНАЧЕНИЕ(ВидСчета.Пассивный)
ТОГДА ХозрасчетныйОбороты.СуммаОборотКт
ИНАЧЕ ХозрасчетныйОбороты.СуммаОборотДт
КОНЕЦ КАК ИтоговаяСумма
ИЗ
ВТ_Счета КАК ВТ_Счета
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Обороты(&Начало, &Конец, , , , , , ) КАК ХозрасчетныйОбороты
ПО ВТ_Счета.Счет = ХозрасчетныйОбороты.Счет
Такой подход гарантирует, что для пассивных счетов (например, расчеты с поставщиками 60.01 в части кредитового оборота) и активных счетов (например, касса 50.01) данные будут выбраны корректно. Если же вы работаете с конкретным списком счетов, можно использовать упрощенную проверку по коду счета, как показано ниже:
ВЫБОР
КОГДА ХозрасчетныйОбороты.Счет.Код ПОДОБНО "60%"
ТОГДА ХозрасчетныйОбороты.СуммаОборотКт
ИНАЧЕ ХозрасчетныйОбороты.СуммаОборотДт
КОНЕЦ КАК СуммаОборот
Нужно помнить, что поле Субконто1 имеет составной тип данных. Когда мы в запросе пишем ТОГДА "Текст" ИНАЧЕ ХозрасчетныйОбороты.Субконто1, система 1С приводит всё поле к составному типу, включающему строку и все возможные ссылки субконто. В СКД это может привести к тому, что группировки будут работать медленнее.
Рекомендация: Если вы точно знаете, что в Субконто1 в данном контексте всегда лежит ссылка на конкретный справочник (например, НоменклатурныеГруппы), лучше явно использовать функцию ВЫРАЗИТЬ(). Это оптимизирует работу SQL-запроса и поможет избежать ошибок при выводе данных.
Рассмотрим пример с типизацией:
ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто1 КАК Справочник.НоменклатурныеГруппы)
Подводя итог, можно сказать, что гибкость СКД позволяет решать практически любые задачи по трансформации данных «на лету». Главное — соблюдать баланс между удобством представления для пользователя (строковые замены) и сохранением типизации данных для корректной работы системы.