Дата в строку в 1С: функция Формат, Строка и обход ограничений запроса

· 9 мин

Содержание

Чтобы преобразовать дату в строку в 1С, используйте Формат(Дата, "ДФ=dd.MM.yyyy") — получите 16.10.2026. Частая ошибка — писать то же самое в тексте запроса через ВЫРАЗИТЬ(Дата КАК СТРОКА(10)): язык запросов так не умеет и вернёт ошибку. В запросе дату оставляют датой, а в строку переводят уже в коде, в СКД или в форме.

Ниже — функции встроенного языка с примерами, коды формата, работа с частями даты и часовыми поясами, а также приёмы для запросов и отчётов. Всё проверено на платформе 8.3 в русской локали.

Функция Формат: как превратить дату в строку с нужной маской

Формат() — главный инструмент. Первый параметр — значение, второй — строка форматирования из пар Параметр=Значение, разделённых точкой с запятой.

Для дат нужны три параметра:

  • 📅 ДФ — «формат даты», произвольная маска из символов дня, месяца, года и времени;
  • 🗓 ДЛФ — «локальный формат даты», готовые варианты отображения;
  • ⛔ ДП — «пустая дата», текст, который выведется вместо 01.01.0001.

Произвольная маска через ДФ

Д = Дата(2026, 10, 16, 9, 5, 7);

Формат(Д, "ДФ=dd.MM.yyyy");            // 16.10.2026
Формат(Д, "ДФ=yyyy-MM-dd");            // 2026-10-16
Формат(Д, "ДФ=yyyyMMdd");              // 20261016
Формат(Д, "ДФ='dd MMMM yyyy'");        // 16 октября 2026
Формат(Д, "ДФ='dd.MM.yyyy HH:mm:ss'"); // 16.10.2026 09:05:07
Формат(Д, "ДФ=HH:mm");                 // 09:05

Если в маске есть пробел, двоеточие или другие разделители, кроме точки и дефиса, берите маску в одинарные кавычки. Так платформа не спутает разделитель с концом параметра.

Регистр важен. MM — месяц, mm — минуты. HH — часы от 0 до 23, hh — от 1 до 12. Перепутать MM и mm — самая частая причина «странных» дат вроде 16.05.2026, где 05 — это минуты.

Символы маски можно писать и кириллицей: "ДФ=дд.ММ.гггг" даст тот же результат, что и "ДФ=dd.MM.yyyy". Выберите один вариант и держитесь его во всей конфигурации — так код проще читать.

Готовые форматы через ДЛФ

Когда точная маска не важна, а нужен привычный вид, подойдёт ДЛФ:

Формат(Д, "ДЛФ=D");   // 16.10.2026
Формат(Д, "ДЛФ=DD");  // 16 октября 2026 г.
Формат(Д, "ДЛФ=T");   // 9:05:07
Формат(Д, "ДЛФ=DT");  // 16.10.2026 9:05:07
Формат(Д, "ДЛФ=DDT"); // 16 октября 2026 г. 9:05:07

Вывод ДЛФ зависит от локали сеанса. Для печатных форм и выгрузок, где формат должен быть одинаковым у всех, надёжнее явная маска ДФ.

Пустая дата

Незаполненная дата в 1С — это '00010101000000'. Без настройки Формат() вернёт для неё пустую строку, а Строка() — 01.01.0001 0:00:00. Оба варианта плохо смотрятся в отчёте.

Формат(ДатаОплаты, "ДФ=dd.MM.yyyy; ДП='не оплачено'");

Параметры комбинируются в одной строке через ;. Порядок не важен.

Функция Строка и другие простые способы привести дату к строке

Иногда маска не нужна вовсе — достаточно получить текст. Для этого есть несколько функций, и у каждой своё назначение.

Строка()

Строка(ТекущаяДатаСеанса()); // 16.10.2026 9:05:07

Строка() выводит дату в формате локали вместе со временем. Убрать время она не умеет. Годится для отладки, сообщений пользователю и логов, но не для печатных форм.

