При разработке правил обмена в конфигурации «1С:Конвертация данных 3.0» (КД 3.0) для обмена через формат EnterpriseData часто используется встроенный механизм автоматической генерации текста общего модуля МенеджерОбменаЧерезУниверсальныйФормат. Однако при попытке сохранить полученный код в конфигураторе базы-приемника или базы-источника разработчики могут столкнуться с синтаксическими ошибками препроцессора и вызовов процедур.
Проанализируем природу этих ошибок, выясним причину их появления, рассмотрим по шагам корректный способ их устранения в КД 3.0, а также разберем сопутствующую проблему валидации XDTO-пакета при отправке данных.
При вставке сформированного кода модуля менеджера обмена синтакс-контроль платформы «1С:Предприятие 8.3» выдает следующие сообщения:
{ОбщийМодуль.МенеджерОбменаЧерезУниверсальныйФормат.Модуль(36,10)}: Ошибка в операторе препроцессора #Область >Справочник.Контрагенты (Проверка: Сервер)
{ОбщийМодуль.МенеджерОбменаЧерезУниверсальныйФормат.Модуль(37,33)}: Ожидается символ '(' Процедура ДобавитьПОД_Справочник>.Контрагенты(ПравилаОбработкиДанных) (Проверка: Сервер)
{ОбщийМодуль.МенеджерОбменаЧерезУниверсальныйФормат.Модуль(46,2)}: Пропущен оператор препроцессора Область (Region) #>КонецОбласти (Проверка: Сервер)
Посмотрим на фрагмент кода, который был сформирован генератором КД 3.0:
#Область ПОД
Процедура ЗаполнитьПравилаОбработкиДанных(НаправлениеОбмена, ПравилаОбработкиДанных) Экспорт
Если НаправлениеОбмена = "Получение" Тогда
ДобавитьПОД_Справочник.Контрагенты(ПравилаОбработкиДанных);
КонецЕсли;
КонецПроцедуры
#Область Получение
#Область Справочник.Контрагенты
Процедура ДобавитьПОД_Справочник.Контрагенты(ПравилаОбработкиДанных)
ПравилоОбработки = ПравилаОбработкиДанных.Добавить;
ПравилоОбработки.Имя = "Справочник.Контрагенты";
ПравилоОбработки.ОбъектВыборкиФормат = "Справочник.Контрагенты";
ПравилоОбработки.ИспользуемыеПКО.Добавить("Справочник_Контрагенты_Получение");
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#КонецОбласти
Выясним причину такого поведения платформы. В языке 1С идентификаторы процедур, функций, переменных, а также имена областей препроцессора (#Область) должны удовлетворять стандарту именования: они могут содержать только буквы, цифры и символ подчеркивания _. Символ точки . является зарезервированным оператором обращения к свойствам и методам объекта.
Когда в конфигурации КД 3.0 в реквизите Имя для Правила обработки данных (ПОД) или Правила конвертации объектов (ПКО) указывается строка с точкой (например, Справочник.Контрагенты), внутренний генератор кода подставляет это значение напрямую в имена процедур и директив областей препроцессора. В результате формируется синтаксически невалидная конструкция ДобавитьПОД_Справочник.Контрагенты и #Область Справочник.Контрагенты, которую компилятор платформы разобрать не может.
Исправлять сгенерированный код вручную прямо в конфигураторе не рекомендуется, поскольку при следующей выгрузке модуля из КД 3.0 все ручные правки будут перезаписаны. Разберем правильный порядок действий:
_ (например, вместо Справочник.Контрагенты зададим имя Справочник_Контрагенты_Получение или Справочник_Контрагенты).После замены точки на нижнее подчеркивание сгенерированный код примет следующий корректный вид:
#Область Справочник_Контрагенты
Процедура ДобавитьПОД_Справочник_Контрагенты(ПравилаОбработкиДанных)
ПравилоОбработки = ПравилаОбработкиДанных.Добавить;
ПравилоОбработки.Имя = "Справочник_Контрагенты";
ПравилоОбработки.ОбъектВыборкиФормат = "Справочник.Контрагенты";
ПравилоОбработки.ИспользуемыеПКО.Добавить("Справочник_Контрагенты_Получение");
КонецПроцедуры
#КонецОбласти
После устранения синтаксических ошибок при выполнении обмена на этапе отправки данных может возникнуть исключение XDTO-валидации:
{ОбщийМодуль.ОбменДаннымиXDTOСервер.Модуль(552)}: Ошибка при вызове метода контекста (Проверить)
ОбъектXDTO.Проверить;
по причине:
Ошибка проверки данных XDTO:
Структура объекта '/КлючевыеСвойства/СтранаРегистрации' не соответствует типу: {
Проверка свойства 'Код':
форма: Элемент
имя: {
тип: {
Отсутствует обязательное свойство
Рассмотрим подробнее механизм работы этой проверки. Метод ОбъектXDTO.Проверить() сопоставляет выгруженный объект с XSD-схемой пакета EnterpriseData. Если для какого-либо ключевого свойства (в данном случае Код для объекта СтранаРегистрации) в схеме задано обязательное присутствие (minOccurs="1"), отсутствие этого тега в XML вызывает критическую ошибку.
Проанализируем возможные причины и способы решения:
СтранаРегистрации ссылается на элемент справочника стран мира, у которого не заполнен реквизит Код (например, трехзначный цифровой код по ОКСМ). Необходимо найти данный элемент в базе-источнике и заполнить его код.Код должен быть установлен флаг выгрузки, а свойство должно быть помечено как ключевое для идентификации.ПередВыгрузкой соответствующего ПКО или в ПКС ПриВыгрузкеДанныхXDTO можно принудительно подставлять значение по умолчанию (например, код России "643").Для детальной диагностики невалидных XDTO-объектов в процессе отладки можно выгружать проблемный объект в XML-строку через ЗаписьXML и ФабрикаXDTO.ЗаписатьXML() до вызова метода проверки, что позволяет точно локализовать пустые реквизиты.