Управление форматом даты в 1С: от маски вывода до печатной формы
Содержание
Чтобы задать формат даты в 1С:Предприятие, в коде используют функцию Формат: например, Формат(Дата, "ДФ=дд.ММ.гггг") выведет 17.01.2024 без времени. В формах, отчётах на СКД и макетах печатных форм ту же маску задают в свойстве «Формат» через конструктор форматной строки.
Маска решает, что увидит пользователь: только дату или дату со временем, цифры месяца или его название, год из двух или четырёх знаков. Разберём, как собрать свою форматную строку, где её применять и почему дата иногда выводится с лишним временем, с пробелом в годе или названием месяца на английском.
Как устроена форматная строка даты
Форматная строка — это набор параметров через точку с запятой. Для дат ключевых два: ДФ (явная маска) и ДЛФ (готовый локализованный пресет). Плюс вспомогательные Л, ДП и другие.
Маска ДФ собирается из букв-шаблонов. Регистр важен: заглавная М — это месяц, строчная м — минута. Самая частая ошибка — перепутать их и получить минуты вместо месяца.
| Шаблон | Что означает | Пример вывода |
|---|---|---|
д / дд | день без нуля / с ведущим нулём | 7 / 07 |
М / ММ | номер месяца | 1 / 01 |
МММ / ММММ | месяц сокращённо / прописью | янв / январь |
гг / гггг | год из 2 / 4 знаков | 24 / 2024 |
ЧЧ / чч | час 24-часовой / 12-часовой | 14 / 02 |
мм / сс | минуты / секунды | 30 / 05 |
Латинские буквы работают так же: ДФ=dd.MM.yyyy HH:mm:ss. Удобно, если раскладка на английском. d — день, M — месяц, y — год, H — час (24), m — минута, s — секунда.
Запоминать буквы наизусть не обязательно. Везде, где формат задаётся в интерфейсе — в форме, отчёте, макете — рядом с полем «Формат» есть кнопка с тремя точками. Она открывает конструктор форматной строки: выбираете состав даты и вид мышкой, а 1С собирает корректную маску сама. Руками маску пишут в коде и когда нужен нетиповой вид.
Разделители (точки, двоеточия, пробелы, слова) пишут прямо в маске: ДФ="дд.ММ.гггг", ДФ="гггг-ММ-дд" для формата ISO, ДФ="дд МММ гггг" → 17 янв 2024.
Полезно помнить про сам тип «Дата». В 1С он бывает трёх составов: только дата, только время и дата со временем. Состав задаётся у реквизита объекта или поля формы и определяет, что реально хранится. Маска отвечает лишь за вид при выводе: даже если состав — «дата и время», маской ДФ=дд.ММ.гггг вы покажете один день, но время в базе останется.
Функция Формат в коде: собираем свою маску
В встроенном языке формат задаёт функция Формат(Значение, ФорматнаяСтрока). Она возвращает строку — число, булево или дату в читаемом виде.
Несколько рабочих примеров для Дата = ТекущаяДата() (на клиенте — ТекущаяДатаСеанса()):
Формат(Дата, "ДФ=дд.ММ.гггг") // 17.01.2024
Формат(Дата, "ДФ=дд.ММ.гггг ЧЧ:мм:сс") // 17.01.2024 14:30:05
Формат(Дата, "ДФ=дд ММММ гггг 'г.'") // 17 января 2024 г.
Формат(Дата, "ДФ=гггг-ММ-дд") // 2024-01-17 (ISO, для выгрузок)
Формат(Дата, "ДФ=ЧЧ:мм") // 14:30 (только время)
Текст, который не должен трактоваться как шаблон, берут в одинарные кавычки внутри маски — как 'г.' в примере выше. Иначе буква г превратится в год.
Когда дату нужно вставить в более длинную фразу, удобно собирать текст через СтрШаблон — отформатированная дата идёт туда как обычная строка:
Текст = СтрШаблон(
"Реализация № %1 от %2",
Ссылка.Номер,
Формат(Ссылка.Дата, "ДФ=дд.ММ.гггг"));
Так проще читать код и не теряются пробелы между словами и датой.
Функция Формат живёт только во встроенном языке и в выражениях СКД. В языке запросов 1С её нет — дату в запросе не превращают в строку, а обрезают и группируют функциями НАЧАЛОПЕРИОДА, КОНЕЦПЕРИОДА, ДОБАВИТЬКДАТЕ. Окончательное форматирование делают уже при выводе результата.
Готовые форматы и региональные установки базы
Если нужна не своя маска, а стандартное представление, подойдёт параметр ДЛФ (длинный формат даты). Он отдаёт пресет с учётом локали:
ДЛФ=D— короткая дата:17.01.2024;ДЛФ=DD— длинная дата прописью:17 января 2024 г.;ДЛФ=T— только время:14:30:05;ДЛФ=DT— дата и время вместе.
Названия месяцев и порядок элементов в пресетах ДЛФ зависят от локали. Локаль задают параметром Л:
Формат(Дата, "ДЛФ=DD; Л=ru_RU") // 17 января 2024 г.
Формат(Дата, "ДЛФ=DD; Л=en_US") // January 17, 2024
Когда локаль не указана явно, 1С берёт её из региональных установок информационной базы. Их задают в Конфигураторе: Администрирование → Региональные установки информационной базы. Там же — разделитель даты по умолчанию, представление отрицательных чисел и прочее. Региональные установки самой базы, а не Windows, определяют, как Строка(Дата) выглядит по умолчанию для всех пользователей.
Для одного пользователя интерфейсный язык и формат можно переопределить в его настройках сеанса, но «эталон» для отчётов и обменов лучше держать в региональных установках базы — так результат одинаков у всех.
Вывод даты в отчётах на СКД и в запросах
В системе компоновки данных формат поля задают не кодом, а в конструкторе. Откройте схему компоновки, перейдите на закладку с полями (Наборы данных или Ресурсы), выделите поле типа «Дата» и в его свойстве «Формат» нажмите кнопку с тремя точками — откроется конструктор форматной строки. В нём визуально соберёте ту же маску ДФ/ДЛФ, что и в коде.
Тот же приём работает в закладке Настройки отчёта — через Параметры вывода или условное оформление, если формат нужен только для части строк. Разница в области действия: формат, заданный у поля в схеме, действует везде, где поле выводится; формат из параметров вывода конкретной настройки переопределяет его только в этой настройке. Если дата в готовом отчёте вдруг выглядит иначе, чем вы задали, проверьте оба места — чаще всего побеждает настройка.
В самом запросе дату не форматируют. Её готовят к выводу: обрезают до начала месяца, добавляют интервалы, группируют по периодам.
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Док.Дата, МЕСЯЦ) КАК МесяцДокумента,
Док.Номер
ИЗ
Документ.РеализацияТоваровУслуг КАК Док
Поле МесяцДокумента вернётся датой первого дня месяца, а уже в настройках СКД ему назначают формат ДФ=ММММ гггг → январь 2024. Так разделяются обязанности: запрос считает, компоновка показывает.
Формат даты в управляемых формах и реквизитах
Поле формы с типом «Дата» тоже форматируется через свойство. Выделите реквизит на форме, в палитре свойств найдите «Формат» и откройте конструктор форматной строки.
Частый случай — скрыть время. Если в поле хранится дата со временем, а показывать нужно только день, поставьте маску ДФ=дд.ММ.гггг либо выберите в конструкторе состав даты «Дата» без времени. Само значение при этом не меняется — время остаётся в базе, прячется только из вывода.
Для колонок таблицы формы, динамического списка и дерева формат задают так же — в свойствах соответствующей колонки. Если колонка строится из данных динамического списка, формат можно задать и в элементе формы, и в самом списке.
Формат даты в печатных формах и макетах
В макете табличного документа дату форматируют двумя путями.
Первый — задать формат ячейки. Выделите ячейку с параметром, откройте её свойства и в поле «Формат» укажите маску. Тогда при выводе 1С сама отформатирует подставленное значение-дату.
Второй — подставить уже готовую строку из кода при заполнении макета:
Макет = Документы.РеализацияТоваровУслуг.ПолучитьМакет("Печать");
Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.ДатаДокумента = Формат(Ссылка.Дата, "ДФ=дд ММММ гггг 'г.'");
ТабДок.Вывести(Область);
Второй способ надёжнее, когда формат нестандартный или собирается динамически. Чтобы вмешаться в типовой макет и не потерять правки при обновлении, выносите изменение в расширение конфигурации , а не правьте конфигурацию поставщика напрямую.
Преобразование: строка в дату и дата в строку
Склеить дату со строкой напрямую нельзя — платформа выдаст ошибку преобразования типов. Дату сначала превращают в строку:
Текст = "Документ от " + Формат(Ссылка.Дата, "ДФ=дд.ММ.гггг");
Функция Строка(Дата) тоже вернёт текст, но в формате по умолчанию из региональных установок. Когда вид важен — используйте Формат с явной маской, результат предсказуем.
Обратная задача — получить дату из строки. Литерал в формате ГГГГММДД функция Дата понимает напрямую, а привычный дд.ММ.гггг придётся разобрать на части:
С = "17.01.2024";
ЗначениеДаты = Дата(Прав(С, 4) + Сред(С, 4, 2) + Лев(С, 2));
// "2024" + "01" + "17" → Дата("20240117") → 17.01.2024
Здесь Лев(С, 2) берёт день 17, Сред(С, 4, 2) — месяц 01, Прав(С, 4) — год 2024. Собранная строка 20240117 однозначно трактуется как дата.
Если год подставляется как число, а не через Формат с датой, он выводится с разделителем групп: 2 024. Убирает его параметр ЧГ=0: Формат(2024, "ЧГ=0") → 2024. Для дат внутри маски ДФ эта проблема не возникает.
Ошибки отображения даты и как их убрать
Пустая дата ('00010101') по умолчанию выводится как 01.01.0001 0:00:00 и пугает пользователей. Чтобы вместо неё показать прочерк или текст, добавьте параметр ДП (дата пустая): Формат(Дата, "ДФ=дд.ММ.гггг; ДП='не заполнено'").
ДФ=дд.ММ.гггг, либо в конструкторе формата снимите компоненты времени.М — месяц, строчная м — минута. Исправьте мм.мм.гггг на дд.ММ.гггг.Л=ru_RU в форматную строку или проверьте региональные установки базы.ЧГ=0 или форматируйте именно дату через ДФ.ДП с нужным текстом: ДП='—'.Ещё одна тонкая ситуация — часовой пояс. ТекущаяДата() возвращает дату сервера, ТекущаяДатаСеанса() — дату сеанса с учётом часового пояса пользователя. В распределённых базах и облаке это заметно: лучше брать дату сеанса, иначе вечерние документы могут «уехать» на следующий день.
Отдельно стоит ошибка «не те» дни недели или месяцы прописью в двуязычной базе. Если часть пользователей работает на английском интерфейсе, а отчёт должен быть строго по-русски, не полагайтесь на текущий язык сеанса — фиксируйте локаль прямо в маске через Л=ru_RU. Тогда результат не зависит от того, кто запустил отчёт.
Частые вопросы
Чем `ДФ` отличается от `ДЛФ`?
ДФ — своя маска, которую вы собираете посимвольно и полностью контролируете. ДЛФ — готовый пресет (короткая, длинная дата, время), вид которого зависит от локали. Для выгрузок и ISO-формата берите ДФ, для «человеческого» вида в интерфейсе удобнее ДЛФ.Как вывести только месяц и год, например «январь 2024»?
ДФ=ММММ гггг. Если данные идут из запроса, предварительно обрежьте дату функцией НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ), а формат назначьте в настройках СКД.Почему `Строка(Дата)` в разных базах выглядит по-разному?
Формат.Можно ли задать формат один раз для всей базы?
Как сравнить две даты без учёта времени?
НачалоДня(Дата) и сравнивайте результат. Формат на сравнение не влияет — он только про вывод, внутри дата всегда хранится как момент времени.