Как передать параметры в строках табличной части при конвертации из 1С 7.7 в 1С 8.x?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При работе с инструментом «Конвертация данных 2.1» программисты часто сталкиваются с ограничением платформы 1С 7.7. В отличие от версии 8.x, стандартная обработка выгрузки для «семерки» (V77Exp.ert) не умеет корректно обрабатывать флаг «Передать в параметр» для свойств, находящихся внутри табличных частей. Если в источнике (ТиС, Бухгалтерия 7.7) есть данные, которые нужны в приемнике (БП 3.0, УТ 11) только для программной обработки в событии ПослеЗагрузки, но при этом самого реквизита в метаданных приемника нет — возникает проблема.

В этой статье мы подробно разберем, почему стандартный механизм дает сбой и какими способами можно передать данные из строки табличной части 7.7 в 8.x, сохранив чистоту метаданных целевой базы.

Почему стандартный механизм параметров не работает в 1С 7.7

Проанализируем работу выгрузки. В 1С 8.x при установке галочки «Передать в параметр» в ПКС (Правиле конвертации свойства), движок конвертации создает специальную структуру ПараметрыОбъекта, которая передается в XML-файле отдельно от основных реквизитов. В 1С 7.7 обработка V77Exp.ert при выгрузке табличных частей жестко ориентирована на структуру подчиненных узлов XML, соответствующих реквизитам табличной части приемника. Если приемник у ПКС пустой, обработка может проигнорировать выгрузку или выдать ошибку, так как она не находит целевого имени узла в схеме данных.

Выясним, как обойти это ограничение, используя несколько проверенных подходов.

Способ 1: Ручное формирование узлов XML (Низкоуровневый метод)

Этот метод считается наиболее «технологичным», так как он позволяет передать данные непосредственно в структуре XML-узла строки, которые затем будут доступны в 8.x через соответствие ПараметрыОбъекта. Рассмотрим реализацию этого метода в ПКС табличной части.

На стороне 1С 7.7 в ПКС, который должен передавать параметр (приемник у этого ПКС оставляем пустым), в обработчике «Перед выгрузкой» или «При выгрузке» мы можем напрямую управлять XML-документом. Используем объект Приемник (который в контексте 7.7 является узлом DOMElement) для добавления своего значения.


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

Разберем, что происходит в этом коде. Мы вручную создаем узел ЗначениеПараметра, который стандартно используется в КД 2.1 для передачи параметров. Устанавливаем ему имя (по которому будем обращаться в 8.x) и записываем значение. После этого добавляем этот узел в текущий Приемник (узел строки табличной части). Теперь при загрузке в 8.x эти данные автоматически попадут в коллекцию ПараметрыОбъекта.

На стороне 1С 8.x в ПКО документа в обработчике «После загрузки» мы можем прочитать эти данные следующим образом:


Если Объект.Товары.Количество() > 0 Тогда
    ПараметрыТЧ = ПараметрыОбъекта["МойДопПараметрСтроки"];
    // Обратите внимание: если параметр передавался для каждой строки, 
    // логика доступа может зависеть от того, как КД упаковала эти данные.
    // Обычно параметры строк доступны через обход коллекции ПараметрыОбъекта.
КонецЕсли;

Способ 2: Использование глобальной таблицы параметров

Если передача через узлы строк кажется слишком сложной, рассмотрим альтернативный вариант — использование глобального параметра всей конвертации. Мы создадим таблицу значений (в контексте 7.7 — ТаблицуЗначений или СписокЗначений), в которую будем записывать данные всех строк всех документов.

  1. Создадим в правилах обмена параметр с типом ТаблицаЗначений, назовем его ТаблицаДопДанных. Поставим флаг «Передавать при загрузке».
  2. В ПКО документа в обработчике «Перед выгрузкой» или в ПКГС (Правиле конвертации группы свойств/ТЧ) будем наполнять эту таблицу значениями.

Пример кода в 7.7 для наполнения таблицы:


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

В базе-приемнике (8.x) в глобальном обработчике «После загрузки данных» (или в ПослеЗагрузки конкретного объекта) мы обращаемся к этой таблице, находим нужные строки по ссылке на документ и номеру строки, и выполняем необходимые действия. Этот метод надежен тем, что не требует изменения структуры XML внутри узлов строк, которые 7.7 может обрабатывать капризно.

Способ 3: Сериализация данных в «технический» реквизит

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

Посмотрим на алгоритм действий:

  1. В 7.7 в ПКС этого реквизита в обработчике «Перед выгрузкой» собираем все нужные параметры в одну строку с разделителями. Например: Значение1 + "|" + Значение2 + "|" + Значение3.
  2. В 8.x в обработчике «После загрузки» объекта запускаем цикл по табличной части.
  3. Для каждой строки извлекаем данные функцией СтрРазделить(СтрокаТЧ.ТехническоеПоле, "|").
  4. Используем полученные данные в логике заполнения (например, для установки счетов учета), после чего очищаем техническое поле, чтобы не оставлять «мусор» в базе.

Важный момент: Если свободного текстового поля в ТЧ нет, можно создать ПКС с пустым источником, но существующим приемником (любым текстовым полем). В 7.7 программно передать в него значение Выражение = "НужныеДанные". Это самый простой способ, не требующий глубоких знаний структуры XML.

Сравнение методов и рекомендации

Выбор метода зависит от объема данных и ваших предпочтений в разработке:

Помните, что при работе с 7.7 ключевым ограничением является v7plus.dll и ее методы работы с XML. Если вы используете метод СоздатьУзел, убедитесь, что библиотека корректно зарегистрирована на сервере, где выполняется выгрузка, иначе вы получите ошибку инициализации объекта DOM.

Рассмотренные подходы позволяют гибко настраивать обмен данными между морально устаревшей 7.7 и современной 8.3, обходя жесткие ограничения стандартных механизмов «Конвертации данных».

← На главную