К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как в 1С преобразовать дату: практическое руководство

Как в 1С преобразовать дату в строку, число и нужный формат: Формат(), Дата(), Строка(), работа в запросах и типичные ошибки с примерами кода.

Дата — один из самых часто используемых типов данных в 1С, и почти каждая доработка рано или поздно упирается в задачу её преобразования: вывести дату в печатной форме в нужном виде, передать значение в строку подключения или HTTP-запрос, сравнить дату из документа с датой из внешнего файла, получить из строки «31.12.2026» настоящее значение типа Дата. Встроенный язык 1С даёт для этого несколько инструментов, и у каждого — свои ограничения.

Главная сложность в том, что тип Дата в 1С хранит и день, и время с точностью до секунды, а «преобразование» может означать разное: смену формата отображения, превращение в строку, разбор строки обратно в дату, отсечение времени или сдвиг на заданное число дней. Ниже разобраны все основные сценарии с готовыми фрагментами кода, которые можно переносить в свои модули.

Как устроен тип Дата в 1С и почему это важно

Тип Дата в 1С всегда содержит и календарную часть, и время. Значение «15.03.2026 00:00:00» и «15.03.2026 14:30:00» — это разные значения, хотя относятся к одному дню. Именно поэтому сравнение ДатаДокумента = '20260315' часто даёт ложь, если в документе время не нулевое. Прежде чем преобразовывать дату, определитесь, что вам нужно: само значение, его строковое представление или граница периода.

Пустая дата в 1С — это значение '00010101000000' (1 января 0001 года, 00:00:00). Проверка на пустоту выполняется функцией ЗначениеЗаполнено(Дата) или сравнением с Дата(1,1,1). Попытка отформатировать пустую дату без проверки — частый источник «мусорных» строк вида «01.01.0001» в печатных формах и выгрузках.

Преобразование даты в строку функцией Формат()

Основной инструмент — функция Формат(Значение, ФорматнаяСтрока). Для дат форматная строка строится из шаблонов: д — день, М — месяц, г — год, ч — часы, м — минуты, с — секунды. Регистр и количество символов влияют на результат: гг даст две цифры года, гггг — четыре, ММММ — полное название месяца.

ДатаДокумента = ТекущаяДатаСеанса();

Строка1 = Формат(ДатаДокумента, "ДФ='дд.ММ.гггг'"); // 15.03.2026

Строка2 = Формат(ДатаДокумента, "ДФ='дд.ММ.гггг ЧЧ:мм'"); // 15.03.2026 14:30

Строка3 = Формат(ДатаДокумента, "ДФ='д ММММ гггг'"); // 15 марта 2026

Строка4 = Формат(ДатаДокумента, "ДФ=yyyyMMdd"); // 20260315

Если форматная строка не задана, применяется региональный формат по умолчанию, который зависит от настроек сеанса и кода локализации. Это опасно при обмене данными: на одном сервере дата выгрузится как «15.03.2026», на другом — как «03/15/2026». Для файлов обмена, веб-сервисов и HTTP-запросов всегда задавайте формат явно, лучше всего — ISO-подобный yyyy-MM-dd или yyyy-MM-ddTHH:mm:ss.

1c
// Универсальная строка для обмена с внешними системами
СтрокаДляAPI = Формат(ДатаДокумента, "ДФ='гггг-ММ-ддTЧЧ:мм:сс'"); // 2026-03-15T14:30:00

Преобразование строки в дату

Обратная задача — получить значение типа Дата из строки. Конструктор Дата() принимает либо числовые параметры Дата(Год, Месяц, День, Час, Минута, Секунда), либо строку строго в формате «ГГГГММДДччммсс», где время можно опустить: Дата("20260315"). Любое отклонение от шаблона — лишние точки, другой порядок — приведёт к ошибке преобразования.

