Как исправить ошибку в операторе препроцессора при генерации модуля в Конвертации данных 3.0?

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

При разработке правил обмена в конфигурации «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

Исправлять сгенерированный код вручную прямо в конфигураторе не рекомендуется, поскольку при следующей выгрузке модуля из КД 3.0 все ручные правки будут перезаписаны. Разберем правильный порядок действий:

  1. Откроем информационную базу Конвертация данных 3.0.
  2. Перейдем в справочник Правила обработки данных (ПОД) и найдем проблемное правило.
  3. Изменим значение реквизита Имя: заменим точку на символ подчеркивания _ (например, вместо Справочник.Контрагенты зададим имя Справочник_Контрагенты_Получение или Справочник_Контрагенты).
  4. Аналогичным образом проверим справочник Правила конвертации объектов (ПКО) и удостоверимся, что в именах ПКО отсутствуют точки.
  5. Повторно запустим выгрузку модуля менеджера обмена через универсальный формат и перенесем сгенерированный текст в целевую конфигурацию.

После замены точки на нижнее подчеркивание сгенерированный код примет следующий корректный вид:


#Область Справочник_Контрагенты

Процедура ДобавитьПОД_Справочник_Контрагенты(ПравилаОбработкиДанных)
    ПравилоОбработки = ПравилаОбработкиДанных.Добавить;
    ПравилоОбработки.Имя = "Справочник_Контрагенты";
    ПравилоОбработки.ОбъектВыборкиФормат = "Справочник.Контрагенты";
    ПравилоОбработки.ИспользуемыеПКО.Добавить("Справочник_Контрагенты_Получение");
КонецПроцедуры

#КонецОбласти

Ошибка проверки данных XDTO: «Отсутствует обязательное свойство 'Код'»

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


{ОбщийМодуль.ОбменДаннымиXDTOСервер.Модуль(552)}: Ошибка при вызове метода контекста (Проверить)
ОбъектXDTO.Проверить;
по причине:
Ошибка проверки данных XDTO:
Структура объекта '/КлючевыеСвойства/СтранаРегистрации' не соответствует типу: {
Проверка свойства 'Код':
форма: Элемент
имя: {
тип: {
Отсутствует обязательное свойство

Рассмотрим подробнее механизм работы этой проверки. Метод ОбъектXDTO.Проверить() сопоставляет выгруженный объект с XSD-схемой пакета EnterpriseData. Если для какого-либо ключевого свойства (в данном случае Код для объекта СтранаРегистрации) в схеме задано обязательное присутствие (minOccurs="1"), отсутствие этого тега в XML вызывает критическую ошибку.

Проанализируем возможные причины и способы решения:

  1. Некорректные данные в информационной базе: У выгружаемого контрагента реквизит СтранаРегистрации ссылается на элемент справочника стран мира, у которого не заполнен реквизит Код (например, трехзначный цифровой код по ОКСМ). Необходимо найти данный элемент в базе-источнике и заполнить его код.
  2. «Битая» ссылка в реквизите: Если поле ссылается на несуществующий (удаленный) объект, система формирует пустой узел ключевых свойств. В этом случае требуется перевыбрать корректную страну в карточке контрагента.
  3. Настройка ПКО в КД 3.0: Проверим правило конвертации для страны мира. В таблице Правила конвертации свойств (ПКС) для реквизита Код должен быть установлен флаг выгрузки, а свойство должно быть помечено как ключевое для идентификации.
  4. Программная обработка пустых значений: Если код страны в учетной системе может быть не заполнен, в обработчике ПередВыгрузкой соответствующего ПКО или в ПКС ПриВыгрузкеДанныхXDTO можно принудительно подставлять значение по умолчанию (например, код России "643").

Для детальной диагностики невалидных XDTO-объектов в процессе отладки можно выгружать проблемный объект в XML-строку через ЗаписьXML и ФабрикаXDTO.ЗаписатьXML() до вызова метода проверки, что позволяет точно локализовать пустые реквизиты.

← На главную