Как настроить выражение представления для вычисляемого поля в СКД?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Работа с системой компоновки данных (СКД) в 1С:Предприятие 8 часто преподносит сюрпризы, особенно когда дело касается вычисляемых полей. Одной из распространенных проблем является некорректная работа или полное игнорирование выражения представления для таких полей. Рассмотрим ситуацию: у нас есть поле, значение которого получается не напрямую из запроса, а вычисляется с помощью функции или сложного выражения. Мы хотим, чтобы пользователь видел не просто ссылку или технический текст, а красиво отформатированную строку (например, «№ 123 от 01.01.2023»), но стандартные механизмы обращения через точку в выражении представления отказываются работать. Разберем по шагам, почему это происходит и как решить задачу эффективно.

Анализ проблемы: почему не работает разыменование

Проанализируем механику работы СКД. Когда мы используем поле из «Набора данных — запрос», платформа обладает «магической» способностью: если в выражении представления мы пишем СчетФактура.Номер, система автоматически модифицирует итоговый текст SQL-запроса, добавляя туда соединение с таблицей соответствующих документов. Это называется автоматическим разыменованием ссылок.

Однако в случае с вычисляемым полем ситуация иная. Если значение поля формируется «на лету» (например, через функцию общего модуля УчетНДСПереопределяемый.НайтиПодчиненныйСчетФактуру...), СКД получает результат вычисления уже после выполнения основного запроса к БД. На этом этапе система часто не может динамически «дозапросить» дополнительные данные (номер, дату) через точку в выражении представления, так как контекст формирования запроса уже закрыт.

Решение 1: Дублирование логики в выражении представления

Самый прямой, хоть и не самый элегантный способ — это повторить логику получения данных в самом выражении представления. Рассмотрим пример, когда вычисляемое поле называется СчетФактура. Если мы хотим видеть представление в формате «№ Номер от Дата», нам придется написать в колонке «Выражение представления» следующее:

"№ " + Строка(СчетФактура.Номер) + " от " + Формат(СчетФактура.Дата, "ДЛФ=D")

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

Решение 2: Учет версии платформы и режима совместимости

Иногда проблема кроется не в логике, а в поведении самой платформы 1С. В версиях до 8.3.18 существовал подтвержденный баг, при котором выражение представления вычисляемого поля могло игнорироваться, особенно если в настройках отчета (в выбранных полях) не было добавлено само вычисляемое поле как отдельная колонка.

Разберем влияние режима совместимости:

  1. Если установлена совместимость 8.3.17 и ниже, парсер выражений СКД работает более строго. Обращения через точку от результата функции могут выдавать ошибку.
  2. Начиная с 8.3.18, механизм был доработан, и многие проблемы с вложенными вычислениями в представлениях исчезли.

Если вы столкнулись с тем, что синтаксически верное выражение не работает, проверьте свойство конфигурации «Режим совместимости». Если есть возможность, обновите его до актуального значения.

Решение 3: Программная коррекция заголовка и представления

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


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Находим вычисляемое поле в схеме
    ВычисляемоеПолеСчет = СхемаКомпоновкиДанных.ВычисляемыеПоля.Найти("СчетФактура");
    
    Если ВычисляемоеПолеСчет <> Неопределено Тогда
        // Можно принудительно задать выражение представления программно
        ВычисляемоеПолеСчет.ВыражениеПредставления = """№ "" + Строка(СчетФактура.Номер)";
    КонецЕсли;

КонецПроцедуры

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

Решение 4: Архитектурный подход «Два поля»

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

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

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

Использование функций общих модулей в представлениях

Посмотрим на пример из практики. Если вы используете функцию общего модуля, выражение в представлении должно выглядеть так:

ОбщегоНазначения.СформироватьПредставлениеДокумента(СчетФактура)

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

Выводы

Мы рассмотрели основные причины, по которым выражение представления вычисляемого поля может не работать. Основная проблема — отсутствие автоматического разыменования ссылок для результатов функций. Наилучшим решением будет либо дублирование обращения через точку (если позволяет производительность), либо предварительный расчет представления в отдельном строковом поле. Также всегда проверяйте режим совместимости вашей конфигурации, так как платформа 8.3.18 значительно улучшила работу в этом направлении.

← На главную