Если строка приходит в произвольном виде («15.03.2026», «15/03/24», «15 марта»), надёжного встроенного парсера нет. Стандартный подход — разобрать строку вручную через СтрРазделить() и собрать дату из чисел, предварительно проверив каждую часть:

Функция СтрокаВДату(СтрокаДаты)

Части = СтрРазделить(СтрокаДаты, ".");

Если Части.Количество() <> 3 Тогда

Возврат Дата(1,1,1); // не удалось разобрать

КонецЕсли;

Попытка

Возврат Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));

Исключение

Возврат Дата(1,1,1);

КонецПопытки;

КонецФункции

Обязательно оборачивайте разбор в Попытка...Исключение и проверяйте результат на пустую дату. Внешние файлы (Excel, CSV, выгрузки банков) регулярно содержат битые значения, и одно исключение без обработки остановит всю загрузку.

Отсечение времени и работа с границами периода

Чтобы сравнивать даты без учёта времени или строить отборы за день, используются функции НачалоДня(Дата) и КонецДня(Дата). Первая возвращает 00:00:00 указанного дня, вторая — 23:59:59. Типовой отбор документов за день выглядит так: Дата >= НачалоДня(День) И Дата <= КонецДня(День).

Аналогично работают НачалоМесяца(), КонецМесяца(), НачалоКвартала(), НачалоГода(), НачалоНедели() и парные им функции конца периода. Для сдвига даты служит ДобавитьМесяц(Дата, ЧислоМесяцев) — единственная корректная функция арифметики с месяцами, потому что она учитывает разную длину месяцев. Сдвиг на дни выполняется простым сложением: в 1С единица арифметики дат — секунда, поэтому день — это 86400.

СледующийДень = ДатаДокумента + 86400;           // +1 день

ЧерезМесяц = ДобавитьМесяц(ДатаДокумента, 1); // корректно для 31 января

РазностьДней = (Дата2 - Дата1) / 86400; // число дней между датами

Типичные ошибки
01
Сравнение дат с временем без НачалоДня()/КонецДня() — документы за день частично выпадают из отбора
02
Сдвиг даты на месяц сложением 30*86400 вместо ДобавитьМесяц() — съезжают даты в длинных и коротких месяцах
03
Разбор строки Дата("15.03.2026") — конструктор ожидает только ГГГГММДДччммсс и выдаёт ошибку
04
Вывод пустой даты без проверки — в печатной форме появляется «01.01.0001»

Преобразование дат в запросах

В языке запросов действуют свои функции. Конструктор ДАТАВРЕМЯ(2026, 3, 15, 14, 30, 0) создаёт литерал даты, НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) и КОНЕЦПЕРИОДА(&Дата, ДЕНЬ) отсекают время, ДОБАВИТЬКДАТЕ(&Дата, МЕСЯЦ, 1) сдвигает дату, а РАЗНОСТЬДАТ(Дата1, Дата2, ДЕНЬ) считает интервал. Периодичность указывается ключевым словом: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД.

Важное ограничение: в запросе нельзя вызвать функцию Формат() — преобразование даты в строку с нужным шаблоном делается уже после выполнения запроса, при обходе выборки. Если дата нужна в тексте самого запроса (например, для сравнения), передавайте её параметром типа Дата, а не подставляйте строкой в текст запроса — это и безопаснее, и быстрее.

Где преобразовывать дату

Встроенный язык (модуль)

Полный набор функций: Формат(), Дата(), НачалоДня(), ДобавитьМесяц(). Подходит для любой логики, но требует обхода данных в коде.

Язык запросов

ДАТАВРЕМЯ(), НАЧАЛОПЕРИОДА(), ДОБАВИТЬКДАТЕ(), РАЗНОСТЬДАТ(). Эффективнее для отборов и группировок по периодам, но нет форматирования в строку.

СКД (схема компоновки)

Формат задаётся в настройках поля через оформление, вычисляемые поля поддерживают функции дат. Удобно для отчётов без программирования.

