При разработке отчетов в системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда стандартные настройки оформления не срабатывают. Одной из самых распространенных проблем является вывод даты вместе с временем (часами, минутами и секундами), когда требуется отобразить только календарное число. Особенно остро этот вопрос встает при использовании собственных макетов оформления, где ячейки имеют тип заполнения Шаблон — для этой задачи есть редактор макетов и шаблонов печати 1С.
В этой статье мы подробно разберем, почему так происходит, и рассмотрим несколько эффективных способов решения этой задачи, от простых настроек в конструкторе до небольших манипуляций с выражениями.
Прежде всего, проанализируем причину проблемы. Когда в ячейке макета выбран тип заполнения Параметр, система 1С воспринимает передаваемое значение как объект определенного типа (в нашем случае — Дата). В этом случае настройки «Формат» в свойствах ячейки или в «Условном оформлении» применяются корректно, так как система понимает, что она форматирует дату.
Однако, как только мы переключаем тип заполнения на Шаблон, механизм работы меняется. В шаблоне текст может выглядеть как "Накладная № [Номер] от [Дата]". Система сначала вычисляет строковые представления всех параметров внутри квадратных скобок, а затем «склеивает» их в одну общую строку. На этапе этой «склейки» 1С преобразует дату в строку по умолчанию, включая в нее время. Поскольку результатом работы шаблона является тип Строка, применение формата даты к ячейке уже не дает никакого эффекта — для системы это просто набор символов.
Многие разработчики не знают, что формат можно указать непосредственно внутри конструкции шаблона в макете. Это самый быстрый способ, не требующий изменения типа ячейки или написания программного кода. Если в вашей ячейке-шаблоне указан параметр [ДатаДокумента], вы можете дополнить его строкой формата через запятую.
Рассмотрим пример правильного синтаксиса внутри квадратных скобок:
[ДатаДокумента, "ДФ=dd.MM.yyyy"]
В данном случае ДФ (Дата Формат) жестко задает маску вывода. Разберем основные символы форматирования:
Проанализируем ситуацию: если мы напишем "ДФ=dd MMMM yyyy 'г.'", то дата «01.05.2023» превратится в красивую строку «01 мая 2023 г.». Этот метод работает внутри шаблона идеально, так как система применяет форматирование в момент преобразования параметра в строку, еще до того, как соберет финальный текст ячейки.
Если ячейка макета не содержит лишнего текста, а выводит только саму дату, лучшим решением будет отказаться от типа Шаблон в пользу типа Параметр. Посмотрим, как это сделать правильно:
Параметр.ДатаДокумента).ДЛФ=D для длинного формата без времени или ДФ=dd.MM.yyyy).Важный нюанс: обязательно проверьте свойство Тип значения у этой ячейки. Если там стоит «Авто», система может ошибиться. Рекомендуется явно указать Дата (или уточнить состав даты как «Дата»).
Если вы хотите, чтобы дата всегда и везде в отчете (не только в макете, но и в группировках, авто-полях) выводилась без времени, можно воспользоваться настройками самого поля в СКД — для этого подойдёт инструментарий разработчика с консолью СКД и запросов. Разберем этот путь по шагам:
Формат(ДатаДокумента, "ДФ=dd.MM.yyyy")
Теперь, когда СКД будет встречать это поле в любом текстовом контексте (в том числе в шаблоне макета), она будет использовать результат этого выражения. Это очень удобно, так как позволяет централизованно управлять отображением данных.
Иногда бывает полезно подготовить данные еще на этапе выборки из базы данных. Хотя в 1С рекомендуется хранить даты как объекты Дата, для специфических печатных форм можно сразу получить строку — для этого есть универсальная выгрузка документов с настройкой полей. Выясним, как это выглядит в тексте запроса:
ВЫБРАТЬ
ПРЕДСТАВЛЕНИЕ(Продажи.Период) КАК ПериодСтрока,
Продажи.СуммаОборот КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
Функция ПРЕДСТАВЛЕНИЕ в языке запросов преобразует дату в строку в соответствии с региональными настройками пользователя. Однако будьте осторожны: если у пользователя в Windows в настройках даты стоит вывод времени, то ПРЕДСТАВЛЕНИЕ тоже его выведет. Для гарантированного результата лучше использовать методы форматирования в СКД, описанные выше.
Если вы создаете внешний отчет или имеете доступ к модулю объекта, можно программно повлиять на формат вывода, не меняя сам макет. Рассмотрим пример кода в процедуре ПриКомпоновкеРезультата:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Находим нужное поле в оформлении
ПолеДаты = Новый ПолеКомпоновкиДанных("ДатаДокумента");
ЭлементОформления = Настройки.УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Формат", "ДФ=dd.MM.yyyy");
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = ПолеДаты;
// Применяем настройки обратно
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
КонецПроцедуры
Этот метод полезен, когда отчет сложный и формат даты должен меняться в зависимости от каких-либо внешних условий (например, от выбранного языка интерфейса или параметров отчета).
Проанализировав все варианты, можно сделать следующие выводы:
[Дата, "ДФ=..."].Используя данные методы, вы сможете добиться профессионального и аккуратного вида ваших отчетов в 1С, обеспечивая вывод только необходимой информации без лишних деталей.