Как в 1С преобразовать дату в строку формата ГГГГММДД без разделителей?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С:Предприятие крайне часто возникает задача преобразования стандартного значения типа Дата в строковое представление без каких-либо разделителей (точек, пробелов, дефисов или косых черт). Классический пример — получение строки вида "20190616" из даты "16.06.2019". Такая задача регулярно встает при выгрузке данных в различные внешние системы, формировании уникальных номеров файлов, генерации штрихкодов или интеграции веб-сервисов через API.

Давайте подробно разберем, как решить эту задачу наиболее красивым, быстрым и правильным с точки зрения стандартов платформы 1С способом. Мы проанализируем различные подходы, рассмотрим тонкости синтаксиса, а также обсудим сопутствующие важные нюансы, такие как обратное преобразование, форматирование в запросах и использование СКД.

Решение проблемы: правильное использование функции Формат()

Для решения нашей задачи идеально подходит встроенная функция языка 1С Формат(). На форумах часто предлагаются избыточные варианты, включающие замену символов с помощью функции СтрЗаменить(), однако платформа предоставляет элегантный встроенный механизм прямого форматирования.

Секрет заключается в использовании форматной строки с параметром ДФ (формат даты). Посмотрим на правильный и лаконичный пример кода:


// Исходная дата
ИсходнаяДата = Дата(2019, 6, 16);

// Преобразование в строку без разделителей
СтрокаДаты = Формат(ИсходнаяДата, "ДФ=yyyyMMdd");

// Результат: "20190616"
Сообщить(СтрокаДаты);

Давайте проанализируем, почему этот код работает именно так. Параметр ДФ=yyyyMMdd указывает платформе, что дату нужно представить в виде четырех цифр года (yyyy), двух цифр месяца (MM) и двух цифр дня (dd). Поскольку между этими символами шаблона мы не поставили никаких разделителей (например, точек), 1С сформирует сплошную строку из цифр.

Важные нюансы: Языковые стандарты и регистр символов

При составлении форматной строки начинающие разработчики часто совершают ошибки из-за невнимательности к регистру букв или языковым спецификациям. Выясним важные правила работы с масками дат:

  1. Русский и английский варианты написания. Платформа 1С полностью двуязычна. Вы можете использовать как английскую спецификацию шаблона, так и ее русский аналог. Оба варианта отработают абсолютно идентично:
    
    // Английский вариант:
    СтрокаДатыАнгл = Формат(ТекущаяДата(), "ДФ=yyyyMMdd");
    
    // Русский вариант:
    СтрокаДатыРус = Формат(ТекущаяДата(), "ДФ=ггггММдд");
    
    В русскоязычной среде разработки принято использовать вариант ггггММдд, так как он более нагляден для программистов.
  2. Критическая важность регистра символов. Обратите внимание, что месяц обозначается именно заглавными буквами ММ (или английскими MM). Если вы ошибетесь и напишете строчные буквы мм (или mm), платформа интерпретирует их как минуты времени! В результате вместо номера месяца вы получите минуты текущего времени, что приведет к трудноуловимым ошибкам в коде.
    
    // Ошибка: использование строчных "мм" выведет минуты вместо месяца!
    НевернаяСтрока = Формат(ТекущаяДата(), "ДФ=ггггммдд"); // Не используйте этот вариант!
    

Почему региональные настройки не подходят для этой задачи

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

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

Обратное преобразование: как из строки ГГГГММДД получить тип Дата

Формат представления даты без разделителей чрезвычайно удобен тем, что является стандартным для платформы 1С при создании объекта типа Дата из строкового значения. Если в вашей задаче требуется выполнить обратное преобразование полученной строки обратно в дату, вам не понадобятся сложные манипуляции со строковыми функциями.

Конструктор Дата() нативно понимает этот формат. Рассмотрим пример:


СтрокаГГГГММДД = "20190616";

// Преобразование строки обратно в дату
ПолученнаяДата = Дата(СтрокаГГГГММДД);

// Результат будет содержать тип Дата: 16.06.2019 00:00:00
Сообщить(ПолученнаяДата);

Для сравнения, если вы попытаетесь передать в конструктор строку с точками, например Дата("16.06.2019"), платформа 1С вызовет ошибку времени выполнения. Если же вам все-таки приходится разбирать строки с произвольными разделителями, рекомендуется использовать готовую функцию из Библиотеки стандартных подсистем (БСП): СтроковыеФункцииКлиентСервер.СтрокаВДату().

Как форматировать дату в запросах и СКД

Важно помнить, что функция встроенного языка Формат() выполняется непосредственно на сервере или клиенте 1С, но её категорически нельзя использовать внутри текста запроса, так как СУБД ничего не знает о функциях встроенного языка.

Если вам требуется вывести дату в формате без разделителей в вашем отчете, правильнее делать это не в коде запроса, а через стандартные механизмы оформления:

  1. В Системе компоновки данных (СКД):
    • Откройте вкладку «Наборы данных» в схеме компоновки вашего отчета.
    • Найдите поле, содержащее дату, и перейдите к колонке «Оформление».
    • Нажмите на кнопку выбора, найдите параметр «Формат».
    • В появившемся окне конструктора форматной строки укажите выражение: ДФ=ггггММдд.
  2. В Динамических списках и элементах формы:
    • Выберите элемент формы (например, поле ввода или колонку таблицы), связанный с реквизитом даты.
    • В палитре свойств найдите свойство «Формат» (или «Формат редактирования»).
    • Задайте форматную строку ДФ=ггггММдд. В результате пользователь увидит дату в нужном вам виде без изменения самой логики хранения данных в базе.

Альтернатива для интеграций — XMLСтрока

Если преобразование даты в строку без разделителей требуется вам для передачи данных во внешние системы (например, через REST API, JSON или XML-файлы), рассмотрите возможность использования системной функции XMLСтрока вместо ручного составления маски.

Посмотрим на пример работы этой функции:


// Преобразование текущей даты в XML-формат
СтрокаДляЭкспорта = XMLСтрока(ТекущаяДата());

// Результат вернет строку стандарта ISO 8601: "2019-06-16T14:30:00"
Сообщить(СтрокаДляЭкспорта);

Такой формат является общепринятым стандартом в веб-разработке. Сторонним сервисам, написанным на других языках программирования, будет значительно проще распарсить стандартную ISO-строку, чем монолитную последовательность цифр вида 20190616.

Избегайте устаревших legacy-подходов («кустарной» сборки дат)

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


// Пример устаревшего и неэффективного кода, который НЕ стоит использовать
СтрокаДаты = Формат(Год(Дата), "ЧГ=0") + Прав("0" + Месяц(Дата), 2) + Прав("0" + День(Дата), 2);

Давайте проанализируем, почему этот код плох. Во-первых, он невероятно громоздкий и ухудшает читаемость алгоритма. Во-вторых, он работает медленнее, так как платформа вынуждена выполнять несколько арифметических и строковых операций вместо одного вызова оптимизированной системной функции. Использование стандартной форматной строки ДФ=ггггММдд — это единственно верный, быстрый и лаконичный инструмент в арсенале профессионального разработчика 1С.

← На главную