При разработке в среде 1С:Предприятие часто возникает задача преобразования стандартной даты в строковый формат без разделителей (например, в вид 28022010235859). Это крайне важно при выгрузке данных в текстовые файлы, формировании уникальных идентификаторов документов, работе с веб-сервисами (API) или интеграции с внешними системами. В этой статье мы подробно разберем, как правильно решить эту задачу, почему возникают популярные ошибки разработчиков и как быстро получить год из даты различными способами.
Давайте проанализируем ситуацию, с которой сталкиваются многие разработчики. Нам нужно получить строку формата "ДеньМесяцГодЧасыМинутыСекунды" без лишних знаков. Попытка написать код следующим образом приводит к некорректному результату:
// Попытка преобразования, которая вернет строку с разделителями
СтрокаДата = Формат(ТекущаяДата(), "ггггММддЧЧммсс");
Вместо ожидаемой сплошной строки цифр система выдает стандартное представление даты с точками и двоеточиями, например: 28.02.2010 23:58:59. Выясним причину такого поведения платформы.
Функция Формат() принимает вторым параметром специальную форматную строку. Для работы с датами эта строка обязательно должна строиться по строгому шаблону и начинаться с префикса ДФ= (произвольный формат даты на русском) или DF= (на английском). Если этот префикс не указан, платформа 1С не может распознать инструкцию форматирования, игнорирует некорректный параметр и возвращает дату в стандартном системном представлении по умолчанию.
Чтобы преобразовать дату в строку нужного нам формата без разделителей (ровно 14 символов: ДДММГГГГЧЧММСС), воспользуемся правильной конструкцией. Мы можем написать ее как на русском, так и на английском языке — поведение системы будет абсолютно идентичным.
Вариант на русском языке:
ТекДата = ТекущаяДата(); // Представим, что дата: 28.02.2010 23:58:59
СтрокаДата = Формат(ТекДата, "ДФ=ддММггггЧЧммсс");
// Результат: "28022010235859"
Вариант на английском языке:
ТекДата = ТекущаяДата();
СтрокаДата = Формат(ТекДата, "DF=ddMMyyyyHHmmss");
// Результат: "28022010235859"
Рассмотрим подробнее каждый символ, используемый в нашей форматной строке, чтобы понять логику ее построения:
дд / dd — день месяца (две цифры с лидирующим нулем, если день меньше 10);ММ / MM — номер месяца (две цифры с лидирующим нулем, обязательно в верхнем регистре);гггг / yyyy — год в четырехзначном формате (например, 2010);ЧЧ / HH — час в 24-часовом формате (две цифры с лидирующим нулем, в верхнем регистре);мм / mm — минуты (две цифры, обязательно в нижнем регистре);сс / ss — секунды (две цифры).Важно: соблюдайте регистр символов! В платформе 1С регистр символов в форматной строке имеет решающее значение. Если вы перепутаете регистр букв М и м, система выдаст неверные данные. Например, написав строчные мм на месте месяца, вы подставите туда текущие минуты. А написав строчные чч (или hh), вы получите 12-часовой формат времени вместо стандартного 24-часового ЧЧ (или HH), что критично при выгрузках.
Если перед вами стоит задача извлечь только год из даты, решение будет зависеть от того, в каком типе данных вам нужен результат — в виде строки или в виде числа.
Способ 1. Получение года в виде строки (Тип: Строка)
Для этого мы снова используем функцию Формат(), но передаем в шаблон только символы года:
ГодСтрокой = Формат(ТекДата, "ДФ=гггг");
// Результат: "2010" (Тип: Строка)
Если вам требуется получить год в сокращенном двухзначном виде (без века), используйте две буквы гг:
ГодСокращенный = Формат(ТекДата, "ДФ=гг");
// Результат: "10" (Тип: Строка)
Способ 2. Получение года в виде числа (Тип: Число)
Если вам нужно выполнять математические операции или сравнения, лучше получить год в виде числа. Для этого в 1С существует простая встроенная функция Год():
ГодЧислом = Год(ТекДата);
// Результат: 2010 (Тип: Число)
Разработчикам не обязательно постоянно заучивать наизусть все спецсимволы форматирования (дд, ММ, гггг и т.д.). В конфигураторе 1С предусмотрен удобный визуальный помощник. Давайте разберем по шагам, как им воспользоваться:
Формат(ТекДата, )."ДФ=ddMMyyyyHHmmss").В некоторых случаях для интеграционных задач (например, при передаче данных в JSON или XML) может потребоваться альтернативный вариант преобразования даты. Рассмотрим метод с использованием функции XMLСтрока().
Функция XMLСтрока(ТекДата) преобразует дату по международному стандарту ISO 8601 в формат YYYY-MM-DDTHH:mm:ss. Чтобы получить сплошную строку без разделителей, мы можем программно удалить все лишние символы при помощи функции СтрЗаменить():
// Шаг 1: Получаем стандартную XML-строку, например "2010-02-28T23:58:59"
СтрокаXML = XMLСтрока(ТекДата);
// Шаг 2: Последовательно удаляем разделители "-", ":" и символ "T"
ЧистаяСтрока = СтрЗаменить(СтрокаXML, "-", "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, ":", "");
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, "T", "");
// Результат: "20100228235859" (в формате ггггММддЧЧммсс)
Этот способ гарантирует стабильный результат на уровне системных механизмов платформы, не зависит от локальных настроек операционной системы пользователя и отлично подходит для автоматического формирования пакетов обмена данными. При необходимости регулярной передачи таких пакетов по расписанию настраивается автоматический обмен данными между базами через веб-сервис или COM-соединение.