Результат Строка() зависит от локали информационной базы и сеанса. Код, который режет такую строку через Лев() или Сред(), сломается у пользователя с другой локалью. Для разбора используйте части даты, а не подстроки.

XMLСтрока()

XMLСтрока(Д); // 2026-10-16T09:05:07

Возвращает дату в формате ISO 8601 без смещения часового пояса. Результат не зависит от локали, поэтому это лучший вариант для обменов, файлов XML и ключей в соответствиях. Обратное преобразование — XMLЗначение(Тип("Дата"), "2026-10-16T09:05:07").

Дата для JSON

При записи JSON через ЗаписатьJSON() дата сериализуется автоматически. Если нужна строка вручную, есть ЗаписатьДатуJSON() с выбором формата (ФорматДатыJSON.ISO, ФорматДатыJSON.JavaScript, ФорматДатыJSON.Microsoft) и варианта записи (ВариантЗаписиДатыJSON.ЛокальнаяДата, ВариантЗаписиДатыJSON.УниверсальнаяДата и др.).

Сравнение способов

СпособПример результатаКогда использоватьРиски
Формат(Д, "ДФ=...")16.10.2026Печатные формы, имена файлов, интерфейсПерепутанные MM/mm
Формат(Д, "ДЛФ=DD")16 октября 2026 г.Текст для человекаЗависит от локали
Строка(Д)16.10.2026 9:05:07Отладка, логиВремя не убрать, локаль
XMLСтрока(Д)2026-10-16T09:05:07Обмен, ключи, хранениеНет часового пояса
ЗаписатьДатуJSON()2026-10-16T09:05:07REST, JSONНужно явно выбрать вариант

Части даты: день, месяц и год по отдельности

Бывает нужно не готовое представление, а отдельные компоненты: номер месяца для расчёта, год для имени папки, день недели для графика.

Год(Д);         // 2026
Месяц(Д);       // 10
День(Д);        // 16
Час(Д);         // 9
Минута(Д);      // 5
Секунда(Д);     // 7
ДеньНедели(Д);  // 5 (пятница; понедельник = 1)
ДеньГода(Д);    // 289
НеделяГода(Д);  // номер недели в году

Все эти функции возвращают число. Если склеить их со строкой напрямую, получится сюрприз:

Строка(Год(Д));       // 2026 — нормально
"Год: " + Год(Д);     // Год: 2 026 — неразрывный пробел-разделитель тысяч

Число при неявном приведении форматируется с группировкой разрядов. Для года и других чисел без разделителей используйте Формат(Год(Д), "ЧГ=0") — это отключает группировку.

Ведущий ноль у дня и месяца

Месяц(Д) вернёт 5, а не 05. Если собираете строку вручную, добавьте ноль через формат числа:

Формат(Месяц(Д), "ЧЦ=2; ЧВН=");  // 05

ЧЦ=2 — две цифры, ЧВН — выводить ведущие нули. Проще, правда, сразу взять Формат(Д, "ДФ=MM").

Название месяца и дня недели

Формат(Д, "ДФ=MMMM");        // Октябрь
Формат(Д, "ДФ='dd MMMM'");   // 16 октября
Формат(Д, "ДФ=MMM");         // окт
Формат(Д, "ДФ=dddd");        // пятница
Формат(Д, "ДФ=ddd");         // Пт

Если рядом с месяцем стоит день, платформа сама ставит месяц в родительный падеж: «16 октября», а не «16 Октябрь». Отдельно стоящий месяц выводится в именительном падеже. Регистр первой буквы может отличаться в разных версиях платформы. Если он критичен, оберните результат в ТРег() или НРег().

Время, локаль и часовые пояса при преобразовании даты в строку

Тип Дата в 1С не хранит часовой пояс. Это просто «год-месяц-день-часы-минуты-секунды». Какое время в нём лежит, решает код, который дату записал.

Какую текущую дату брать

