При выполнении обмена данными между конфигурациями (например, при переносе данных из «1С:Зарплата и Управление Персоналом 2.5» в «1С:ЗУП 3.1») разработчики часто сталкиваются с ситуацией, когда правила обмена используют алгоритмы Конвертации Данных (КД 2), вызываемые из экспортных функций общих модулей источника.
Если запустить такой перенос не через штатный помощник перехода, а через универсальную обработку УниверсальныйОбменДаннымиXML.epf, возникает следующая ошибка:
Ошибка в обработчике события ПередОбработкойПравилаВыгрузки:
ОписаниеОшибки = Получение элемента по индексу для значения не определено
ПозицияМодуля = ОбщийМодуль.ОбъектыПереносаДанных.Модуль(19)
Проанализируем причины возникновения этой проблемы и разберем варианты ее решения.
Рассмотрим, как устроен вызов алгоритма из общего модуля в стандартных правилах переноса. В обработчике правила выгрузки данных (ПВД) или ПКО выполняется следующий код:
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ДатаНачалаПереносаРасчетныхДанных", Параметры.ДатаНачалаПереносаРасчетныхДанных);
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ГрафикиРаботыПоВидамВремени.ГрафикРаботы
|ИЗ
| РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботыПоВидамВремени
|ГДЕ
| ГрафикиРаботыПоВидамВремени.ГрафикРаботы ССЫЛКА Справочник.ГрафикиРаботы
| И ГрафикиРаботыПоВидамВремени.План
| И ГрафикиРаботыПоВидамВремени.Месяц >= &ДатаНачалаПереносаРасчетныхДанных";
Выборка = Запрос.Выполнить().Выбрать();
// Вызов функции общего модуля, в которую передается Параметры.Алгоритмы
ГрафикиРаботыМассив = ОбъектыПереносаДанных.ВыполнитьАлгоритм("ГрафикиРаботы_Выгрузить", Параметры.Алгоритмы, Выборка, Параметры, Ложь, Ложь);
Для каждого ГрафикРаботы Из ГрафикиРаботыМассив Цикл
ВыгрузитьПоПравилу(ГрафикРаботы, , , , "ГрафикиРаботыСотрудников");
Выполнить(Алгоритмы.ГрафикиРаботыПоВидамВремени_Выгрузить);
КонецЦикла;
Внутри экспортной функции общего модуля ОбъектыПереносаДанных.ВыполнитьАлгоритм() расположен следующий код исполнения:
Функция ВыполнитьАлгоритм(ИмяАлгоритма, Знач Алгоритмы, ИсходящиеДанные = "", ...) Экспорт
ВидСубконто = Алгоритмы;
Субконто = Неопределено;
// В этой строке происходит падение, если параметр Алгоритмы не заполнен:
Выполнить(Алгоритмы[ИмяАлгоритма]);
Возврат Субконто;
КонецФункции
Причина ошибки заключается в том, что контекстная переменная Алгоритмы доступна локально только внутри самого кода обработчиков правил обмена КД 2. Экспортные функции общих модулей не видят локальный контекст Конвертации Данных. В штатном мастере перехода структура Параметры.Алгоритмы забивается служебными данными при инициализации переноса. Однако при стандартной выгрузке через обработку УниверсальныйОбменДаннымиXML параметр Параметры.Алгоритмы остается равен Неопределено, что приводит к ошибке обращения по индексу Алгоритмы[ИмяАлгоритма].
Рассмотрим несколько способов исправления ситуации в зависимости от задач разработки.
Если вы выполняете типовой перенос данных ЗУП 2.5 — ЗУП 3.1 без кастомных переработок правил, запускайте перенос из мастера перехода непосредственно в конфигурации. Штатный помощник инициализирует весь необходимый контекст и заполняет структуру Параметры.Алгоритмы автоматически перед началом работы с обработчиками.
Если перенос выполняется через универсальную обработку выгрузки, необходимо гарантировать инициализацию структуры параметров. В обработчик «Перед выгрузкой данных» правил обмена (в обработчиках конвертации) добавьте инициализацию ключа Алгоритмы:
Если Параметры.Алгоритмы = Неопределено Тогда
Параметры.Алгоритмы = Новый Структура;
КонецЕсли;
Если требуется передавать код конкретных алгоритмов из КД 2 в структуру параметров, заполните ее соответствием или структурой, где ключом выступает имя алгоритма, а значением — текст или сам алгоритм.
Если вы дорабатываете правила обмена вручную, можно отказаться от вызова функции общего модуля и выполнять алгоритмы напрямую в обработчиках правил обмена через встроенный оператор Конвертации Данных:
// Прямой вызов алгоритма КД 2 из контекста правил:
СчетаУчета = Неопределено;
Выполнить(Алгоритмы.ЗаполнитьСчетаУчетаРасчетов_РТУ);
В самом алгоритме КД код принимает и инициализирует необходимые переменные контекста:
// Код алгоритма "ЗаполнитьСчетаУчетаРасчетов_РТУ":
Если СчетаУчета = Неопределено Тогда
СчетаУчета = БухгалтерскийУчетПереопределяемый.ПолучитьСчетаРасчетовСКонтрагентом(
Объект.Организация,
Объект.Контрагент,
Объект.ДоговорКонтрагента
);
КонецЕсли;
В параметрах алгоритма в КД 2 в этом случае указываются используемые переменные (например, Объект, СчетаУчета). Это позволяет избежать обращения к Параметры.Алгоритмы через квадратные скобки из внешнего общего модуля.