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

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

При обмене данными между конфигурациями 1С, например, 1С:Управление торговлей (УТ) и внешними системами, такими как 1С-Битрикс "Управление сайтом", пользователи часто сталкиваются с проблемой усечения длинных строковых полей. Эта проблема проявляется, когда реквизит в базе данных 1С содержит объемный текст (например, дополнительное описание номенклатуры), а при выгрузке его часть "отрезается". Как правило, это приводит к ошибке XDTO-валидации с сообщением "Несоответствие фасету MaxLength", указывающим на ограничение максимальной длины строки в XDTO-схеме обмена. Рассмотрим подробно, как мы можем решить эту проблему.

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

  1. Подготовка данных в коде 1С.
  2. Формирование XML-структуры на основе XDTO-фабрики и XDTO-пакетов.
  3. Валидация сформированного XML-документа по XSD-схеме.
  4. Передача XML-документа.

Ошибка "Несоответствие фасету MaxLength" возникает на третьем этапе – валидации. Это означает, что даже если в коде 1С мы передали полное значение, XDTO-схема, по которой происходит проверка, содержит жесткое ограничение на максимальную длину строки для определенного типа данных. Таким образом, для успешного обмена нам необходимо скорректировать как код 1С (если в нем есть принудительное усечение), так и саму XDTO-схему.

Поиск и корректировка XSD-схемы обмена (общий подход для УТ 10.3 и макетов)

Часто XDTO-схемы для обмена с внешними системами хранятся в макетах объектов конфигурации, чаще всего – в планах обмена. В нашем случае, при обмене с 1С-Битрикс для УТ 10.3, такая схема может находиться в макете плана обмена.

  1. Найдем план обмена.

    Для начала, откройте конфигуратор 1С и найдите план обмена, который используется для выгрузки данных на сайт. В нашем примере это мог быть ПланОбмена.Б_ОбменССайтом.

  2. Обнаружим макет схемы.

    Внутри найденного плана обмена нам нужно найти макет с названием, похожим на СхемаXSDОбмена. Обычно это макет типа "XML-схема".

  3. Выгрузим и отредактируем XSD-схему.

    Когда макет найден, нам следует выгрузить его содержимое в файл с расширением .xsd. Для этого нажмите правой кнопкой мыши на макете и выберите "Сохранить в файл..."

    Откройте сохраненный .xsd файл в любом текстовом редакторе. Внутри файла нам предстоит найти определение типа данных, который вызывает ошибку. Ориентироваться мы будем на сообщение об ошибке, которое указывает имя типа и фасет MaxLength.

    Например, если ошибка гласит "не соответствует простому типу: {urn:1C.ru:commerceml_2}СтрокаТип Несоответствие фасету MaxLength = '10000'", то нам нужно искать определение СтрокаТип (или КомментарийТип, ЗначениеТип, ИдентификаторГлобальныйТип – в зависимости от конкретного поля и версии схемы CommerceML). Мы будем искать тег <xs:simpleType> с соответствующим именем.

    Рассмотрим пример XSD-кода для СтрокаТип:

    
    <xs:simpleType name="СтрокаТип">
        <xs:restriction base="xs:string">
            <xs:maxLength value="10000"/>
        </xs:restriction>
    </xs:simpleType>
    

    Мы видим атрибут <xs:maxLength value="10000"/>. Здесь мы должны изменить значение "10000" на желаемую длину, например, "100000" или "25000".

    Важно отметить, что для разных полей могут использоваться разные типы. В сообщении 5 и 17 участники дискуссии указали, что для ДополнительноеОписаниеНоменклатуры (или Описание в XDTO) может использоваться КоментарийТип. Если вы столкнулись с такой ситуацией, ищите именно этот тип и меняйте его maxLength:

    
    <xs:simpleType name="КоментарийТип">
        <xs:restriction base="xs:string">
            <xs:maxLength value="3000"/> <!-- Это значение нужно изменить -->
        </xs:restriction>
    </xs:simpleType>
    

    Не забываем сохранить изменения в файле.

  4. Загрузим измененную схему обратно.

    Вернувшись в конфигуратор, нажмите правой кнопкой мыши на тот же макет и выберите "Загрузить из файла...", указав путь к нашему измененному .xsd файлу.

  5. Скорректируем код 1С (при необходимости).

    Проблема часто начинается с того, что в коде 1С данные принудительно усекаются еще до попытки формирования XDTO. Например, в сообщении 1 мы видим фрагмент:

    
    лДополнительноеОписаниеНоменклатуры = ?(СтрДлина(лОписаниеТовара) > 10000, Лев(лОписаниеТовара, 10000), лОписаниеТовара);
    

    Если такой фрагмент кода присутствует, его также необходимо изменить, увеличив значение 10000 до того же значения, которое мы установили в XSD-схеме (например, 100000). Найдите соответствующие общие модули или обработки выгрузки, которые формируют данные для XDTO. В УТ 10.3 это может быть ОбщийМодуль.Б_ПроцедурыИФункцииВыгрузкиДанныхНаСайт или похожие.

  6. Обновим конфигурацию базы данных.

    После всех изменений (в макете и, возможно, в коде) обязательно сохраним конфигурацию и обновим конфигурацию базы данных.

Специфическое решение для УТ 11.4 и "Файл описания для сайта" (ОписаниеВФорматеHTML)

