Имя: Пароль:
1C
1С v8
Конвертация данных + Хранилище значений + Структура
0 EsperJet
 
29.08.17
19:11
Дано:
Имеется справочник, в нем реквизит с типом "Хранилище значений", в этом хранилище всегда структура, в структуре может быть разное количество полей, поля в структуре имеют тип как простой (число, строка, дата, булево), так и сложный (СправочникСсылка, ПеречислениеСсылка).

Задача:
Используя Конвертацию Данных 2 перенести этот реквизит вместе с его содержимым.

Текущее решение:
Используется ПКО (правило конвертации объекта) самого справочника и два обработчика событий: "ПередВыгрузкой" и "ПослеЗагрузки". В обработчике "ПередВыгрузкой" в параметры записывается структура с использованием функции "ЗначениеВСтрокуВнутр", предварительно просматриваются все значения в структуре, и если какое то из них имеет сложный тип (не строка, или число и т.д.), то вызывается функция "ВыгрузитьПоПравилу", куда и передается это значение.
В обработчике "ПослеЗагрузки" из параметра достается структура путем вызова "ЗначениеИзСтрокиВнутр", и записывается в реквизит, используся создание нового хранилища значений.

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

Код обработчика "ПередВыгрузкой":
//++
ПараметрыВнешнейОбработки = Источник.ПараметрыВнешнейОбработки.Получить();

Параметры.Вставить("ПараметрыВнешнейОбработкиСтрокой");

Если ТипЗнч(Структура) = Тип("Структура") Тогда
    Для Каждого КлючЗначение Из Структура Цикл
        Попытка
            ТЗ = ТипЗнч(КлючЗначение.Значение);
            
            Если ТЗ <> Тип("Строка") И ТЗ <> Тип("Число") И ТЗ <> Тип("Дата") И ТЗ <> Тип("Булево") Тогда
                ВыгрузитьПоПравилу(КлючЗначение.Значение);
            КонецЕсли;
        Исключение
        КонецПопытки;
    КонецЦикла;
    
    Параметры.Вставить("ПараметрыВнешнейОбработкиСтрокой", ЗначениеВСтрокуВнутр(Структура));
КонецЕсли;
//--

Код обработчика "ПослеЗагрузки":
//++
ПараметрыВнешнейОбработкиСтрокой = ПараметрыОбъекта.Получить("ПараметрыВнешнейОбработкиСтрокой");

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

Что я делаю не так?
Закон Брукера: Даже маленькая практика стоит большой теории.