Работа с датами в системе 1С:Предприятие является одной из фундаментальных задач для любого разработчика. Внутреннее представление даты хранится как числовое значение, но при выводе на экран, в печатные формы или внешние файлы требуется строгое визуальное оформление. Неправильно заданный шаблон может привести к ошибкам в отчетах или некорректному восприятию информации пользователем.
Для преобразования даты в строку используется встроенная функция Формат. Она позволяет гибко настраивать отображение дня, месяца, года и времени. Важно понимать, что синтаксис этой функции подчиняется определенным правилам, нарушение которых приведет к тому, что вместо красивой даты вы получите техническое числовое значение по умолчанию.
В этой статье мы детально разберем механизм форматирования, рассмотрим готовые шаблоны и ответим на сложные вопросы, возникающие при локализации и работе с разными часами. Вы научитесь писать чистый и надежный код для отображения временных меток.
Базовый синтаксис функции Формат
Основным инструментом разработчика является функция Формат(Значение, ОписаниеФормата). Первый параметр принимает переменную типа Дата, а второй — строку, описывающую, как именно нужно отобразить это значение. Описание формата может быть простым (например, "ДФ") или сложным, содержащим настройки для разных частей даты.
Если вы передадите дату без второго параметра, система применит формат по умолчанию, установленный в операционной системе или в параметрах сеанса. Однако в профессиональной разработке явное задание формата является обязательным стандартом. Это гарантирует, что отчет будет выглядеть одинаково на компьютере бухгалтера в Москве и на сервере в другом регионе.
Строка описания формата состоит из секций, разделенных точкой с запятой. Для даты обычно используется одна секция, содержащая символы-модификаторы. Например, код ДФ означает Date Format. Внутри кавычек после ДФ указывается шаблон, где специальные символы заменяются на части даты.
⚠️ Внимание: Символы формата чувствительны к регистру. Строчная
ди заглавнаяДмогут означать разные вещи в зависимости от контекста, хотя для дня месяца чаще используют строчную. Всегда проверяйте регистр в документации платформы.
Используйте константы формата, такие как ДЛФ (Длинная форма), если вам нужно стандартное отображение без кастомизации. Это упрощает код и делает его читаемым.
Основные символы и шаблоны форматирования
Чтобы получить нужный результат, необходимо знать набор спецсимволов, которые платформа подставляет вместо себя. Самый популярный запрос — получение даты в виде ДД.ММ.ГГГГ. Для этого используется шаблон "ДФ=ДД.ММ.ГГГГ". Здесь ДД означает день с ведущим нулем, ММ — месяц, а ГГГГ — год четырехзначный.
Часто требуется отобразить только месяц и год, например, для шапки накладной. В этом случае применяется конструкция "ДФ=ММ.ГГГГ". Если вам нужно вывести день недели текстом, используйте символы Д (первая буква) или ДДД (полное название). Платформа автоматически склоняет названия месяцев и дней недели в соответствии с текущей локалью.
Разработчики часто путаются в количестве символов. Один символ Д выведет день без ведущего нуля (1, 2... 31), а два символа ДД добавят ноль (01, 02... 31). Аналогичная логика работает для месяцев. Для года символ Г или ГГ покажет последние две цифры, а ГГГГ — полный год.
Ниже приведена таблица основных спецификаторов, которые вы будете использовать в 90% случаев:
| Спецификатор | Описание | Пример вывода |
|---|---|---|
ДД |
День месяца (01-31) | 05 |
ММ |
Номер месяца (01-12) | 12 |
МММ |
Краткое имя месяца | дек |
ГГГГ |
Полный год | 2026 |
ЧЧ:ММ |
Часы и минуты | 14:30 |
Работа со временем и комбинированные форматы
Объект Дата в 1С всегда содержит и время, даже если оно равно нулю. При форматировании часто возникает задача вывести только временную часть или объединить её с датой. Для времени используются спецификаторы Ч (часы), М (минуты) и С (секунды). Будьте осторожны: символ М отвечает за минуты только в секции времени, в секции даты он означает месяц.
Чтобы сформировать строку вида "31.12.2026 23:59:59", необходимо использовать следующий шаблон:
Формат(ТекущаяДата(), "ДФ=ДД.ММ.ГГГГ ЧЧ:ММ:СС")
В данном примере пробел между датой и временем указывается явно. Платформа не добавляет разделители автоматически, если они не описаны в строке формата. Если время не нужно, но дата содержит ненулевое время, оно просто игнорируется, если в шаблоне нет символов времени.
Нюанс с ведущими нулями
Если вы используете один символ (например, Ч), то час 9 отобразится как "9". Если использовать два (ЧЧ), то как "09". Это критично для сортировки строк в отчетах.
Иногда требуется вывести дату в формате ISO 8601 для обмена данными с внешними системами. Это делается так:
Формат(МояДата, "ДФ=ГГГГ-ММ-ДДТЧЧ:ММ:СС")
Такой формат является международным стандартом и часто используется в JSON или XML выгрузках. Использование буквы "Т" между датой и временем является требованием стандарта, а не прихотью разработчика.
Настройка локали и языковые особенности
Платформа 1С:Предприятие поддерживает многопользовательскую работу с разными языковыми настройками. Функция Формат автоматически учитывает язык текущего сеанса. Если пользователь работает в интерфейсе на английском языке, то использование спецификатора МММ выведет "Jan", "Feb", а не "Янв", "Фев".
Однако бывают ситуации, когда необходимо принудительно задать язык вывода, независимо от настроек пользователя. Это реализуется через параметр Л (Locale) в строке формата. Синтаксис выглядит как "Л=ru; ДФ=...". Это позволяет формировать печатные формы на русском языке даже в англоязычном сеансе.
⚠️ Внимание: Указание локали "
Л=en" или "Л=ru" должно стоять в начале строки формата перед описанием даты. Если поставить его после, платформа может проигнорировать настройку или выдать ошибку синтаксиса.
Также важно помнить про склонение слов. В русском языке названия месяцев в дательном падеже ("январю") отличаются от именительного ("январь"). Спецификаторы формата обычно выдают название в нужном падеже для контекста "от ... даты", но для заголовков иногда требуется именительный падеж, который нужно обрабатывать отдельно программно.
Всегда тестируйте отчеты с разными языковыми настройками сеанса. То, что красиво выглядит у разработчика на русском, может превратиться в набор символов у иностранного пользователя.
Отображение периода и интервалов времени
В бухгалтерском учете и складской логистике часто требуется отображать не одну дату, а период. Хотя функция Формат работает с одиночными значениями, её можно комбинировать для вывода диапазонов. Типичный пример: "Период с 01.01.2026 по 31.01.2026".
Для реализации такого вывода используется конкатенация строк. Вы формируете две строки с датами начала и конца периода, а затем соединяете их текстовым разделителем. Важно соблюдать единообразие формата для обеих дат, чтобы отчет выглядел профессионально.
Пример кода для формирования строки периода:
НачПериода = НачалоМесяца(ТекущаяДата());
КонПериода = КонецМесяца(ТекущаяДата());
СтрПериода = "Период: " + Формат(НачПериода, "ДФ=ДД.ММ.ГГГГ") + " - " + Формат(КонПериода, "ДФ=ДД.ММ.ГГГГ");
Такой подход позволяет гибко управлять отображением. Вы можете добавить слово "года" после года или использовать другие разделители. Главное — не забывать, что конкатенация работает только со строками, поэтому вызов Формат обязателен перед объединением.
☑️ Проверка корректности периода
Частые ошибки и способы их отладки
Самая распространенная ошибка новичков — попытка форматировать значение, которое не является датой. Если переменная имеет тип Неопределено или Строка, функция вернет пустую строку или ошибку выполнения. Всегда проверяйте тип значения перед форматированием с помощью оператора ТипЗнч.
Вторая ошибка — неправильное экранирование символов. Если вы хотите вывести букву "Д" как текст, а не как спецификатор дня, её нужно взять в кавычки внутри строки формата. Например: "ДФ='Данные за' ГГГГ" выведет "Данные за 2026". Без кавычек платформа попытается интерпретировать текст как команду.
⚠️ Внимание: В старых версиях платформы (до 8.3.10) были нюансы с обработкой некоторых спецификаторов в тонком клиенте. Если вы поддерживаете старые конфигурации, обязательно проверяйте вывод в разных режимах совместимости.
Для отладки сложных форматов удобно использовать консоль кода или отладчик. Выводите промежуточный результат в сообщение (Сообщить()) и сравнивайте его с ожидаемым. Часто проблема кроется в лишнем пробеле или забытой кавычке в строке описания формата.
Лайфхак для отладки
Скопируйте строку формата в буфер обмена и вставьте в текстовый редактор с подсветкой синтаксиса. Так проще заметить незакрытые кавычки или опечатки в спецсимволах.
Производительность и лучшие практики
Функция Формат является достаточно ресурсоемкой операцией, так как включает в себя анализ строки шаблона и преобразование данных. В циклах, обрабатывающих десятки тысяч строк (например, при формировании больших отчетов), вызов этой функции внутри цикла может существенно замедлить работу.
Оптимальным подходом является вынос форматирования за пределы цикла, если это возможно, или кэширование часто используемых строк формата в переменные. Не создавайте новую строку описания формата на каждой итерации цикла, если шаблон не меняется.
В современных версиях платформы рекомендуется использовать макеты компоновки данных (СКД) для отчетов. В СКД форматирование задается в настройках поля, что работает быстрее и декларативнее, чем ручной вызов функции в коде модуля. Код следует использовать только для сложной логики, которую нельзя реализовать средствами СКД.
Избегайте вызова функции Формат внутри вложенных циклов по большим выборкам. Это "узкое место", которое легко устранить предварительной подготовкой данных.
Как вывести дату в формате UNIX Timestamp?
В 1С нет прямого спецификатора для UNIX времени. Вам нужно вычислить разницу между вашей датой и началом эпохи (01.01.1970) в секундах. Используйте функцию РазницаДат с параметром ПериодСекунда.
Почему месяц отображается цифрой, а я хочу словом?
Проверьте спецификатор. ММ выводит число (01-12). Для слова используйте МММ (кратко: янв) или ММММ (полностью: январь). Убедитесь, что в строке формата нет опечаток.
Можно ли форматировать дату в запросе?
Нет, в языке запросов 1С функция Формат недоступна. Форматирование должно производиться на стороне клиентского приложения или в СКД после получения данных из базы.
Как добавить порядковое окончание к дню (1-е, 2-е)?
Стандартными средствами функции Формат это сделать нельзя. Потребуется пользовательская функция, которая будет анализировать число дня и добавлять суффикс в зависимости от значения (1, 21 -> "е"; 2, 3, 4 -> "е" и т.д., с учетом исключений для 11-14).