Как передавать параметры алгоритмов КД 2 при вызове из общего модуля и избежать ошибки неопределенного значения

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

При выполнении обмена данными между конфигурациями (например, при переносе данных из «1С:Зарплата и Управление Персоналом 2.5» в «1С:ЗУП 3.1») разработчики часто сталкиваются с ситуацией, когда правила обмена используют алгоритмы Конвертации Данных (КД 2), вызываемые из экспортных функций общих модулей источника.

Если запустить такой перенос не через штатный помощник перехода, а через универсальную обработку УниверсальныйОбменДаннымиXML.epf, возникает следующая ошибка:

Ошибка в обработчике события ПередОбработкойПравилаВыгрузки:
ОписаниеОшибки = Получение элемента по индексу для значения не определено
ПозицияМодуля = ОбщийМодуль.ОбъектыПереносаДанных.Модуль(19)

Проанализируем причины возникновения этой проблемы и разберем варианты ее решения.

Выясним причину ошибки

Рассмотрим, как устроен вызов алгоритма из общего модуля в стандартных правилах переноса. В обработчике правила выгрузки данных (ПВД) или ПКО выполняется следующий код:


Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ДатаНачалаПереносаРасчетныхДанных", Параметры.ДатаНачалаПереносаРасчетныхДанных);
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	ГрафикиРаботыПоВидамВремени.ГрафикРаботы
    |ИЗ
    |	РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботыПоВидамВремени
    |ГДЕ
    |	ГрафикиРаботыПоВидамВремени.ГрафикРаботы ССЫЛКА Справочник.ГрафикиРаботы
    |	И ГрафикиРаботыПоВидамВремени.План
    |	И ГрафикиРаботыПоВидамВремени.Месяц >= &ДатаНачалаПереносаРасчетныхДанных";

Выборка = Запрос.Выполнить().Выбрать();

// Вызов функции общего модуля, в которую передается Параметры.Алгоритмы
ГрафикиРаботыМассив = ОбъектыПереносаДанных.ВыполнитьАлгоритм("ГрафикиРаботы_Выгрузить", Параметры.Алгоритмы, Выборка, Параметры, Ложь, Ложь);

Для каждого ГрафикРаботы Из ГрафикиРаботыМассив Цикл
    ВыгрузитьПоПравилу(ГрафикРаботы, , , , "ГрафикиРаботыСотрудников");
    Выполнить(Алгоритмы.ГрафикиРаботыПоВидамВремени_Выгрузить);
КонецЦикла;

Внутри экспортной функции общего модуля ОбъектыПереносаДанных.ВыполнитьАлгоритм() расположен следующий код исполнения:


Функция ВыполнитьАлгоритм(ИмяАлгоритма, Знач Алгоритмы, ИсходящиеДанные = "", ...) Экспорт
    ВидСубконто = Алгоритмы;
    Субконто = Неопределено;
    
    // В этой строке происходит падение, если параметр Алгоритмы не заполнен:
    Выполнить(Алгоритмы[ИмяАлгоритма]);
    
    Возврат Субконто;
КонецФункции

Причина ошибки заключается в том, что контекстная переменная Алгоритмы доступна локально только внутри самого кода обработчиков правил обмена КД 2. Экспортные функции общих модулей не видят локальный контекст Конвертации Данных. В штатном мастере перехода структура Параметры.Алгоритмы забивается служебными данными при инициализации переноса. Однако при стандартной выгрузке через обработку УниверсальныйОбменДаннымиXML параметр Параметры.Алгоритмы остается равен Неопределено, что приводит к ошибке обращения по индексу Алгоритмы[ИмяАлгоритма].

Варианты решения проблемы

Рассмотрим несколько способов исправления ситуации в зависимости от задач разработки.

Способ 1. Использование предназначенного помощника перехода

Если вы выполняете типовой перенос данных ЗУП 2.5 — ЗУП 3.1 без кастомных переработок правил, запускайте перенос из мастера перехода непосредственно в конфигурации. Штатный помощник инициализирует весь необходимый контекст и заполняет структуру Параметры.Алгоритмы автоматически перед началом работы с обработчиками.

Способ 2. Инициализация структуры параметров в правилах обмена

Если перенос выполняется через универсальную обработку выгрузки, необходимо гарантировать инициализацию структуры параметров. В обработчик «Перед выгрузкой данных» правил обмена (в обработчиках конвертации) добавьте инициализацию ключа Алгоритмы:


Если Параметры.Алгоритмы = Неопределено Тогда
    Параметры.Алгоритмы = Новый Структура;
КонецЕсли;

Если требуется передавать код конкретных алгоритмов из КД 2 в структуру параметров, заполните ее соответствием или структурой, где ключом выступает имя алгоритма, а значением — текст или сам алгоритм.

Способ 3. Переписывание вызова алгоритмов без участия общего модуля

Если вы дорабатываете правила обмена вручную, можно отказаться от вызова функции общего модуля и выполнять алгоритмы напрямую в обработчиках правил обмена через встроенный оператор Конвертации Данных:


// Прямой вызов алгоритма КД 2 из контекста правил:
СчетаУчета = Неопределено;
Выполнить(Алгоритмы.ЗаполнитьСчетаУчетаРасчетов_РТУ);

В самом алгоритме КД код принимает и инициализирует необходимые переменные контекста:


// Код алгоритма "ЗаполнитьСчетаУчетаРасчетов_РТУ":
Если СчетаУчета = Неопределено Тогда
    СчетаУчета = БухгалтерскийУчетПереопределяемый.ПолучитьСчетаРасчетовСКонтрагентом(
        Объект.Организация, 
        Объект.Контрагент, 
        Объект.ДоговорКонтрагента
    );
КонецЕсли;

В параметрах алгоритма в КД 2 в этом случае указываются используемые переменные (например, Объект, СчетаУчета). Это позволяет избежать обращения к Параметры.Алгоритмы через квадратные скобки из внешнего общего модуля.

← На главную