Преобразование даты в строковый формат — одна из самых частых задач при работе с 1С:Предприятие 8.3. Без этого не обойтись при формировании отчетов, экспорте данных, интеграции с внешними системами или даже при банальном выводе даты пользователю в удобочитаемом виде. Казалось бы, что может быть проще? Но в 1С есть целых 5 различных способов конвертировать дату в строку, каждый из которых имеет свои нюансы, преимущества и подводные камни.
В этой статье мы разберем все методы — от стандартной функции Формат() до малоизвестных приемов с использованием Строка() и ПредставлениеДата(). Вы узнаете, как учитывать региональные настройки, избегать ошибок с пустыми датами, форматировать время вместе с датой и даже создавать кастомные шаблоны вывода. А в конце вас ждет сравнительная таблица всех методов с рекомендациями по применению.
1. Стандартная функция Формат() — базовый инструмент
Функция Формат(Дата, ФорматнаяСтрока) — это первый и самый очевидный способ преобразования даты в строку. Она входит в стандартную библиотеку 1С и работает во всех конфигурациях без дополнительных модулей. Основное преимущество — гибкость: вы можете задать любой формат вывода через специальные символы.
Примеры использования:
// Базовый формат (по умолчанию для текущей локали)
Результат = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
// С временем
Результат = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy; ВФ=ЧЧ:мм:сс");
// Только месяц и год
Результат = Формат(ТекущаяДата(), "ДФ=MMMM yyyy"); // "июнь 2026"
- 📅 Д — день без ведущего нуля (1-31)
- 📅 дд — день с ведущим нулем (01-31)
- 📅 М — месяц без нуля (1-12), ММ — с нулем (01-12)
- 📅 ММММ — полное название месяца ("январь")
- 📅 г — короткий год (24), гггг — полный (2026)
⚠️ Внимание: Если передать в функциюФормат()пустую дату (Дата(1,1,1)), результат будет пустой строкой. Это может привести к ошибкам при конкатенации строк!
2. Функция Строка() — простой, но опасный метод
Функция Строка(Дата) на первый взгляд кажется идеальным решением — коротко, лаконично, без лишних параметров. Она автоматически преобразует дату в строку согласно региональным настройкам пользователя. Но здесь кроется главная опасность: результат будет разным на разных компьютерах!
Примеры:
// На русскоязычной системе
Результат = Строка(Дата(2026, 6, 15)); // "15.06.2026"
// На англоязычной системе
Результат = Строка(Дата(2026, 6, 15)); // "6/15/2026"
Когда использовать Строка():
- ✅ Для внутреннего логгирования (где формат не важен)
- ✅ При выводе даты пользователю в его локальном формате
- ❌ Никогда для интеграций с внешними системами
- ❌ Никогда при сохранении в базу данных
Если вам нужно гарантированно получить дату в формате ISO (YYYY-MM-DD) для API, используйте комбинацию: Формат(Дата, "ДФ=гггг-ММ-дд"). Этот формат понимают все современные системы.
3. Метод ПредставлениеДата() — для пользовательского вывода
Функция ПредставлениеДата(Дата, Формат) из глобального контекста предназначена специально для отображения дат пользователю. Она учитывает не только региональные настройки, но и пользовательские предпочтения из профиля 1С.
Особенности метода:
- 🔹 Автоматически подставляет разделители согласно локали
- 🔹 Может выводить месяц прописью (
Формат = 1) - 🔹 Поддерживает сокращенные форматы (
Формат = 2— "15 июн") - 🔹 Умеет обрабатывать пустые даты (возвращает пустую строку)
// Полный формат с месяцем прописью
Результат = ПредставлениеДата(ТекущаяДата(), 1); // "15 июня 2026 года"
// Краткий формат
Результат = ПредставлениеДата(ТекущаяДата(), 2); // "15 июн. 2026"
| Параметр "Формат" | Пример вывода | Описание |
|---|---|---|
0 или не указан |
"15.06.2026" | Краткий цифровой формат |
1 |
"15 июня 2026 года" | Полный формат с месяцем прописью |
2 |
"15 июн. 2026" | Сокращенный формат |
3 |
"июнь 2026" | Только месяц и год |
4. Работа с временными метками: дата + время
Когда нужно вывести не только дату, но и время, подходы немного меняются. Здесь важно понимать, что время в 1С хранится отдельно от даты, и его тоже нужно форматировать. Самый надежный способ — использовать Формат() с двумя параметрами:
// Дата + время через разделитель
Результат = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy; ДР=' '; ВФ=ЧЧ:мм:сс");
// Только время
Результат = Формат(ТекущаяДата(), "ВФ=ЧЧ:мм"); // "14:30"
Особенности форматирования времени:
- 🕒 ЧЧ — часы (00-23)
- 🕒 мм — минуты (00-59)
- 🕒 сс — секунды (00-59)
- 🕒 т — миллисекунды (0-999)
⚠️ Внимание: При работе с временными зонами помните, что 1С по умолчанию использует локальное время сервера. Если вам нужно UTC, используйте метод УниверсальноеВремя() перед форматированием.
Как вывести дату в формате Excel?
Используйте функцию Формат(Дата, "ДФ=dd.MM.yyyy; ДР=' '; ВФ=ЧЧ:мм:сс") и затем замените разделители на нужные. Для Excel подойдет формат "дд/ММ/гггг ЧЧ:мм".
5. Продвинутые техники: кастомные функции и обработка ошибок
Иногда стандартных методов недостаточно. Например, когда нужно:
- 🔧 Выводить дату в нестандартном формате (например, "15 июня, суббота")
- 🔧 Обрабатывать пустые даты особым образом
- 🔧 Добавлять префиксы/суффиксы ("Срок до: 15.06.2026")
В таких случаях пишут собственные функции. Пример универсальной функции с обработкой ошибок:
Функция ДатаВСтроку(ЗначениеДата, ФорматСтроки = "dd.MM.yyyy", Разделитель = ".", ПустаяДатаКак = "")
Если ЗначениеДата = Дата(1,1,1) Тогда
Возврат ПустаяДатаКак;
КонецЕсли;
Попытка
Результат = Формат(ЗначениеДата, "ДФ=" + ФорматСтроки + "; ДР='" + Разделитель + "'");
Возврат Результат;
Исключение
Возврат "#ОШИБКА_FORMAT#";
КонецПопытки;
КонецФункции
Преимущества такого подхода:
- ✔ Гибкая настройка разделителей
- ✔ Контролируемая обработка пустых дат
- ✔ Защита от ошибок форматирования
- ✔ Легко модифицировать под новые требования
Учтена ли локализация?|Обработаны ли пустые даты?|Есть ли защита от некорректных форматов?|Протестировано ли на граничных значениях?-->
6. Особенности для отчетов и СКД
В системе компоновки данных (СКД) форматирование дат имеет свои нюансы. Здесь нельзя просто так вызвать Формат() — нужно либо настраивать пользовательские поля, либо использовать выражения в схеме компоновки.
Пример настройки в СКД:
- Откройте схему компоновки данных
- Перейдите на закладку "Параметры"
- Добавьте новый параметр типа "Строка"
- В выражении укажите:
Формат(Документ.Дата, "ДФ=dd.MM.yyyy") - Используйте этот параметр в выводе отчета
Для динамического форматирования в отчетах можно использовать условное оформление:
// В модуле отчета
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, ДанныеОбъекта, ПараметрыФорматирования)
Если ДанныеОбъекта.Дата < ТекущаяДата() Тогда
ПараметрыФорматирования.ЦветТекста = ВебЦвета.Красный;
ПараметрыФорматирования.Текст = Формат(ДанныеОбъекта.Дата, "ДФ=dd.MM.yyyy") + " (просрочено)";
КонецЕсли;
КонецПроцедуры
⚠️ Внимание: В отчетах СКД форматирование дат на уровне схемы компоновки работает быстрее, чем программная обработка в модуле. Используйте программный код только когда нужно динамическое изменение формата.
Для отчетов всегда предпочитайте настройку формата на уровне СКД — это значительно ускоряет выполнение по сравнению с программной обработкой каждого поля.
7. Типичные ошибки и как их избежать
Даже опытные разработчики 1С иногда допускают ошибки при работе с датами. Вот самые распространенные:
| Ошибка | Причина | Как избежать |
|---|---|---|
| Некорректный разделитель | Использование Строка() без учета локали |
Всегда используйте Формат() с явным указанием разделителя |
| Пустые даты в строках | Конкатенация с Дата(1,1,1) дает "01.01.0001" |
Проверяйте дату на пустоту перед преобразованием |
| Ошибки при интеграции | Передача даты в строковом виде во внешние системы | Используйте ISO-формат гггг-ММ-дд для API |
| Производительность в отчетах | Форматирование каждой строки в модуле | Настраивайте формат на уровне СКД |
Еще одна распространенная проблема — несоответствие форматов при обмене данными. Например, если вы получаете дату из Excel в формате "DD/MM/YYYY", а затем пытаетесь преобразовать ее в дату 1С без проверки, может возникнуть путаница с днем и месяцем.
Решение — всегда валидируйте входящие строковые даты:
Функция СтрокаВДату(СтрокаДата, ФорматСтроки = "dd.MM.yyyy")
Попытка
Возврат Формат(СтрокаДата, ФорматСтроки);
Исключение
// Попробуем альтернативные форматы
Попытка
Возврат Формат(СтрокаДата, "MM.dd.yyyy");
Исключение
Возврат Неопределено;
КонецПопытки;
КонецПопытки;
КонецФункции
Сравнительная таблица всех методов
| Метод | Преимущества | Недостатки | Рекомендации по использованию |
|---|---|---|---|
Формат() |
Максимальная гибкость, кроссплатформенность | Длинный синтаксис для сложных форматов | Универсальное решение для большинства задач |
Строка() |
Краткость, автоматически учитывает локаль | Непредсказуемый результат на разных системах | Только для внутреннего использования |
ПредставлениеДата() |
Учитывает пользовательские настройки, поддерживает прописные месяцы | Ограниченные возможности кастомизации | Для вывода пользователю в интерфейсе |
| Кастомные функции | Полный контроль, обработка ошибок | Требует дополнительного кода | Для сложной логики и интеграций |
| Форматирование в СКД | Высокая производительность в отчетах | Ограниченные возможности динамического изменения | Для отчетов и больших выборок |
FAQ: Частые вопросы по преобразованию дат в строки
Как вывести дату в формате "15 июня 2026 года" с учетом склонения?
Используйте функцию ПредставлениеДата() с параметром 1:
Результат = ПредставлениеДата(ТекущаяДата(), 1);
Для кастомного вывода с правильным склонением ("1 день", "2 дня", "5 дней") потребуется написать отдельную функцию с использованием ЧислоПрописью().
Почему функция Формат() возвращает ошибку при преобразовании строки в дату?
Скорее всего, формат строки не соответствует шаблону. Например, вы пытаетесь преобразовать "15/06/2026" с шаблоном "dd.MM.yyyy". Всегда проверяйте:
- Совпадают ли разделители (точка, слеш, тире)
- Корректно ли указан порядок дня/месяца
- Нет ли лишних символов (пробелов, букв)
Для надежного преобразования используйте функцию с обработкой исключений, как в примере выше.
Как преобразовать дату в строку для JSON?
Для JSON рекомендуется использовать формат ISO 8601:
Результат = Формат(Дата, "ДФ=гггг-ММ-ддТЧЧ:мм:сс"); // "2026-06-15T14:30:00"
Если нужно только дату без времени:
Результат = Формат(Дата, "ДФ=гггг-ММ-дд"); // "2026-06-15"
Можно ли получить название дня недели?
Да, для этого используйте комбинацию функций:
ДеньНедели = Формат(ТекущаяДата(), "ДН=Полное"); // "понедельник"
КраткийДень = Формат(ТекущаяДата(), "ДН=Сокращенное"); // "пн"
Для вывода типа "15 июня, суббота":
Результат = Формат(ТекущаяДата(), "ДФ=dd MMMM") + ", " + Формат(ТекущаяДата(), "ДН=Полное");
Как обработать ситуацию, когда дата может быть пустой?
Всегда проверяйте дату перед преобразованием:
Функция БезопаснаяДатаВСтроку(Дата, Формат = "dd.MM.yyyy", ПустаяКак = "")
Если Дата = Дата(1,1,1) Тогда
Возврат ПустаяКак;
Иначе
Возврат Формат(Дата, "ДФ=" + Формат);
КонецЕсли;
КонецФункции
Использование:
Результат = БезопаснаяДатаВСтроку(Документ.ДатаДоставки, , "не указана");