ФункцияЧто возвращает
ТекущаяДата()Время компьютера, где выполняется код (клиент или сервер)
ТекущаяДатаСеанса()Время в часовом поясе сеанса
ТекущаяУниверсальнаяДата()Время UTC сервера

Для документов и отметок времени в базе берите ТекущаяДатаСеанса(). ТекущаяДата() на клиенте и на сервере может давать разные значения, если компьютеры в разных поясах или часы на одном из них сбиты.

Строка со смещением пояса

XMLСтрока() не добавляет +03:00. Если внешний сервис требует полный ISO 8601 со смещением, соберите строку сами:

Смещение = СмещениеСтандартногоВремени(ЧасовойПоясСеанса(), Д) / 3600;
Знак = ?(Смещение >= 0, "+", "-");
ISOСтрока = Формат(Д, "ДФ=yyyy-MM-dd") + "T" + Формат(Д, "ДФ=HH:mm:ss")
	+ Знак + Формат(Макс(Смещение, -Смещение), "ЧЦ=2; ЧВН=; ЧН=00") + ":00";
// 2026-10-16T09:05:07+03:00

Пример рассчитан на пояса с целым числом часов. Для поясов вроде +05:30 добавьте расчёт минут.

Перевод между местным и универсальным временем делают функции УниверсальноеВремя(Д, ЧасовойПояс) и МестноеВремя(Д, ЧасовойПояс). Сначала переводите дату, потом форматируйте — не наоборот.

Другой язык вывода

Параметр Л задаёт локаль конкретного вызова:

Формат(Д, "Л=en_US; ДФ='dd MMMM yyyy'"); // 16 October 2026
Формат(Д, "Л=ru_RU; ДЛФ=DD");            // 16 октября 2026 г.

Это удобно для двуязычных печатных форм, договоров с иностранными контрагентами и инвойсов.

Как быть с датой в запросе 1С

Здесь ответ короткий: язык запросов не переводит дату в строку. Конструкция ВЫРАЗИТЬ(Документ.Дата КАК СТРОКА(10)) вызовет ошибку, а функции вроде Формат() в тексте запроса недоступны.

Что делать вместо этого — зависит от задачи.

Нужна группировка по дню, месяцу, году

Не превращайте дату в строку ради группировки. Округлите её функцией НАЧАЛОПЕРИОДА:

ВЫБРАТЬ
	НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ) КАК Месяц,
	СУММА(Продажи.Сумма) КАК Сумма
ИЗ
	РегистрНакопления.Продажи КАК Продажи
СГРУППИРОВАТЬ ПО
	НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ)

Результат остаётся датой, сортируется правильно, а в строку «Октябрь 2026» его превращают при выводе.

Нужны числовые части даты

В запросе доступны ГОД(), КВАРТАЛ(), МЕСЯЦ(), ДЕНЬМЕСЯЦА(), ДЕНЬГОДА(), НЕДЕЛЯ(), ДЕНЬНЕДЕЛИ(), ЧАС(), МИНУТА(), СЕКУНДА(). Они возвращают числа, по ним можно отбирать и группировать:

ГДЕ
	ГОД(Документ.Дата) = 2026
	И МЕСЯЦ(Документ.Дата) = 10

Для отбора за период надёжнее и быстрее условие МЕЖДУ &НачалоПериода И &КонецПериода: оно использует индекс по полю даты, а функции от поля — нет.

Нужна строка в результате

Форматируйте после выполнения запроса:

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	ДатаСтрокой = Формат(Выборка.Дата, "ДФ=dd.MM.yyyy");
	// ...
КонецЦикла;

Если результат выгружается в таблицу значений, добавьте строковую колонку и заполните её в цикле.

В отчёте на СКД

