0
EsperJet
29.08.17
✎
19:11
|
Дано:
Имеется справочник, в нем реквизит с типом "Хранилище значений", в этом хранилище всегда структура, в структуре может быть разное количество полей, поля в структуре имеют тип как простой (число, строка, дата, булево), так и сложный (СправочникСсылка, ПеречислениеСсылка).
Задача:
Используя Конвертацию Данных 2 перенести этот реквизит вместе с его содержимым.
Текущее решение:
Используется ПКО (правило конвертации объекта) самого справочника и два обработчика событий: "ПередВыгрузкой" и "ПослеЗагрузки". В обработчике "ПередВыгрузкой" в параметры записывается структура с использованием функции "ЗначениеВСтрокуВнутр", предварительно просматриваются все значения в структуре, и если какое то из них имеет сложный тип (не строка, или число и т.д.), то вызывается функция "ВыгрузитьПоПравилу", куда и передается это значение.
В обработчике "ПослеЗагрузки" из параметра достается структура путем вызова "ЗначениеИзСтрокиВнутр", и записывается в реквизит, используся создание нового хранилища значений.
Проблема:
Простые типы конвертируются правильно, сложные типы только выгружаются, но не подцепляются в соответствующие поля структуры, которая лежит в хранилище значений справочника.
Код обработчика "ПередВыгрузкой":
//++
ПараметрыВнешнейОбработки = Источник.ПараметрыВнешнейОбработки.Получить();
Параметры.Вставить("ПараметрыВнешнейОбработкиСтрокой");
Если ТипЗнч(Структура) = Тип("Структура") Тогда
Для Каждого КлючЗначение Из Структура Цикл
Попытка
ТЗ = ТипЗнч(КлючЗначение.Значение);
Если ТЗ <> Тип("Строка") И ТЗ <> Тип("Число") И ТЗ <> Тип("Дата") И ТЗ <> Тип("Булево") Тогда
ВыгрузитьПоПравилу(КлючЗначение.Значение);
КонецЕсли;
Исключение
КонецПопытки;
КонецЦикла;
Параметры.Вставить("ПараметрыВнешнейОбработкиСтрокой", ЗначениеВСтрокуВнутр(Структура));
КонецЕсли;
//--
Код обработчика "ПослеЗагрузки":
//++
ПараметрыВнешнейОбработкиСтрокой = ПараметрыОбъекта.Получить("ПараметрыВнешнейОбработкиСтрокой");
Если ПараметрыВнешнейОбработкиСтрокой <> Неопределено Тогда
Структура = ЗначениеИзСтрокиВнутр(ПараметрыВнешнейОбработкиСтрокой);
Объект.ПараметрыВнешнейОбработки = Новый ХранилищеЗначения(Структура);
КонецЕсли;
//--
Что я делаю не так?
|
|