При организации интеграции между 1С и внешними информационными системами часто используется обмен данными в формате XML с применением механизма XDTO (XML Data Transfer Objects). Нередко возникает задача жестко ограничить длину выгружаемых строковых реквизитов (например, не более 50 символов), чтобы выгрузка строго соответствовала техническому заданию или не вызывала ошибок переполнения на стороне принимающей СУБД. Разберем, как устроен этот механизм в платформе 1С, как правильно задать ограничения длины в схеме и почему платформа не всегда автоматически обрезает строки.
Проанализируем базовый принцип работы XDTO в 1С. В отличие от записи в классические таблицы СУБД или старые форматы (например, DBF), где при превышении заданной разрядности платформа или драйвер могли автоматически «обрезать» лишние символы справа, объектная модель XDTO ориентирована на строгую валидацию XML-схем. Платформа не выполняет автоматическую обрезку длинных строк при заполнении свойств объекта XDTO.
Если строка превышает заданный лимит, модель XDTO считает это нарушением контракта типа. При этом ошибка несовместимости возникает не в момент простого присвоения значения свойству объекта в коде, а при попытке сериализации или при явном вызове проверки схемы.
Рассмотрим по шагам, как настроить ограничение длины строки в схеме XDTO внутри конфигуратора или во внешней XSD-схеме:
Строка50).string из пространства имен XML-схемы (http://www.w3.org/2001/XMLSchema).МаксимальнаяДлина (в терминах XSD — maxLength) и зададим требуемое значение, например, 50. При необходимости также можно настроить фасеты МинимальнаяДлина (minLength) или Длина (length) для строк строго фиксированного размера.string укажем наш вновь созданный тип Строка50.Посмотрим на аналогичный фрагмент, как это ограничение описывается непосредственно в тексте XML-схемы (XSD):
<xs:simpleType name="Строка50">
<xs:restriction base="xs:string">
<xs:maxLength value="50"/>
</xs:restriction>
</xs:simpleType>
Выясним, как проверить подготовленные данные перед сохранением или передачей во внешнюю систему. Чтобы система сама выявила некорректные поля, не дожидаясь падения внешнего сервиса, воспользуемся методом Проверить() объекта XDTO. Посмотрим на пример кода:
// Создание фабрики и объекта XDTO
ТипОбъекта = ФабрикаXDTO.Тип("http://v8.1c.ru/edi", "Товар");
ТоварXDTO = ФабрикаXDTO.Создать(ТипОбъекта);
// Заполнение свойства строкой, длина которой превышает допустимую
ТоварXDTO.Наименование = "Очень длинное наименование товара, которое гарантированно превышает лимит";
Попытка
// Выполняем строгую проверку соответствия схеме XDTO
ТоварXDTO.Проверить();
Исключение
ИнформацияОбОшибке = ОписаниеОшибки();
ЗаписьЖурналаРегистрации("Интеграция XDTO", УровеньЖурналаРегистрации.Ошибка, , , ИнформацияОбОшибке);
ВызватьИсключение "Ошибка валидации данных XDTO: " + ИнформацияОбОшибке;
КонецПопытки;
Если длина свойства превышает значение фасета МаксимальнаяДлина, метод Проверить() сгенерирует исключение с точным указанием типа и проблемного реквизита.
Если по условиям интеграции система должна именно «обрезать» лишние символы без прерывания процесса выгрузки, такую логику необходимо реализовать на уровне встроенного языка 1С перед присвоением значения свойству XDTO. Рассмотрим, как это сделать программно с помощью встроенной функции Лев():
// Безопасное усечение строки до 50 символов перед записью в XDTO
СтрокаДляВыгрузки = СокрЛП(ВыборкаДанных.Наименование);
ТоварXDTO.Наименование = Лев(СтрокаДляВыгрузки, 50);
Разберем типичную проблему на стыке систем: когда в текстовом техническом задании указано ограничение поля (например, VARCHAR(50) в терминах целевой базы данных), а в предоставленном заказчиком файле XSD поле имеет общий тип xs:string без ограничений. В этом случае выгрузка успешно проходит валидацию на стороне 1С, но дает сбой при вставке в базу данных получателя.
Для корректного решения ситуации рекомендуются следующие шаги:
Лев() в обработке выгрузки 1С для предотвращения ошибок на стороне принимающего сервера.СоздатьФабрикуXDTO(), загружая скорректированный локальный файл схемы.