Как настроить оптимальное представление документа в СКД без времени в дате?

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

При разработке отчетов в системе компоновки данных (СКД) программисты часто сталкиваются с задачей изменения стандартного представления документов. По умолчанию платформа 1С:Предприятие формирует представление в виде ИмяДокумента Номер от Дата Время (например, "Реализация товаров и услуг 0000-000001 от 15.10.2023 14:30:15").

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

В этой статье мы подробно разберем все способы решения данной задачи — от простых настроек в схеме компоновки до продвинутых платформенных механизмов переопределения представлений на уровне метаданных.

Метод 1. Использование свойства «Выражение представления» в СКД

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

Выполним настройку по шагам:

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

"Мой документ " + Строка(Организация) + " " + Строка(Подразделение) + " № " + СокрЛП(Номер) + " от " + Формат(Дата, "ДФ=dd.MM.yyyy")

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

Метод 2. Использование Вычисляемых полей и функции Формат()

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

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

  1. Перейдем на вкладку «Вычисляемые поля».
  2. Добавим новое поле, назовем его, например, ДатаДокументаПредставление.
  3. В колонке «Выражение» напишем формулу:

Формат(Ссылка.Дата, "ДФ=dd.MM.yyyy")

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

"Документ № " + СокрЛП(Ссылка.Номер) + " от " + Формат(Ссылка.Дата, "ДФ=dd.MM.yyyy")

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

Метод 3. Оптимизированный вызов общего модуля (без обращений к БД)

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

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

ИмяОбщегоМодуля.ПолучитьПредставление(Ссылка)

А внутри функции начнем обращаться к реквизитам: Ссылка.Дата, Ссылка.Организация, то при формировании отчета на 10 000 строк система выполнит 10 000 дополнительных запросов к базе данных! Отчет зависнет, а сервер получит колоссальную паразитную нагрузку.

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

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

Разберем структуру функции в общем модуле (модуль должен быть серверным, неглобальным, с установленным флагом "Вызов сервера" при необходимости):


Функция ПолучитьКраткоеПредставлениеДокумента(Знач ПредставлениеОрганизации, Знач ПредставлениеПодразделения, Знач НомерДокумента, Знач ДатаДокумента) Экспорт
    
    // Форматируем дату стандартными средствами платформы
    СтрокаДаты = Формат(ДатаДокумента, "ДФ=dd.MM.yyyy");
    
    // Собираем итоговую строку представления
    Результат = СтрШаблон("Мой документ %1 (подразделение %2) № %3 от %4", 
        ПредставлениеОрганизации, 
        ПредставлениеПодразделения, 
        СокрЛП(НомерДокумента), 
        СтрокаДаты);
        
    Возврат Результат;
    
КонецФункции

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

Метод 4. Глобальное переопределение представления на уровне Менеджера объекта

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

Для этого в модуле менеджера конкретного документа определим два предопределенных обработчика событий:


// Определяем, какие поля нам нужны для сборки представления
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
    
    Поля.Добавить("Организация");
    Поля.Добавить("Подразделение");
    Поля.Добавить("Номер");
    Поля.Добавить("Дата");
    
    // Отключаем стандартную генерацию полей платформой
    СтандартнаяОбработка = Ложь;
    
КонецПроцедуры

// Формируем само строковое представление
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    СтрокаДаты = Формат(Данные.Дата, "ДФ=dd.MM.yyyy");
    
    Представление = СтрШаблон("Мой документ %1 %2 № %3 от %4", 
        Данные.Организация, 
        Данные.Подразделение, 
        СокрЛП(Данные.Номер), 
        СтрокаДаты);
        
КонецПроцедуры

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

Метод 5. Использование Макетов компоновки данных

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

