Как передать произвольные данные из 1С 7.7 в 8.3 через Конвертацию данных 2.1 и сопоставить их по таблице на форме загрузки

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

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

Проблема: ограничение передачи параметров «7.7 — 8.3»

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

Разберем, как решить задачу, когда в 7.7 выгружается код счета (строка), а в 8.3 на форме обработки загрузки есть таблица сопоставления этих кодов с реальными счетами информационной базы 8.3. Наша цель: перехватить данные в процессе загрузки и заменить их на правильные ссылки.

Этап 1: Подготовка данных на стороне 1С 7.7

Поскольку мы не можем просто привязать реквизит формы загрузки к ПКС, нам нужно передать исходное значение из 7.7 в виде «фиктивного» свойства или параметра объекта. Проанализируем способ создания «ручного» параметра в XML-файле выгрузки. Для этого в ПКО (Правиле конвертации объекта) на стороне 7.7 в обработчике При выгрузке можно добавить код, который принудительно запишет в файл обмена нужные нам данные.

Однако проще воспользоваться механизмом создания ПКС с пустым источником. В правилах конвертации свойств для нужной табличной части создаем строку:

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

В обработчике Перед выгрузкой этого ПКС в 7.7 пишем код:

Значение = Источник.Счет.Код; // Получаем строковый код из 7.7

Теперь в XML-файле для каждой строки табличной части будет передаваться значение СтарыйКодСчета, но при загрузке в 8.3 оно не будет пытаться записаться в реальный реквизит документа, что избавит нас от ошибок.

Этап 2: Получение доступа к реквизитам формы загрузки в 8.3

Рассмотрим ситуацию в приемнике. Пользователь открыл обработку УниверсальныйОбменДаннымиXML, заполнил на созданной вами вкладке таблицу сопоставления. Теперь нам нужно обратиться к этой таблице из кода правил конвертации. Выясним, как это сделать.

Все реквизиты формы обработки загрузки доступны через объект обработки. В обработчиках КД 2.1 (таких как ПослеЗагрузки) контекстом исполнения обычно является сама обработка или структура, передающая её параметры. Если вы добавили реквизиты в саму обработку загрузки (в файл .epf), обращение к ним в коде 8.3 будет выглядеть так:


// В обработчике ПослеЗагрузки ПКО документа
ТаблицаСопоставления = Параметры.ТаблицаСчетов; 
// Если таблица добавлена как параметр конвертации

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

Этап 3: Алгоритм замены данных в обработчике «После загрузки»

После того как объект в 8.3 создан в памяти, но еще не записан в базу данных, наступает идеальный момент для трансформации данных. Проанализируем логику работы в обработчике ПКО ПослеЗагрузки.

Нам необходимо обойти табличную часть загруженного документа, извлечь переданный из 7.7 «старый код» и найти соответствующий ему счет в таблице сопоставления с формы. Посмотрим на пример кода:


Для Каждого СтрокаТЧ Из Объект.Состав Цикл
    
    // Пытаемся получить старый код счета, который мы передали как параметр объекта
    // Эти данные обычно доступны в структуре ПараметрыОбъекта
    СтарыйКод = "";
    Если ПараметрыОбъекта <> Неопределено Тогда
        // Если мы передавали данные через ПКС с отключенной записью, 
        // они могут быть доступны в свойствах строки или доп. параметрах
        СтарыйКод = СтрокаТЧ.СтарыйКодСчета; 
    КонецЕсли;
    
    Если ЗначениеЗаполнено(СтарыйКод) Тогда
        
        // Ищем соответствие в таблице, которая находится на форме обработки
        // Предположим, Параметры.ТаблицаСопоставления - это ваша ТЧ с формы
        СтрокаСоответствия = Параметры.ТаблицаСопоставления.Найти(СтарыйКод, "Код77");
        
        Если СтрокаСоответствия <> Неопределено Тогда
            // Устанавливаем реальную ссылку на счет из базы 8.3
            СтрокаТЧ.Счет = СтрокаСоответствия.Счет83;
        Иначе
            // Логика, если соответствие не найдено
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не найдено соответствие для кода: " + СтарыйКод);
        КонецЕсли;
        
    КонецЕсли;
    
КонецЦикла;

Альтернативное решение: Использование параметров объекта

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

Важный нюанс: при загрузке данных из 7.7 в 8.3 через ПослеЗагрузки, если объект не был найден и создается новый, важно убедиться, что все вспомогательные данные (те самые «старые коды») еще доступны. Использование временного реквизита в ТЧ документа (даже если он не существует в метаданных, но описан в ПКС) является наиболее надежным способом «пробросить» строковое значение через XML-пакет.

Выводы и рекомендации

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

  1. На стороне 7.7: Создание ПКС для передачи сырых данных (кодов, идентификаторов) с отключенным флагом записи в базу приемника.
  2. На стороне формы загрузки 8.3: Использование внешних обработок с дополнительными реквизитами (таблицами сопоставления), которые заполняются пользователем перед началом обмена.
  3. В правилах КД 2.1: Использование обработчика ПослеЗагрузки для финального «допиливания» объекта: обхода его табличных частей и замены строковых кодов на ссылки, полученные из внешних данных формы.

Этот подход позволяет избежать изменения структуры конфигурации 8.3 (не нужно добавлять лишние реквизиты в документы) и обеспечивает высокую точность переноса данных даже в тех случаях, когда автоматическое сопоставление по GUID или коду невозможно.

← На главную