Как передать сложную структуру данных через параметр в правилах конвертации свойств (ПКС)?

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

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

В этой статье мы подробно разберем, почему возникает эта проблема, и рассмотрим несколько способов ее решения — от простых «костылей» до архитектурно правильных методов сериализации данных. Для запуска регулярной синхронизации по готовым правилам можно автоматизировать регулярный обмен данными по расписанию без изменения самих конфигураций.

Почему параметры «теряются» при выгрузке?

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

Выясним причину, по которой ПараметрыОбъекта в ПКО приемника могут быть недоступны. Параметры, передаваемые через ПКС, становятся доступны только после того, как все свойства объекта будут считаны из файла. Если вы пытаетесь обратиться к ним в обработчиках, которые выполняются до завершения чтения блока свойств (например, Перед загрузкой), вы неизбежно получите Неопределено.

Способ 1. Использование системной сериализации (ЗначениеВСтрокуВнутр)

Рассмотрим самый быстрый и часто используемый способ, предложенный участниками обсуждения. Он заключается в принудительном преобразовании сложной структуры в специальный строковый формат 1С.

Шаг 1. Настройка в базе-источнике

В правилах конвертации свойств (ПКС) для нужного параметра (например, ЗначениеЕдиницыХранения) в обработчике Перед выгрузкой мы формируем нашу структуру и упаковываем ее в строку:


// Создаем структуру с необходимыми данными
ПередаваемаяСтруктура = Новый Структура;
ПередаваемаяСтруктура.Вставить("НайденаЕХ", Истина);
ПередаваемаяСтруктура.Вставить("УчетПоСерийным Номерам", Источник.ИспользоватьСерийныеНомера);
ПередаваемаяСтруктура.Вставить("Склад", Источник.Склад);

// Сериализуем структуру во внутреннюю строку 1С
Значение = ЗначениеВСтрокуВнутр(ПередаваемаяСтруктура);

Шаг 2. Настройка в базе-приемнике

В правилах конвертации объекта (ПКО) в обработчике После загрузки мы выполняем обратное преобразование. Важно использовать именно После загрузки, так как именно в этот момент параметры уже гарантированно считаны из XML.


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

Важное замечание: Метод ЗначениеВСтрокуВнутр чувствителен к версиям платформы и метаданным. Если вы передаете в структуре ссылки на объекты (например, конкретный Склад), убедитесь, что GUID этих объектов идентичны в обеих базах, иначе ссылка может не восстановиться корректно.

Способ 2. Передача параметров через ПКО (Архитектурный подход)

Разберем более «чистый» способ. В 1С:Конвертации данных 2.1 можно указать конкретное правило конвертации объекта (ПКО) даже для параметров. Это позволяет системе использовать штатные механизмы сериализации объектов.

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

Этот метод позволяет избежать проблем с типами данных и делает код более читаемым и поддерживаемым. Для точечной миграции объектов между базами со схожей структурой можно выполнить перенос данных между похожими конфигурациями 1С с использованием произвольных полей поиска.

Особенности передачи двоичных данных

Посмотрим на ситуацию, когда через параметры нужно передать картинку, сертификат или файл (тип ДвоичныеДанные). Прямая передача или использование ЗначениеВСтрокуВнутр здесь часто дают сбой, так как XML-парсер может «споткнуться» о нетекстовые символы.

Проанализируем правильный алгоритм работы с бинарными данными в параметрах:

Выгрузка (Источник):


// Преобразуем двоичные данные в строку Base64
Если ТипЗнч(Источник.ДанныеФайла) = Тип("ДвоичныеДанные") Тогда
    Значение = Base64Строка(Источник.ДанныеФайла);
КонецЕсли;

Загрузка (Приемник):


// Восстанавливаем двоичные данные из строки Base64
Если ПараметрыОбъекта.Свойство("Файл") Тогда
    ДвоичныеДанные = Base64Значение(ПараметрыОбъекта["Файл"]);
    // Далее записываем их в реквизит или ХранилищеЗначений
    Объект.Данные = Новый ХранилищеЗначений(ДвоичныеДанные);
КонецЕсли;

Использование XDTO-сериализации

Для наиболее сложных случаев, когда обмен идет между существенно разными конфигурациями, мы рекомендуем использовать XDTO. Это современный стандарт 1С для представления данных в виде XML/JSON. Он гораздо надежнее, чем ЗначениеВСтрокуВнутр, так как формат XDTO строго детерминирован.

Пример выгрузки структуры через XDTO:


// В ПКС Перед выгрузкой
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXDTO(ЗаписьXML, ПередаваемаяСтруктура);
Значение = ЗаписьXML.Закрыть();

Пример загрузки через XDTO:


// В ПКО После загрузки
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ПараметрыОбъекта["МояСтруктура"]);
Результат = СериализаторXDTO.ПрочитатьXDTO(ЧтениеXML);

Резюме и рекомендации

Подводя итог, проанализируем основные правила успешной передачи параметров через ПКС:

Используя эти подходы, вы сможете передавать любые объемы сопутствующей информации между базами 1С, обеспечивая гибкость и надежность ваших механизмов интеграции. Чтобы проконтролировать качество переноса, удобно автоматически сравнить бухгалтерские и налоговые проводки между базами с помощью специальной обработки.

← На главную