При интеграции 1С со сторонними системами, формировании уникальных ключей или вызове методов внешних веб-сервисов часто требуется получить компактное представление даты и времени в виде сплошной последовательности символов без пробелов и разделителей (например, 20170101000000). Разберем, как правильно реализовать такое преобразование, а также выясним причины распространенных ошибок типизации при передаче подобных значений во внешние сервисы.
Для перевода даты в строковое представление нужного вида в платформе 1С предусмотрена встроенная функция Формат() с управляющей строкой формата даты ДФ. Нет необходимости получать стандартную строку с дефисами или точками и затем удалять их с помощью функции СтрЗаменить() — формат настраивается напрямую с помощью шаблонных символов:
Посмотрим на пример формирования строки с текущим временем или на начало дня:
// Полное представление даты и времени
СтрокаДатаВремя = Формат(Объект.ДатаНачалаИзменений, "ДФ=ггггММддччммсс");
// Если необходимо строго зафиксировать время на начало суток (00:00:00)
СтрокаНачалоДня = Формат(НачалоДня(Объект.ДатаНачалаИзменений), "ДФ=ггггММддччммсс");
// Альтернативный вариант для фиксации нулей времени
СтрокаСНулями = Формат(Объект.ДатаНачалаИзменений, "ДФ=ггггММдд") + "000000";
Если внешний сервис или алгоритм требует именно тип Число, а не строковое значение, полученную строку приводят через функцию Число(). При обратном преобразовании чисел такой длины (14 знаков) важно учитывать параметры группировки разрядов:
// Преобразование отформатированной строки в число
ЧисловоеЗначение = Число(Формат(НачалоДня(Объект.ДатаНачалаИзменений), "ДФ=ггггММддччммсс"));
// При последующем выводе такого числа в строку обязательно отключаем разделители групп
СтрокаБезРазделителей = Формат(ЧисловоеЗначение, "ЧГ=0");
Важно: Если передавать 14-значное число во внешний сервис (например, REST или SOAP), убедитесь, что на стороне приемника используется тип данных xs:long или 64-битное целое (int64). Стандартный 32-битный int32 ограничен значением 2 147 483 647 и вызовет ошибку переполнения.
Проанализируем распространенную ситуацию: разработчик пишет в коде значение в одинарных кавычках вида '20170101000000', и метод веб-сервиса выполняется успешно, а при передаче строковой переменной "20170101000000" возвращается ошибка схемы или валидации.
Причина заключается в различиях синтаксических конструкций языка 1С:
Дата (например, '20170101000000' компилируется как значение типа Дата: 01.01.2017 00:00:00).Строка (например, "20170101000000").При вызове методов WSПрокси платформа 1С автоматически сериализует значения типа Дата в формат стандарта XML Schema (xs:dateTime или xs:date). Если в WSDL-описании метода веб-сервиса параметр описан как дата, передавать в него строковую переменную нельзя — необходимо передавать оригинальное значение типа Дата.
Рассмотрим стандартные механизмы работы с форматами дат при обмене данными:
// 1. Для SOAP-сервисов через WS-ссылку передаем обычную Дату
Ответ = Прокси.ВыгрузитьДанные(Объект.ДатаНачалаИзменений);
// 2. Для формирования канонической строки стандарта XML (ISO 8601: "2017-01-01T00:00:00")
СтрокаXML = XMLСтрока(Объект.ДатаНачалаИзменений);
// 3. Обратное чтение даты из формата XML
ИсходнаяДата = XMLЗначение(Тип("Дата"), СтрокаXML);
Всегда сверяйтесь с документацией и WSDL/OpenAPI-схемой целевого сервиса, чтобы передавать параметры в строго ожидаемом типе: объектом Дата, строкой или числом.