В схеме компоновки данных есть два пути:

  1. Оформление поля. На закладке «Наборы данных» у поля откройте колонку «Оформление» и задайте параметр «Формат», например ДФ=dd.MM.yyyy. Поле остаётся датой, сортировка и группировки работают.
  2. Вычисляемое поле. На закладке «Вычисляемые поля» добавьте поле с выражением Формат(Дата, "ДФ=dd.MM.yyyy"). Получите строку — её удобно сцеплять с другим текстом.

Первый путь лучше почти всегда. Строковое поле сортируется как текст, и 02.11.2026 окажется раньше 16.10.2026.

Где вам нужна дата строкой?

На управляемой форме

Если дата нужна только для показа, строковый реквизит не заводите. У поля формы есть свойства «Формат» и «Формат редактирования» — укажите там ДФ=dd.MM.yyyy, и поле будет выглядеть как нужно, оставаясь датой.

Шпаргалка: популярные форматы даты в 1С

Результаты для даты 16.10.2026 09:05:07, локаль ru_RU.

Строка форматаРезультатГде пригодится
ДФ=dd.MM.yyyy16.10.2026Документы, печатные формы
ДФ=dd.MM.yy16.10.26Узкие колонки отчётов
ДФ=yyyy-MM-dd2026-10-16Обмены, SQL, сортировка
ДФ=yyyyMMdd20261016Ключи, литералы Дата("20261016")
ДФ=yyyyMMdd_HHmmss20261016_090507Имена файлов и архивов
ДФ='dd MMMM yyyy'16 октября 2026Договоры, письма
ДФ='MMMM yyyy'Октябрь 2026Заголовки по месяцам
ДФ=HH:mm09:05Время без секунд
ДФ='dd.MM.yyyy HH:mm'16.10.2026 09:05Журналы, протоколы
ДЛФ=D16.10.2026Короткая дата по локали
ДЛФ=DD16 октября 2026 г.Длинная дата по локали
ДЛФ=DT16.10.2026 9:05:07Дата и время по локали
ДФ=ddddпятницаГрафики, расписания

Строку обратно в дату превращает Дата("20261016") или Дата("20261016090507") — только из формата ГГГГММДД[ччммсс] без разделителей. Строку 16.10.2026 так не прочитать: её сначала разбирают по частям через СтрРазделить() и собирают Дата(Год, Месяц, День).

Ошибки при конвертации даты в строку и как их избежать

Диагностика: выберите симптом

Производительность

Формат() — быстрая функция, вызывать её в цикле на десятки тысяч строк нормально. Тормоза обычно появляются по другим причинам:

  • 🐢 дату форматируют в запросе обходными путями — склейкой через ВЫБОР КОГДА по месяцам и дням. Запрос раздувается, а пользы нет;
  • 🐢 по строковому ключу ищут в таблице значений с миллионом строк. Ищите по дате — сравнение дат быстрее, и индекс по колонке типа Дата работает так же хорошо;
  • 🐢 в отборе запроса стоит ГОД(Поле) = 2026. Функция от поля мешает использовать индекс. Пишите Поле МЕЖДУ &Начало И &Конец.

Храните даты датами, а в строку переводите только на выводе. Это правило снимает большую часть ошибок с сортировкой, локалью и сравнением.

Частые вопросы

Как получить дату без времени строкой?
Формат(Д, "ДФ=dd.MM.yyyy") или Формат(Д, "ДЛФ=D"). Функция Строка() время не отбрасывает.
Как вывести «16 октября 2026 года» со словом «года»?
Соберите строку: Формат(Д, "ДФ='dd MMMM yyyy'") + " года". Так проще, чем экранировать текст внутри маски.
Почему Формат возвращает пустую строку?
Скорее всего, дата пустая (01.01.0001). Добавьте параметр ДП с нужным текстом или проверьте значение на Дата(1, 1, 1).
Можно ли использовать Формат в тексте запроса?
Нет. В запросе доступны только функции языка запросов. Формат() применяйте к результату или в выражениях СКД.
Какой формат выбрать для имени файла?
yyyyMMdd_HHmmss. В нём нет запрещённых в именах файлов символов, и файлы сортируются по времени создания.