Разберем этот вариант по шагам:

  1. Перейдем на вкладку «Макеты» в конструкторе схемы компоновки данных.
  2. Нажмем кнопку «Добавить макет поля» и выберем наше поле (например, Ссылка).
  3. В области макета выделим ячейку и напишем в ней шаблон текста: Мой документ [Организация] [Подразделение] № [Номер] от [Дата].
  4. В свойствах ячейки установим тип заполнения — «Шаблон».
  5. Ниже, в параметрах макета, свяжем параметры шаблона с полями схемы. Для параметра Дата в выражении укажем форматирование: Формат(Дата, "ДФ=dd.MM.yyyy").
  6. Чтобы сохранить интерактивность ячейки, откроем свойства ячейки макета и в поле «Параметр расшифровки» укажем имя параметра, содержащего исходную ссылку на документ.

Метод 6. Использование Форматированных строк (для версий платформы 8.3.27 и выше)

В современных версиях платформы 1С:Предприятие (начиная с релиза 8.3.27) появилась долгожданная поддержка форматированных строк непосредственно в ячейках отчетов СКД. Это открывает потрясающие возможности для визуального выделения частей представления.

Мы можем написать функцию в общем модуле, которая будет возвращать не простую строку, а объект ФорматированнаяСтрока. В СКД мы настроим вызов этой функции в выражении представления.

Посмотрим на пример реализации такой функции:


Функция ПолучитьВыделенноеПредставлениеДокумента(Знач Номер, Знач Дата) Экспорт
    
    СтрокаДаты = Формат(Дата, "ДФ=dd.MM.yyyy");
    
    КоллекцияЭлементов = Новый Массив;
    
    // Сделаем статичную часть обычным шрифтом
    КоллекцияЭлементов.Добавить("Документ № ");
    
    // Выделим номер жирным синим цветом
    ШрифтНомера = Новый Шрифт(,, Истина); // Жирный
    ЦветНомера = Новый Цвет(0, 51, 153); // Синий
    КоллекцияЭлементов.Добавить(Новый ФорматированнаяСтрока(СокрЛП(Номер), ШрифтНомера, ЦветНомера));
    
    // Дату сделаем курсивом
    ШрифтДаты = Новый Шрифт(,,, Истина); // Курсив
    КоллекцияЭлементов.Добавить(" от ");
    КоллекцияЭлементов.Добавить(Новый ФорматированнаяСтрока(СтрокаДаты, ШрифтДаты));
    
    Возврат Новый ФорматированнаяСтрока(КоллекцияЭлементов);
    
КонецФункции

СКД выведет эту форматированную строку прямо в ячейку табличного документа отчета, разукрасив элементы представления в соответствии с заданной нами логикой, что сделает отчет максимально читаемым и привлекательным для пользователей.

Сводная таблица сравнения методов

Для облегчения выбора наиболее подходящего архитектурного решения сопоставим все рассмотренные методы:

  1. Выражение представления в СКД: Высокая производительность, простота реализации, область действия ограничена одним отчетом, сохраняется полная кликабельность ссылки.
  2. Вычисляемые поля с Формат(): Высокая производительность, отлично подходит для вывода даты в отдельные колонки, область действия ограничена одним отчетом.
  3. Оптимизированный общий модуль: Высокая производительность (при передаче примитивных типов), неограниченная сложность алгоритмов сборки, переиспользование кода в других отчетах.
  4. Модуль менеджера (ОбработкаПолученияПредставления): Максимальная системная оптимизация, глобальное действие во всей конфигурации, требует изменения метаданных объекта.
  5. Макеты полей СКД: Возможность сложного позиционирования элементов в ячейке табличного документа, трудоемко при частых изменениях структуры отчета.
  6. Форматированные строки: Великолепный внешний вид с выделением важных частей цветом и шрифтом, требует версию платформы не ниже 8.3.27.

Используя данные рекомендации, мы сможем создавать не только визуально приятные, но и высокопроизводительные отчеты, которые будут формироваться за считанные секунды даже на больших объемах данных.

← На главную