При обмене данными между конфигурациями 1С, например, 1С:Управление торговлей (УТ) и внешними системами, такими как 1С-Битрикс "Управление сайтом", пользователи часто сталкиваются с проблемой усечения длинных строковых полей. Эта проблема проявляется, когда реквизит в базе данных 1С содержит объемный текст (например, дополнительное описание номенклатуры), а при выгрузке его часть "отрезается". Как правило, это приводит к ошибке XDTO-валидации с сообщением "Несоответствие фасету MaxLength", указывающим на ограничение максимальной длины строки в XDTO-схеме обмена. Рассмотрим подробно, как мы можем решить эту проблему.
Прежде всего, давайте выясним причину возникновения такой ошибки. Дело в том, что процесс обмена данными через XDTO включает несколько этапов:
Ошибка "Несоответствие фасету MaxLength" возникает на третьем этапе – валидации. Это означает, что даже если в коде 1С мы передали полное значение, XDTO-схема, по которой происходит проверка, содержит жесткое ограничение на максимальную длину строки для определенного типа данных. Таким образом, для успешного обмена нам необходимо скорректировать как код 1С (если в нем есть принудительное усечение), так и саму XDTO-схему.
Часто XDTO-схемы для обмена с внешними системами хранятся в макетах объектов конфигурации, чаще всего – в планах обмена. В нашем случае, при обмене с 1С-Битрикс для УТ 10.3, такая схема может находиться в макете плана обмена.
Для начала, откройте конфигуратор 1С и найдите план обмена, который используется для выгрузки данных на сайт. В нашем примере это мог быть ПланОбмена.Б_ОбменССайтом.
Внутри найденного плана обмена нам нужно найти макет с названием, похожим на СхемаXSDОбмена. Обычно это макет типа "XML-схема".
Когда макет найден, нам следует выгрузить его содержимое в файл с расширением .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>
Не забываем сохранить изменения в файле.
Вернувшись в конфигуратор, нажмите правой кнопкой мыши на тот же макет и выберите "Загрузить из файла...", указав путь к нашему измененному .xsd файлу.
Проблема часто начинается с того, что в коде 1С данные принудительно усекаются еще до попытки формирования XDTO. Например, в сообщении 1 мы видим фрагмент:
лДополнительноеОписаниеНоменклатуры = ?(СтрДлина(лОписаниеТовара) > 10000, Лев(лОписаниеТовара, 10000), лОписаниеТовара);
Если такой фрагмент кода присутствует, его также необходимо изменить, увеличив значение 10000 до того же значения, которое мы установили в XSD-схеме (например, 100000). Найдите соответствующие общие модули или обработки выгрузки, которые формируют данные для XDTO. В УТ 10.3 это может быть ОбщийМодуль.Б_ПроцедурыИФункцииВыгрузкиДанныхНаСайт или похожие.
После всех изменений (в макете и, возможно, в коде) обязательно сохраним конфигурацию и обновим конфигурацию базы данных.
Для более новых конфигураций, таких как УТ 11.4, подход может быть немного другим, но принципы остаются схожими. Пользователь в сообщении 20 предлагает конкретное решение для поля "Файл описания для сайта" (которое в XDTO может называться ОписаниеВФорматеHTML):
В конфигураторе, перейдем в ветку Общие -> XDTO-пакеты -> CML208 (или другой пакет, используемый для CommerceML). Разверните этот пакет, найдите раздел Типы значений и в нем тип ЗначениеТип. Откройте свойства этого типа и измените значение параметра МаксимальнаяДлина с 1000 (или текущего значения) на требуемое, например, 10000 или 25000.
Важно помнить, что в зависимости от конкретного поля и версии CommerceML, вам, возможно, придется корректировать не ЗначениеТип, а другие строковые типы, такие как СтрокаТип или КомментарийТип, которые мы уже упоминали. Всегда ориентируйтесь на точное имя типа, указанное в ошибке XDTO-валидации.
Далее нам необходимо найти и исправить принудительное усечение строки в коде 1С. Для ОписаниеВФорматеHTML в УТ 11.4 пользователь указал следующий путь:
Найдите ОбщийМодуль.ОбменССайтом.Модуль. В нем нам нужно найти строку, которая содержит проверку длины для ОписаниеВФорматеHTML. Пример такой строки:
Если СтрДлина(ОписаниеВФорматеHTML) <= 1000 Тогда
ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "ОписаниеВФорматеHTML", ОписаниеВФорматеHTML);
КонецЕсли;
Мы должны изменить значение 1000 на то же значение, которое мы установили в МаксимальнаяДлина XDTO-пакета (например, 10000). Обратите внимание, что это условие Если ... Тогда, и если длина превысит установленное здесь значение, данные могут просто не выгрузиться.
После внесения этих изменений, сохраните конфигурацию и обновите конфигурацию базы данных.
Важно различать фасеты MaxLength и Length, которые могут встречаться в XDTO-схемах, поскольку они указывают на разные требования к длине строк:
MaxLength (Максимальная длина):
Этот фасет устанавливает верхний предел количества символов, которые может содержать строка. Если передаваемая строка длиннее значения MaxLength, возникает ошибка валидации. Это наиболее частый случай, который мы рассмотрели выше.
Пример ошибки: Несоответствие фасету MaxLength = '10000'
Length (Точная длина):
Этот фасет требует, чтобы строка имела строго определенное количество символов. Если передаваемая строка короче или длиннее указанного значения Length, также возникает ошибка валидации.
Пример ошибки из сообщения 26: Ошибка проверки данных XDTO: Значение: '901210009' не соответствует простому типу: Несоответствие фасету Length = '10'. В данном случае, значение из 9 символов ("901210009") не соответствует требованию иметь ровно 10 символов.
Если вы сталкиваетесь с ошибкой Length, у вас есть два основных пути:
<xs:length value="10"/> на более гибкие <xs:minLength value="X"/> и <xs:maxLength value="Y"/> с соответствующими значениями.Например, для ИдентификаторГлобальныйТип, который в сообщении 24 имеет MaxLength = '40', нам нужно будет искать соответствующий тип в схеме и корректировать его.
Все описанные изменения в XDTO-пакетах или макетах XSD-схем, а также в общих модулях, по сути, являются изменениями типовой конфигурации. Это означает, что для их внесения конфигурацию необходимо "снять с поддержки" или "изменить в режиме сравнения/объединения". При последующих обновлениях конфигурации все эти изменения могут быть перезаписаны. Поэтому после каждого обновления конфигурации вам придется повторно проверять и вносить эти изменения. Альтернативным решением может быть создание расширения конфигурации, но, как справедливо замечено в сообщении 22, редактирование XDTO-пакетов через расширения может быть ограничено или недоступно в некоторых версиях платформы 1С:Предприятие.
Если вы не уверены, где находится нужный макет XSD-схемы или код, используйте глобальный поиск в конфигураторе (Ctrl+Shift+F). Ищите по ключевым словам из ошибки (например, "MaxLength", "СтрокаТип", имя поля) или по названию макета ("СхемаXSDОбмена").
В сложных случаях, если вы не можете найти XSD-схему, или если кажется, что схема создается программно, попробуйте найти в коде места, где создается XDTO-фабрика. Это часто делается с помощью функции ФабрикаXDTO.ПрочитатьСхему() или ФабрикаXDTO.СоздатьФабрикуXDTO(). Аргументы этих функций могут подсказать, откуда загружается XSD-схема (например, из макета или файла).
Обращайте внимание на версию CommerceML, указанную в ошибке (например, commerceml_2 или commerceml_3). Различия между версиями могут влиять на структуру XDTO-пакетов и имена типов данных. Убедитесь, что вы корректируете схему, соответствующую используемой версии.
Мы выяснили, что решение проблемы с ограничением длины строковых полей при обмене через XDTO требует системного подхода: необходимо не только скорректировать код 1С, который может усекать данные, но и обязательно изменить соответствующую XSD-схему, которая используется для валидации XDTO-документов. Помните о потенциальных сложностях с обновлениями и выбирайте метод корректировки, наиболее подходящий для вашей конфигурации и версии платформы 1С:Предприятие.