При настройке правил обмена между конфигурацией «1С:Торговля и Склад 7.7» и «1С:Управление торговлей 11» с помощью «Конвертации данных 2.0» (КД 2.0) разработчики часто сталкиваются с ошибками при попытке обратиться к объекту-источнику на стороне базы-приемника. Рассмотрим типичную ситуацию: необходимо связать загружаемый сертификат с номенклатурой и сделать запись в регистр сведений ОбластиДействияСертификатовНоменклатуры в обработчике ПослеЗагрузки.
Разберем, почему возникает ошибка, почему недоступна переменная Источник и какими способами можно корректно передать данные из 7.7 в 8.х.
Проанализируем контекст выполнения обработчиков в КД 2.0:
Источник в данном обработчике не существует — доступны только Объект, ПараметрыОбъекта, СсылкаНаОбъект, Параметры и системные переменные.V77Exp.ert). В отличие от обмена между двумя базами 1С 8, где флаг «Передавать данные в параметр» автоматически упаковывает значения в структуру ПараметрыОбъекта, типовая выгрузка 7.7 не поддерживает этот механизм «из коробки». Попытка обратиться к глобальной коллекции через Параметры.Код в приемнике приводит к ошибке Поле объекта не обнаружено (Код), если данный параметр не был объявлен глобально в правилах.Рассмотрим рабочие способы решения данной задачи.
Вместо ручного создания записей в регистре через МенеджерЗаписи внутри обработчика ПослеЗагрузки справочника, правильнее использовать стандартный механизм выгрузки по правилу. Это ускоряет перенос данных, так как запись выполняется пакетом в общей транзакции, а не отдельными вызовами метода Записать() на каждый элемент.
Разберем настройку по шагам:
РегистрСведенийЗапись.ОбластиДействияСертификатовНоменклатуры.Номенклатура, СертификатНоменклатуры, ВидНоменклатуры установим флаг «Получить из входящих данных».ВыгрузитьПоПравилу:
ИсходящиеДанные = СоздатьОбъект("СписокЗначений");
ИсходящиеДанные.Установить("Номенклатура", Источник.ТекущийЭлемент());
ИсходящиеДанные.Установить("СертификатНоменклатуры", Источник.Сертификат);
ВыгрузитьПоПравилу(, , ИсходящиеДанные, , "ОбластиДействияСертификатовНоменклатуры");
Если требуется передать дополнительное значение (например, код номенклатуры) непосредственно с объектом сертификата, можно сформировать узел параметра прямо в дереве XML на стороне 7.7.
1. В обработчике ПКО сертификата «При выгрузке» (в 7.7) добавим следующий код:
УзелПараметра = СоздатьУзел("ЗначениеПараметра");
УстановитьАтрибут(УзелПараметра, "Имя", "КодНоменклатуры");
УстановитьАтрибут(УзелПараметра, "Тип", "Строка");
ЗаписатьЭлемент(УзелПараметра, "Значение", СокрЛП(Источник.Код));
ДобавитьПодчиненный(Приемник, УзелПараметра);
2. В обработчике ПКО «После загрузки» (в 1С 8) прочитаем переданное значение из коллекции ПараметрыОбъекта:
Если ПараметрыОбъекта <> Неопределено Тогда
КодНоменклатуры = ПараметрыОбъекта.Получить("КодНоменклатуры");
Если ЗначениеЗаполнено(КодНоменклатуры) Тогда
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоКоду(КодНоменклатуры);
Если ЗначениеЗаполнено(НоменклатураСсылка) Тогда
МенеджерЗаписи = РегистрыСведений.ОбластиДействияСертификатовНоменклатуры.СоздатьМенеджерЗаписи();
МенеджерЗаписи.СертификатНоменклатуры = Объект.Ссылка;
МенеджерЗаписи.Номенклатура = НоменклатураСсылка;
МенеджерЗаписи.ВидНоменклатуры = НоменклатураСсылка.ВидНоменклатуры;
МенеджерЗаписи.Записать(Истина);
КонецЕсли;
КонецЕсли;
КонецЕсли;
В случаях, когда нет возможности вмешиваться в формирование XML-дерева, можно передать связующую информацию через строковые реквизиты достаточной длины (например, поле Комментарий или Наименование), упаковав код номенклатуры в строку с разделителем.
Посмотрим на пример реализации:
Наименование при выгрузке из 7.7 сформируем составную строку вида: КодНоменклатуры;НаименованиеСертификата.ПослеЗагрузки в 1С 8 распарсим строку, извлечем код номенклатуры, восстановим исходное наименование сертификата и выполним запись в регистр сведений.Важное замечание: При записи в регистр ОбластиДействияСертификатовНоменклатуры в конфигурации «Управление торговлей 11» убедитесь, что корректно заполнены все обязательные измерения и реквизиты (вид номенклатуры, номенклатура, область действия), иначе типовые проверки сертификатов при проведении торговых документов не смогут сопоставить сертификат с позицией номенклатуры.