Как преобразовать строку формата 10.10.2018 в дату в 1С при работе с HTTP-сервисами

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

При разработке интеграций, особенно когда данные приходят из внешних источников через HTTP-сервисы, программисты 1С часто сталкиваются с проблемой интерпретации типов. Одной из самых коварных задач является преобразование строки вида 10.10.2018 в объект типа Дата. В этой статье мы подробно разберем, почему возникают ошибки примитивного приведения типов, как правильно парсить строки и на что обратить внимание при настройке шаблонов URL в HTTP-сервисах.

Разбор основной ошибки: Литералы против Строк

Проанализируем ситуацию, описанную автором темы. Попытка выполнить код типа Строка(10.10.2018) или Дата(10.10.2018) приводит к синтаксической ошибке. Выясним причину: в языке 1С числовой литерал может содержать только одну десятичную точку. Когда компилятор видит 10.10.2018, он воспринимает 10.10 как число, а следующую за ним точку — как недопустимый символ или начало обращения к методу, что вызывает затык.

Важный момент: Любые данные, приходящие извне (из URL, из тела запроса), всегда являются строками. Поэтому работать с ними нужно как со строковыми переменными, заключая их в кавычки при тестах, например: "10.10.2018".

Решение 1: Ручной парсинг строки даты

Если мы получили строку в формате ДД.ММ.ГГГГ, самый надежный способ превратить ее в дату — это разобрать ее на составляющие части (день, месяц, год) и собрать заново в формате, который понимает конструктор Дата(). Рассмотрим пример кода, который универсально работает даже на старых платформах (например, в УТ 10.3):


// Допустим, в переменной ДатаСтрокой хранится значение "10.10.2018"
ДатаСтрокой = "10.10.2018";

// Извлекаем части даты
День   = Лев(ДатаСтрокой, 2);
Месяц  = Сред(ДатаСтрокой, 4, 2);
Год    = Прав(ДатаСтрокой, 4);

// Собираем в формате ГГГГММДДччммсс
// Время добавляем по необходимости, например, начало дня
ПонятнаяДата = Дата(Год + Месяц + День + "000000"); 

В этом примере мы используем функции Лев(), Сред() и Прав(). Это "классический" подход, который гарантирует результат вне зависимости от настроек локализации сервера.

Решение 2: Использование функции СтрРазделить

Если ваша платформа версии 8.3.6 и выше, мы можем применить более элегантный метод с использованием массива. Разберем этот способ по шагам:

  1. Разбиваем строку по разделителю "точка".
  2. Получаем массив, где индекс 0 — день, 1 — месяц, 2 — год.
  3. Формируем дату через конструктор.

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

Если ЧастиДаты.Количество() = 3 Тогда
    // Формат конструктора: Дата(Год, Месяц, День, Час, Минута, Секунда)
    Результат = Дата(Число(ЧастиДаты[2]), Число(ЧастиДаты[1]), Число(ЧастиДаты[0]));
КонецЕсли;

Решение 3: Особенности HTTP-сервисов (ПараметрыURL vs ПараметрыЗапроса)

Часто проблема кроется не в преобразовании, а в получении данных. Проанализируем структуру URL из обсуждения: .../hs/PersAccount/{GUID}/{ДатаНачала}/{ДатаКонца}. Если параметры прописаны в шаблоне HTTP-сервиса внутри фигурных скобок, они попадают в коллекцию ПараметрыURL, а не в ПараметрыЗапроса.

Рассмотрим правильный код получения данных внутри метода HTTP-сервиса:


Функция GetDocs(Запрос)
    // Если в шаблоне указано {ДатаНачала}
    СтрДатаНачала = Запрос.ПараметрыURL.Получить("ДатаНачала");
    
    // Обязательно проверяем на Неопределено
    Если СтрДатаНачала <> Неопределено Тогда
        // Применяем парсинг, описанный выше
        // ...
    КонецЕсли;
КонецФункции

Важное различие:

Путаница между этими коллекциями — основная причина того, почему переменная оказывается пустой, и последующие попытки преобразования вызывают ошибки.

Рекомендации по отладке и стандартам

Посмотрим на ситуацию шире. Чтобы избежать "анальной стоматологии" (как выразился автор темы), проанализируем лучшие практики:

1. Используйте стандарт ISO 8601. Если вы можете повлиять на сторону, отправляющую данные, попросите их присылать дату в формате ГГГГ-ММ-ДД (например, 2018-10-10). Такую строку 1С понимает гораздо лучше через функцию XMLЗначение(Тип("Дата"), "2018-10-10").

2. Логирование для отладки. Если отладка HTTP-сервиса недоступна напрямую, используйте запись во внешний файл или в специально созданный регистр сведений. Это поможет увидеть, в каком именно виде приходят данные (наличие пробелов, невидимых символов и т.д.).

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

Рассмотренные методы позволяют гибко обрабатывать входящую информацию и преобразовывать любые строковые представления дат в полноценные объекты 1С, пригодные для использования в запросах и логике программы.

← На главную