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