При разработке бухгалтерских отчетов в системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда в регистре бухгалтерии не заполнены определенные разрезы учета (субконто). Например, при выполнении регламентной операции «Закрытие месяца» или при оформлении возвратов товаров некоторые аналитические поля могут оставаться пустыми. Оставлять пустые места в отчете не всегда корректно с точки зрения пользователя — часто требуется вывести понятный текст, например, «Возврат товара» или «Корректировка». Рассмотрим подробно, как решить эту задачу и как правильно упорядочить такие данные.
Первый и самый распространенный способ — это изменение Выражения представления для конкретного поля в наборе данных СКД. Этот метод позволяет подменить визуальный текст, который видит пользователь, не меняя при этом само значение в выборке. Рассмотрим ситуацию: нам нужно, чтобы вместо пустого Субконто1 выводилась фраза «Возврат товара».
Разберем алгоритм действий на закладке «Наборы данных»:
Субконто1.Проанализируем пример кода, который решает эту задачу:
Выбор
Когда Не ЗначениеЗаполнено(Субконто1)
Тогда "Возврат товара"
Иначе Субконто1
Конец
Если же условие должно быть более сложным и зависеть от других полей (например, от статьи доходов или затрат), мы можем расширить логику. Посмотрим на пример, когда текст выводится только для конкретной статьи:
Выбор
Когда Не ЗначениеЗаполнено(Субконто1) И Статья = "010 Выручка"
Тогда "Возврат проданной продукции"
Иначе Субконто1
Конец
Важно помнить, что функция ЗначениеЗаполнено() является универсальной для СКД. Она корректно отрабатывает как для пустых ссылок, так и для значений типа Неопределено или NULL.
Когда мы подменяем текст в представлении, стандартная сортировка по алфавиту может работать не так, как ожидает клиент. Например, строка «Возврат товара» может оказаться в середине списка, а нам нужно закрепить ее на определенной позиции (допустим, в самом начале или строго после реализации).
Рассмотрим ситуацию: клиент хочет, чтобы «Доходы от реализации» всегда шли первыми, а наш искусственно созданный «Возврат проданной продукции» — вторым. Использование текстовой сортировки (например, добавление символов «ЫЫЫ» в начало скрытой строки) — это ненадежный метод. Разберем более профессиональный подход через Выражение упорядочивания.
Для корректной работы создадим числовой индекс для сортировки. В СКД на закладке «Наборы данных» для поля Субконто1 заполним колонку «Выражение упорядочивания» следующим образом:
Выбор
Когда Статья = "Доходы от реализации"
Тогда 1
Когда Не ЗначениеЗаполнено(Субконто1) И Статья = "010 Выручка"
Тогда 2
Иначе 3
Конец
Почему этот метод лучше? Система сначала отсортирует данные по числам (1, 2, 3), что гарантирует жесткую последовательность строк независимо от их текстового представления. Выясним причину, почему это стандарт «золотого сечения»: числовая сортировка работает быстрее строковой и исключает проблемы с кодировкой и регистром символов.
Существует альтернативный подход, который не затрагивает выражения полей, а работает исключительно на уровне визуализации. Это Условное оформление в настройках отчета.
Проанализируем ситуацию: нам нужно сохранить возможность «расшифровки» (drill-down) по пустому полю, но визуально заполнить его текстом. В этом случае выполним следующие шаги:
Субконто1 Не заполнено.Субконто1.Этот способ считается более гибким, так как оформление можно менять в пользовательском режиме, не заходя в конфигуратор или схему компоновки. Однако он не позволяет динамически менять текст в зависимости от сложных условий в запросе так эффективно, как это делает «Выражение представления».
Посмотрим на техническую сторону вопроса. Поле Субконто в регистре бухгалтерии имеет составной тип. Это накладывает определенные ограничения и особенности:
1. NULL vs Неопределено. В запросе СКД, если мы используем левое соединение с регистром, отсутствие данных вернет NULL. Если же мы выбираем данные из виртуальных таблиц остатков и оборотов, система чаще оперирует Неопределено или пустой ссылкой конкретного типа. Функция ЗначениеЗаполнено() нивелирует эту разницу, что делает ее использование предпочтительным.
2. Оператор ССЫЛКА. Если логика вывода текста зависит от типа субконто (например, для номенклатуры — один текст, для контрагентов — другой), используем проверку типа:
Выбор
Когда Субконто1 ССЫЛКА Справочник.Номенклатура И Не ЗначениеЗаполнено(Субконто1)
Тогда "Неуказанная номенклатура"
Иначе Субконто1
Конец
3. Группировки. Будьте осторожны: если вы подменяете текст в группировочном поле, СКД все равно будет группировать данные по реальному значению (пустой ссылке). Если у вас в отчете есть несколько разных «пустых» значений, которые вы превратили в разный текст, они могут объединиться в одну строку в отчете, так как физически (в базе данных) они идентичны. Чтобы этого избежать, логику подмены текста иногда стоит выносить в Вычисляемое поле и группировать уже по нему.
Рассмотрим подробнее работу с ЕСТЬNULL. На уровне запроса в наборе данных мы можем написать:
ВЫБРАТЬ
ЕСТЬNULL(ХозрасчетныйОбороты.Субконто1, "Текст из запроса") КАК ПолеСубконто
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(...) КАК ХозрасчетныйОбороты
Однако помните: если вы преобразуете ссылку в строку прямо в запросе, вы потеряете возможность открыть карточку объекта из отчета (пропадет интерактивность). Именно поэтому использование Выражения представления в настройках поля СКД является наиболее сбалансированным и правильным решением.