Форматирование дат в печатных формах и представлениях

В макетах печатных форм дату обычно готовят заранее в коде и передают в параметр области уже строкой: Область.Параметры.ДатаСтрокой = Формат(Шапка.Дата, "ДЛФ=D"). Параметр ДЛФ=D даёт длинный формат «15 марта 2026 г.» с учётом локали, ДЛФ=DD добавляет день недели. Это удобно для документов, где требуется «прописная» дата.

Для реквизитов форм и колонок таблиц формат можно задать декларативно — в свойствах элемента формы или поля компоновки, без единой строки кода. Если требуется нестандартный вид (например, «15.03» без года для графика), используйте событие ПриПолученииДанных или форматную строку в свойстве «Формат» поля.

Проверка результата и контрольные точки

После любого преобразования полезно убедиться, что получилось именно то, что ожидалось. Самый быстрый способ — вывести значение через Сообщить() в отладке или проверить в табло (Alt+F2 в конфигураторе). Для обратного преобразования контрольный приём — «кольцевой тест»: преобразуйте дату в строку, строку обратно в дату и сравните с исходным значением.

Контрольные точки

Как проверить результат

Строка после Формат()
Норма

Порядок дня, месяца и года соответствует шаблону, разделители на местах

Тревожный признак

Месяц и день перепутаны, год двузначный вместо четырёхзначного

Дата после разбора строки
Норма

Значение не равно 01.01.0001, день и месяц соответствуют источнику

Тревожный признак

Пустая дата или сдвиг на месяц из-за перепутанного порядка частей

Отбор за период
Норма

В выборку попадают все документы с 00:00:00 до 23:59:59 последнего дня

Тревожный признак

Документы за последний день теряются — вероятно, использовано сравнение с НачалоДня() вместо КонецДня()

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

Итог

Что важно запомнить

Дата в 1С всегда содержит время — отсекайте его НачалоДня()/КонецДня(). В строку дату преобразуют через Формат() с явным шаблоном, строку в дату — через Дата(год, месяц, день) или строку ГГГГММДД. В запросах используются ДАТАВРЕМЯ(), НАЧАЛОПЕРИОДА() и ДОБАВИТЬКДАТЕ(). Для обмена с внешними системами всегда фиксируйте формат явно.

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

Как получить из даты только год, месяц или день числом?

Используйте функции Год(Дата), Месяц(Дата), День(Дата), Час(Дата), Минута(Дата), Секунда(Дата) — они возвращают числа. Также доступны ДеньНедели(Дата) (1 — понедельник), ДеньГода(Дата) и НеделяГода(Дата).

Почему Дата("15.03.2026") выдаёт ошибку?

Строковый конструктор Дата() принимает значение только в формате «ГГГГММДДччммсс» без разделителей: Дата("20260315"). Строку с точками нужно сначала разобрать через СтрРазделить() и собрать дату из числовых параметров.

Как вычесть из даты один день?

Арифметика дат в 1С идёт в секундах, поэтому: Вчера = ДатаДокумента - 86400;. Чтобы получить начало вчерашнего дня, дополнительно примените НачалоДня(): НачалоДня(ТекущаяДатаСеанса() - 86400).

Чем ТекущаяДата() отличается от ТекущаяДатаСеанса()?

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

Как преобразовать дату в число и обратно?

Прямого преобразования даты в число нет. Обычно используют строковое представление Формат(Дата, "ДФ=yyyyMMdd") с последующим Число() для сортировки или сравнения, либо разность дат в секундах: ЧислоСекунд = Дата2 - Дата1.

Как в запросе сгруппировать документы по месяцам?

Добавьте в выборку поле НАЧАЛОПЕРИОДА(Документ.Дата, МЕСЯЦ) КАК Период и сгруппируйте по нему. При обходе результата отформатируйте период функцией Формат() с шаблоном «ММММ гггг» для отображения названия месяца.