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

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

При настройке правил обмена между конфигурацией «1С:Торговля и Склад 7.7» и «1С:Управление торговлей 11» с помощью «Конвертации данных 2.0» (КД 2.0) разработчики часто сталкиваются с ошибками при попытке обратиться к объекту-источнику на стороне базы-приемника. Рассмотрим типичную ситуацию: необходимо связать загружаемый сертификат с номенклатурой и сделать запись в регистр сведений ОбластиДействияСертификатовНоменклатуры в обработчике ПослеЗагрузки.

Разберем, почему возникает ошибка, почему недоступна переменная Источник и какими способами можно корректно передать данные из 7.7 в 8.х.

Почему возникает ошибка «Поле объекта не обнаружено» в обработчике ПослеЗагрузки

Проанализируем контекст выполнения обработчиков в КД 2.0:

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

Рассмотрим рабочие способы решения данной задачи.

Способ 1. Архитектурно правильный — перенос через отдельное ПКО для регистра сведений

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

Разберем настройку по шагам:

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

ИсходящиеДанные = СоздатьОбъект("СписокЗначений");
ИсходящиеДанные.Установить("Номенклатура", Источник.ТекущийЭлемент());
ИсходящиеДанные.Установить("СертификатНоменклатуры", Источник.Сертификат);

ВыгрузитьПоПравилу(, , ИсходящиеДанные, , "ОбластиДействияСертификатовНоменклатуры");

Способ 2. Ручное формирование XML-узла параметра в 7.7

Если требуется передать дополнительное значение (например, код номенклатуры) непосредственно с объектом сертификата, можно сформировать узел параметра прямо в дереве XML на стороне 7.7.

1. В обработчике ПКО сертификата «При выгрузке» (в 7.7) добавим следующий код:


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

2. В обработчике ПКО «После загрузки» (в 1С 8) прочитаем переданное значение из коллекции ПараметрыОбъекта:


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

Способ 3. Передача данных через временные строковые реквизиты

В случаях, когда нет возможности вмешиваться в формирование XML-дерева, можно передать связующую информацию через строковые реквизиты достаточной длины (например, поле Комментарий или Наименование), упаковав код номенклатуры в строку с разделителем.

Посмотрим на пример реализации:

  1. В ПКС реквизита Наименование при выгрузке из 7.7 сформируем составную строку вида: КодНоменклатуры;НаименованиеСертификата.
  2. В обработчике ПослеЗагрузки в 1С 8 распарсим строку, извлечем код номенклатуры, восстановим исходное наименование сертификата и выполним запись в регистр сведений.

Важное замечание: При записи в регистр ОбластиДействияСертификатовНоменклатуры в конфигурации «Управление торговлей 11» убедитесь, что корректно заполнены все обязательные измерения и реквизиты (вид номенклатуры, номенклатура, область действия), иначе типовые проверки сертификатов при проведении торговых документов не смогут сопоставить сертификат с позицией номенклатуры.

← На главную