Для более новых конфигураций, таких как УТ 11.4, подход может быть немного другим, но принципы остаются схожими. Пользователь в сообщении 20 предлагает конкретное решение для поля "Файл описания для сайта" (которое в XDTO может называться ОписаниеВФорматеHTML):

  1. Изменение XDTO-пакета в конфигураторе.

    В конфигураторе, перейдем в ветку Общие -> XDTO-пакеты -> CML208 (или другой пакет, используемый для CommerceML). Разверните этот пакет, найдите раздел Типы значений и в нем тип ЗначениеТип. Откройте свойства этого типа и измените значение параметра МаксимальнаяДлина с 1000 (или текущего значения) на требуемое, например, 10000 или 25000.

    Важно помнить, что в зависимости от конкретного поля и версии CommerceML, вам, возможно, придется корректировать не ЗначениеТип, а другие строковые типы, такие как СтрокаТип или КомментарийТип, которые мы уже упоминали. Всегда ориентируйтесь на точное имя типа, указанное в ошибке XDTO-валидации.

  2. Корректировка кода в модуле обмена.

    Далее нам необходимо найти и исправить принудительное усечение строки в коде 1С. Для ОписаниеВФорматеHTML в УТ 11.4 пользователь указал следующий путь:

    Найдите ОбщийМодуль.ОбменССайтом.Модуль. В нем нам нужно найти строку, которая содержит проверку длины для ОписаниеВФорматеHTML. Пример такой строки:

    
    Если СтрДлина(ОписаниеВФорматеHTML) <= 1000 Тогда
        ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "ОписаниеВФорматеHTML", ОписаниеВФорматеHTML);
    КонецЕсли;
    

    Мы должны изменить значение 1000 на то же значение, которое мы установили в МаксимальнаяДлина XDTO-пакета (например, 10000). Обратите внимание, что это условие Если ... Тогда, и если длина превысит установленное здесь значение, данные могут просто не выгрузиться.

  3. Сохранение и обновление.

    После внесения этих изменений, сохраните конфигурацию и обновите конфигурацию базы данных.

Понимание различных ошибок XDTO: MaxLength против Length

Важно различать фасеты MaxLength и Length, которые могут встречаться в XDTO-схемах, поскольку они указывают на разные требования к длине строк:

Если вы сталкиваетесь с ошибкой Length, у вас есть два основных пути:

  1. Корректировка данных: Привести выгружаемые данные к требуемой точной длине (например, дополнить нулями или пробелами до 10 символов, если это допустимо бизнес-логикой).
  2. Изменение схемы: Если точная длина не критична, вы можете изменить XSD-схему, заменив фасет <xs:length value="10"/> на более гибкие <xs:minLength value="X"/> и <xs:maxLength value="Y"/> с соответствующими значениями.

Например, для ИдентификаторГлобальныйТип, который в сообщении 24 имеет MaxLength = '40', нам нужно будет искать соответствующий тип в схеме и корректировать его.

Важные аспекты и рекомендации

  1. Снятие с поддержки и обновление конфигурации:

    Все описанные изменения в XDTO-пакетах или макетах XSD-схем, а также в общих модулях, по сути, являются изменениями типовой конфигурации. Это означает, что для их внесения конфигурацию необходимо "снять с поддержки" или "изменить в режиме сравнения/объединения". При последующих обновлениях конфигурации все эти изменения могут быть перезаписаны. Поэтому после каждого обновления конфигурации вам придется повторно проверять и вносить эти изменения. Альтернативным решением может быть создание расширения конфигурации, но, как справедливо замечено в сообщении 22, редактирование XDTO-пакетов через расширения может быть ограничено или недоступно в некоторых версиях платформы 1С:Предприятие.

  2. Глобальный поиск:

    Если вы не уверены, где находится нужный макет XSD-схемы или код, используйте глобальный поиск в конфигураторе (Ctrl+Shift+F). Ищите по ключевым словам из ошибки (например, "MaxLength", "СтрокаТип", имя поля) или по названию макета ("СхемаXSDОбмена").

  3. Анализ кода формирования XDTO-фабрики:

    В сложных случаях, если вы не можете найти XSD-схему, или если кажется, что схема создается программно, попробуйте найти в коде места, где создается XDTO-фабрика. Это часто делается с помощью функции ФабрикаXDTO.ПрочитатьСхему() или ФабрикаXDTO.СоздатьФабрикуXDTO(). Аргументы этих функций могут подсказать, откуда загружается XSD-схема (например, из макета или файла).

  4. Версии CommerceML:

    Обращайте внимание на версию CommerceML, указанную в ошибке (например, commerceml_2 или commerceml_3). Различия между версиями могут влиять на структуру XDTO-пакетов и имена типов данных. Убедитесь, что вы корректируете схему, соответствующую используемой версии.

Мы выяснили, что решение проблемы с ограничением длины строковых полей при обмене через XDTO требует системного подхода: необходимо не только скорректировать код 1С, который может усекать данные, но и обязательно изменить соответствующую XSD-схему, которая используется для валидации XDTO-документов. Помните о потенциальных сложностях с обновлениями и выбирайте метод корректировки, наиболее подходящий для вашей конфигурации и версии платформы 1С:Предприятие.

← На главную