Как передать произвольный параметр из 1С 7.7 в 1С 8.3 при использовании Конвертации данных 2.0

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

При настройке обмена данными между устаревшей платформой 1С:Предприятие 7.7 и современной 1С:Предприятие 8.x с помощью конфигурации «Конвертация данных 2.0» (КД 2) программисты часто сталкиваются с необходимостью передать не просто объект (справочник или документ), а некую служебную информацию, которая собирается в процессе всей выгрузки. Это может быть лог выполнения, список определенных кодов или инструкция для приемника, как именно обрабатывать загруженные данные.

В этой статье мы подробно разберем, как реализовать механизм «накопительного» параметра, который заполняется в процессе выгрузки объектов в 7.7, корректно помещается в XML-файл и затем обрабатывается в 8-ке после завершения загрузки.

Постановка задачи и основные сложности

Представим ситуацию: нам нужно при выгрузке документов в 7.7 собирать значения определенного реквизита в одну длинную строку. После того как все данные выгружены, эту строку нужно передать в приемник. Основная сложность заключается в том, что стандартная обработка выгрузки для 7.7 (V77Exp.ert) работает с параметрами иначе, чем версия для 8-ки. Если в 8-ке достаточно установить значение в структуру Параметры, то в 7.7 часто требуется «ручное» вмешательство в формирование XML-узлов.

Шаг 1: Настройка параметра в конфигурации «Конвертация данных»

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

  1. Перейдем в настройки конвертации на закладку «Параметры».
  2. Добавим новый параметр, например, с именем ТекстИнструкций.
  3. Установим тип Строка.
  4. Критически важно установить следующие флаги:
    • Устанавливать в диалоге при выгрузке данных — это инициализирует параметр в обработке выгрузки.
    • Использовать параметр при загрузке — чтобы 8-ка «увидела» его в своей структуре параметров.
    • Передавать параметр из информационной базы источника в приемник — без этой галки узел не будет включен в файл обмена автоматически.

Шаг 2: Накопление данных в обработчиках выгрузки (7.7)

Теперь разберем, как программно обращаться к этому параметру внутри 7.7. В среде 7.7 параметры хранятся в специальной таблице значений ТаблицаНастройкиПараметров. Чтобы добавить данные в наш параметр при выгрузке каждого объекта (например, в ПКО документа), используем следующий алгоритм:


// 1. Ищем строку с нашим параметром в системной таблице
ИмяПараметра = "ТекстИнструкций"; 
НомерСтроки = 0;
ТаблицаНастройкиПараметров.НайтиЗначение(ИмяПараметра, НомерСтроки, "Имя");

// 2. Если параметра нет (не инициализирован), создаем его программно
Если НомерСтроки = 0 Тогда
    ТаблицаНастройкиПараметров.НоваяСтрока();
    НомерСтроки = ТаблицаНастройкиПараметров.КоличествоСтрок();
    ТаблицаНастройкиПараметров.ПолучитьСтрокуПоНомеру(НомерСтроки);
    ТаблицаНастройкиПараметров.Имя = ИмяПараметра;
    ТаблицаНастройкиПараметров.Значение = "";
Иначе
    ТаблицаНастройкиПараметров.ПолучитьСтрокуПоНомеру(НомерСтроки);
КонецЕсли;

// 3. Добавляем нужное значение (накапливаем данные)
// Допустим, мы берем значение реквизита "НомерДок" выгружаемого объекта
ТаблицаНастройкиПараметров.Значение = ТаблицаНастройкиПараметров.Значение + Источник.НомерДок + "; ";

Шаг 3: Формирование узла в XML-файле

Для платформы 7.7 автоматическая передача измененного программно параметра в файл обмена может не сработать (в зависимости от версии V77Exp.ert). Поэтому самым надежным способом будет принудительная запись узла в обработчике конвертации «После выгрузки данных».

Проанализируем код, который гарантированно добавит наш параметр в корень XML-документа:


ИмяПараметра = "ТекстИнструкций"; 
НомерСтроки = 0;
ТаблицаНастройкиПараметров.НайтиЗначение(ИмяПараметра, НомерСтроки, "Имя");

Если НомерСтроки > 0 Тогда
    ТаблицаНастройкиПараметров.ПолучитьСтрокуПоНомеру(НомерСтроки);
    
    // Создаем XML-узел параметра вручную
    УзелПарам = СоздатьУзел("ЗначениеПараметра");
    УстановитьАтрибут(УзелПарам, "Имя", ИмяПараметра);
    УстановитьАтрибут(УзелПарам, "Тип", "Строка");
    
    // Записываем накопленное строковое значение
    ЗаписатьЭлемент(УзелПарам, "Значение", ТаблицаНастройкиПараметров.Значение);
    
    // Добавляем созданный узел в корень XML (rootNode — это глобальная переменная в 7.7)
    ДобавитьПодчиненный(rootNode, УзелПарам);
КонецЕсли;

Важное примечание: При записи строковых данных, содержащих спецсимволы (например, амперсанд или кавычки), стандартные методы 7.7 обычно выполняют экранирование автоматически. Если же вы передаете очень объемные данные, убедитесь, что памяти DOM-модели достаточно для формирования финального дерева документа.

Шаг 4: Получение и обработка данных в 1С 8.x (Приемник)

Когда файл загружается в 8-ку, обработка V8Exchan83.epf считывает узел ЗначениеПараметра и автоматически помещает его в структуру Параметры конвертации. Теперь мы можем извлечь эти данные и выполнить необходимые действия.

Лучше всего делать это в обработчике конвертации «После загрузки данных». Рассмотрим пример парсинга нашей накопленной строки:


// Проверяем наличие параметра в структуре
Если Параметры.Свойство("ТекстИнструкций") Тогда
    
    СодержимоеПараметра = СокрЛП(Параметры.ТекстИнструкций);
    
    // Если параметр не пустой, выполняем его разбор (например, разделяем по символу ";")
    Если Не ПустаяСтрока(СодержимоеПараметра) Тогда
        МассивНомеров = СтрРазделить(СодержимоеПараметра, ";", Ложь);
        
        Для Каждого Номер Из МассивНомеров Цикл
            // Здесь пишем логику поиска объектов или регистрации их в планах обмена
            // Например: Сообщить("Загружен объект с номером: " + Номер);
        КонецЦикла;
    КонецЕсли;
    
КонецЕсли;

Дополнительные рекомендации

Разберем несколько нюансов, которые помогут сделать обмен более стабильным:

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

Таким образом, мы выяснили причину сложностей передачи данных из 7.7 и нашли надежный способ обхода ограничений платформы. Использование ручного формирования узла в После выгрузки данных — это проверенный метод, который гарантирует доставку программно сформированных параметров в информационную базу 8-й версии.

← На главную