Как передать Таблицу Значений между обработчиками в Конвертации данных 2.0?

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

При разработке правил обмена в конфигурации «Конвертация данных 2.0» (или 2.1) нередко требуется сформировать вспомогательную коллекцию (например, таблицу соответствий или список услуг) в одном обработчике и повторно использовать ее в других обработчиках событий — таких как правила конвертации объектов (ПКО) или правила конвертации свойств (ПКС).

Попытка использовать для этих целей стандартный механизм платформы ПоместитьВоВременноеХранилище часто приводит к тому, что при последующем вызове ПолучитьИзВременногоХранилища возвращается Неопределено или пустая коллекция. Разберем по шагам, почему так происходит и как правильно организовать кэширование данных в рамках сеанса загрузки.

Почему не работает Временное хранилище

Проанализируем механику работы временного хранилища платформы «1С:Предприятие 8». Когда мы вызываем метод:

Адрес = ПоместитьВоВременноеХранилище(ТаблицаУслуг, Новый УникальныйИдентификатор);

платформа создает запись во временном хранилище, привязанную к вновь созданному идентификатору. Однако время жизни такого объекта ограничено:

  1. Отсутствие контекста формы: Если второй параметр метода не является уникальным идентификатором открытой клиентской формы, данные во временном хранилище живут только до завершения текущего серверного вызова.
  2. Специфика загрузки данных: Процесс загрузки правил конвертации данных обычно выполняется в рамках серверных процедур обработки XML или фоновых заданий. Переход от обработчика ПослеЗагрузкиПараметров к обработчикам ПКО (например, ПослеЗагрузкиОбъекта) может разделяться серверными контекстами, из-за чего данные, помещенные по сгенерированному идентификатору, просто удаляются сборщиком мусора платформы.

Штатный способ: использование структуры «Параметры»

В «Конвертации данных» механизм обмена предоставляет встроенный глобальный контекст — объект Параметры. На стороне базы-приемника это обычная структура 1С, которая существует на протяжении всего процесса загрузки данных и доступна во всех обработчиках событий.

Нам нет необходимости использовать временное хранилище — достаточно поместить саму ТаблицаЗначений напрямую в структуру Параметры.

Рассмотрим пошаговую реализацию правильного подхода:

  1. Формирование и сохранение таблицы в обработчике параметров:

    В глобальном обработчике конвертации ПослеЗагрузкиПараметров (или ПередЗагрузкойДанных) формируем таблицу и записываем ее в структуру параметров.

    
    // Создаем и заполняем нужную таблицу
    ТаблицаУслуг = Новый ТаблицаЗначений;
    ТаблицаУслуг.Колонки.Добавить("Номенклатура");
    ТаблицаУслуг.Колонки.Добавить("Количество");
    ТаблицаУслуг.Колонки.Добавить("СтавкаНДС");
    
    // Добавляем строки по логике обмена
    Строка = ТаблицаУслуг.Добавить();
    Строка.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Услуга доставки");
    Строка.Количество = 1;
    
    // Помещаем таблицу напрямую в глобальную структуру Параметры
    Параметры.Вставить("ТаблицаУслуг", ТаблицаУслуг);
    

    Обратите внимание: если параметр используется только внутри базы-приемника как временный кэш или алгоритмическая таблица, объявлять его заранее в дереве параметров конвертации необязательно — метод Вставить() добавит новое свойство динамически.

  2. Получение таблицы в обработчиках ПКО:

    В обработчике правила конвертации объекта (например, в ПКО документа ПоступлениеТоваровУслуг в событии ПослеЗагрузки) получаем сохраненную таблицу и выполняем требуемую обработку.

    
    // Проверяем наличие параметра перед обращением к нему
    Если Параметры.Свойство("ТаблицаУслуг") И ЗначениеЗаполнено(Параметры.ТаблицаУслуг) Тогда
        ТЗ = Параметры.ТаблицаУслуг;
        
        // Выполняем действия над загруженным объектом
        Для Каждого Стр Из ТЗ Цикл
            СтрокаТЧ = Объект.Услуги.Добавить();
            СтрокаТЧ.Номенклатура = Стр.Номенклатура;
            СтрокаТЧ.Количество = Стр.Количество;
        КонецЦикла;
    КонецЕсли;
    

Рекомендации по повышению производительности

Посмотрим на практические приемы, которые помогают оптимизировать работу с коллекциями в конвертации данных:

  1. Индексация колонок для быстрого поиска: Если таблица содержит тысячи записей и в ПКО выполняется постоянный поиск строк с помощью НайтиСтроки(), обязательно индексируйте ключевые колонки перед сохранением в Параметры: ТаблицаУслуг.Индексы.Добавить("Номенклатура");
  2. Использование объекта «Соответствие»: Если данные представляют собой сопоставление формата «Ключ — Значение» (например, соответствие старых кодов новым ссылкам), предпочтительнее использовать тип Соответствие вместо ТаблицаЗначений. Доступ по ключу в Соответствие работает значительно быстрее поиска по колонкам таблицы.
  3. Передача таблицы из Источника в Приемник: Если таблицу необходимо рассчитать в базе-источнике и передать в базу-приемник, помните, что тип ТаблицаЗначений напрямую через XML-параметры не сериализуется. В таком случае в источнике упаковываем ее через ЗначениеВСтрокуВнутр(Таблица), а в приемнике в обработчике ПослеЗагрузкиПараметров восстанавливаем через ЗначениеИзСтрокиВнутр(Параметры.ИмяПараметра).
← На главную