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

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

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

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

Это самый правильный и рекомендуемый метод. Его главное преимущество заключается в том, что мы меняем только визуальный текст, сохраняя при этом в поле саму ссылку на объект. Это позволяет пользователю по-прежнему кликать на документ и переходить в его форму (рабочая расшифровка).

Рассмотрим по шагам, как это настроить:

  1. Откроем схему компоновки данных и перейдем на закладку Наборы данных.
  2. Найдем поле Регистратор (или другое поле ссылочного типа).
  3. В колонке Выражение представления введем формулу, которая будет формировать строку нужного нам вида.

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


Строка(ТипЗнч(Регистратор)) + " № " + Регистратор.Номер + " от " + Формат(Регистратор.Дата, "ДФ=dd.MM.yyyy")

Разберем, что делают функции в этом коде:

Метод 2. Использование вычисляемых полей

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

Добавим новое поле с путем к данным РегистраторПредставление и в колонку Выражение вставим логику, предложенную участниками форума:

Строка(Регистратор.Номер) + " от " + Формат(Регистратор.Дата, "ДФ=dd.MM.yyyy")

Однако здесь есть нюанс: если в отчете могут быть разные типы документов, нам нужно как-то получить их названия. Мы можем использовать конструкцию ВЫБОР КОГДА, как сделал автор темы, если типов документов немного:


Выбор 
    Когда Регистратор Ссылка Документ.ПриходнаяНакладная Тогда "Приходная накладная № " 
    Когда Регистратор Ссылка Документ.РеализацияТоваровУслуг Тогда "Реализация № "
Конец + Регистратор.Номер + " от " + Формат(Регистратор.Дата, "ДФ=dd.MM.yyyy")

Важно: Такой подход менее универсален, так как при добавлении новых типов документов в запрос придется дополнять и это выражение.

Метод 3. Программная обработка через общие модули

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

Создадим в общем модуле (например, ОбщегоНазначения) экспортную функцию:


Функция ПолучитьПредставлениеДокументаБезВремени(СсылкаНаДокумент) Экспорт
    Если СсылкаНаДокумент = Неопределено Или СсылкаНаДокумент.Пустая() Тогда
        Возврат "";
    КонецЕсли;
    
    Возврат Строка(СсылкаНаДокумент.Метаданные().Синоним) + " № " + 
           ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(СсылкаНаДокумент.Номер) + 
           " от " + Формат(СсылкаНаДокумент.Дата, "ДФ=dd.MM.yyyy");
КонецФункции

После этого в СКД (в выражении представления или в вычисляемом поле) мы просто вызываем эту функцию:

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

Анализ типичных ошибок при форматировании

Разберем ситуацию, упомянутую в обсуждении: использование функции ПРЕДСТАВЛЕНИЕ() в тексте запроса и последующее обрезание строки справа на 9 символов.

Посмотрим, почему метод Подстрока(ПРЕДСТАВЛЕНИЕ(Регистратор), ...) или обрезание через Лев() является плохой практикой:

  1. Региональные настройки: Если у пользователя в Windows изменен формат времени (например, используются миллисекунды или формат 12h AM/PM), количество символов в конце строки изменится. Код "откусит" либо лишнее, либо оставит кусок времени.
  2. Потеря типа: Функция ПРЕДСТАВЛЕНИЕ() в запросе превращает ссылку в строку еще на этапе выполнения запроса к СУБД. В результате в компоновку данных попадает не объект, а текст, и расшифровка перестает работать.

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

Итоги

Мы рассмотрели несколько подходов к изменению даты регистратора. Для большинства задач идеальным решением будет использование Выражения представления с функциями ТипЗнч и Формат. Это сохраняет типизацию данных, обеспечивает корректную работу расшифровки и автоматически подстраивается под любые типы документов, присутствующие в системе.

← На главную