Как в 1С установить ограничение на длину строки в XDTO и организовать проверку данных?

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

При организации интеграции между 1С и внешними информационными системами часто используется обмен данными в формате XML с применением механизма XDTO (XML Data Transfer Objects). Нередко возникает задача жестко ограничить длину выгружаемых строковых реквизитов (например, не более 50 символов), чтобы выгрузка строго соответствовала техническому заданию или не вызывала ошибок переполнения на стороне принимающей СУБД. Разберем, как устроен этот механизм в платформе 1С, как правильно задать ограничения длины в схеме и почему платформа не всегда автоматически обрезает строки.

Особенности механизма XDTO и автоматическое усечение строк

Проанализируем базовый принцип работы XDTO в 1С. В отличие от записи в классические таблицы СУБД или старые форматы (например, DBF), где при превышении заданной разрядности платформа или драйвер могли автоматически «обрезать» лишние символы справа, объектная модель XDTO ориентирована на строгую валидацию XML-схем. Платформа не выполняет автоматическую обрезку длинных строк при заполнении свойств объекта XDTO.

Если строка превышает заданный лимит, модель XDTO считает это нарушением контракта типа. При этом ошибка несовместимости возникает не в момент простого присвоения значения свойству объекта в коде, а при попытке сериализации или при явном вызове проверки схемы.

Пошаговое создание типа с ограничением длины в пакете XDTO

Рассмотрим по шагам, как настроить ограничение длины строки в схеме XDTO внутри конфигуратора или во внешней XSD-схеме:

  1. Откроем нужный Пакет XDTO в дереве метаданных конфигурации или загрузим его из внешнего файла.
  2. В ветке пакета перейдем к разделу Типы значений (простые типы данных) и добавим новый тип, присвоив ему понятное имя (например, Строка50).
  3. В свойствах созданного типа укажем базовый тип: выберем тип string из пространства имен XML-схемы (http://www.w3.org/2001/XMLSchema).
  4. В группе фасетов ограничений найдем свойство МаксимальнаяДлина (в терминах XSD — maxLength) и зададим требуемое значение, например, 50. При необходимости также можно настроить фасеты МинимальнаяДлина (minLength) или Длина (length) для строк строго фиксированного размера.
  5. Вернемся к определению типа объекта (составного типа) и для целевого свойства вместо стандартного типа 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);

Несоответствие XSD-схемы и текстового описания ТЗ

Разберем типичную проблему на стыке систем: когда в текстовом техническом задании указано ограничение поля (например, VARCHAR(50) в терминах целевой базы данных), а в предоставленном заказчиком файле XSD поле имеет общий тип xs:string без ограничений. В этом случае выгрузка успешно проходит валидацию на стороне 1С, но дает сбой при вставке в базу данных получателя.

Для корректного решения ситуации рекомендуются следующие шаги:

  1. Проверить исходную схему: если в XSD-схеме заказчика отсутствуют ограничения длины, уведомить сторону интеграции о расхождении схемы и текстового регламента.
  2. Динамическая схема или программный контроль: если официальная схема не изменяется заказчиком, добавить программное усечение через Лев() в обработке выгрузки 1С для предотвращения ошибок на стороне принимающего сервера.
  3. Внешняя валидация: если конфигурация находится на поддержке, внешнюю схему можно валидировать программно с помощью метода СоздатьФабрикуXDTO(), загружая скорректированный локальный файл схемы.
← На главную