При разработке отчетов на системе компоновки данных (СКД) часто возникает задача изменить стандартное представление документа-регистратора. По умолчанию 1С выводит его в формате "НазваниеДокумента Номер от Дата Время". Однако для эстетичности или по требованию заказчика часто необходимо оставить только дату, убрав секунды и минуты. В этой статье мы разберем несколько способов реализации этой задачи: от простых и быстрых до профессиональных и универсальных.
Это самый правильный и рекомендуемый метод. Его главное преимущество заключается в том, что мы меняем только визуальный текст, сохраняя при этом в поле саму ссылку на объект. Это позволяет пользователю по-прежнему кликать на документ и переходить в его форму (рабочая расшифровка).
Рассмотрим по шагам, как это настроить:
Регистратор (или другое поле ссылочного типа).Проанализируем пример выражения, которое позволит динамически получать название любого документа и форматировать его дату:
Строка(ТипЗнч(Регистратор)) + " № " + Регистратор.Номер + " от " + Формат(Регистратор.Дата, "ДФ=dd.MM.yyyy")
Разберем, что делают функции в этом коде:
ТипЗнч(Регистратор) — возвращает тип документа, а функция Строка() превращает его в понятное пользователю название (синоним), например, "Приходная накладная".Регистратор.Номер — обращение к реквизиту номера.Формат(..., "ДФ=dd.MM.yyyy") — жестко задает маску даты, исключая время.Если по каким-то причинам нам нужно создать отдельное поле для вывода текста, мы воспользуемся закладкой Вычисляемые поля. Этот метод удобен, когда нужно сохранить и стандартный регистратор, и его сокращенную версию в одном отчете.
Добавим новое поле с путем к данным РегистраторПредставление и в колонку Выражение вставим логику, предложенную участниками форума:
Строка(Регистратор.Номер) + " от " + Формат(Регистратор.Дата, "ДФ=dd.MM.yyyy")
Однако здесь есть нюанс: если в отчете могут быть разные типы документов, нам нужно как-то получить их названия. Мы можем использовать конструкцию ВЫБОР КОГДА, как сделал автор темы, если типов документов немного:
Выбор
Когда Регистратор Ссылка Документ.ПриходнаяНакладная Тогда "Приходная накладная № "
Когда Регистратор Ссылка Документ.РеализацияТоваровУслуг Тогда "Реализация № "
Конец + Регистратор.Номер + " от " + Формат(Регистратор.Дата, "ДФ=dd.MM.yyyy")
Важно: Такой подход менее универсален, так как при добавлении новых типов документов в запрос придется дополнять и это выражение.
Для крупных проектов, где требования к оформлению документов едины для всех отчетов, лучше всего вынести логику формирования представления в общий модуль. Это позволит избежать дублирования кода в каждом отчете.
Создадим в общем модуле (например, ОбщегоНазначения) экспортную функцию:
Функция ПолучитьПредставлениеДокументаБезВремени(СсылкаНаДокумент) Экспорт
Если СсылкаНаДокумент = Неопределено Или СсылкаНаДокумент.Пустая() Тогда
Возврат "";
КонецЕсли;
Возврат Строка(СсылкаНаДокумент.Метаданные().Синоним) + " № " +
ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(СсылкаНаДокумент.Номер) +
" от " + Формат(СсылкаНаДокумент.Дата, "ДФ=dd.MM.yyyy");
КонецФункции
После этого в СКД (в выражении представления или в вычисляемом поле) мы просто вызываем эту функцию:
ОбщегоНазначения.ПолучитьПредставлениеДокументаБезВремени(Регистратор)
Разберем ситуацию, упомянутую в обсуждении: использование функции ПРЕДСТАВЛЕНИЕ() в тексте запроса и последующее обрезание строки справа на 9 символов.
Посмотрим, почему метод Подстрока(ПРЕДСТАВЛЕНИЕ(Регистратор), ...) или обрезание через Лев() является плохой практикой:
ПРЕДСТАВЛЕНИЕ() в запросе превращает ссылку в строку еще на этапе выполнения запроса к СУБД. В результате в компоновку данных попадает не объект, а текст, и расшифровка перестает работать.Проанализируем ситуацию с макетами. Если стандартных средств настройки полей не хватает, можно нарисовать Собственный макет для поля на соответствующей закладке СКД. В макете можно задать область ячейки, указать параметр и в свойствах этого параметра прописать то же самое выражение или формат. Это дает полный контроль над оформлением, включая шрифт и цвет, но усложняет поддержку отчета. На практике разобраться с этой возможностью поможет пример настройки собственных макетов в СКД.
Мы рассмотрели несколько подходов к изменению даты регистратора. Для большинства задач идеальным решением будет использование Выражения представления с функциями ТипЗнч и Формат. Это сохраняет типизацию данных, обеспечивает корректную работу расшифровки и автоматически подстраивается под любые типы документов, присутствующие в системе.