Как в пакете XDTO описать значение смешанного типа а также элементы и группы справочников?

1. newborn 15.03.23 14:50 Сейчас в теме
Самописная конфигурация. Делаем обмен на КД3. Пришлось делать дополнительный пакет XDTO. Многих вещей ещё не знаю.
Проблема:
1. Реквизит передаваемого объекта имеет смешанный тип.
2. В реквизите передаваемого объекта могут быть и группы и элементы справочников.
Как описывать эти вещи в пакете XDTO?
Найденные решения
3. newborn 27.03.23 09:30 Сейчас в теме
Ну, в общем, нормального решения не нашлось. Пришлось:
1. изменять XDTO пакет от БСП
2. в обработчике "ПриОтправке" (на стороне отправки) ставить такой код:
// ПолучателиСкидкиКонтрагенты
ПолучателиСкидкиКонтрагенты = Новый ТаблицаЗначений();
ПолучателиСкидкиКонтрагенты.Колонки.Добавить("Получатель");
ПолучателиСкидкиКонтрагенты.Колонки.Добавить("ЭтоГруппа");

Для каждого ТекущаяСтрока Из ДанныеИБ.ПолучателиСкидкиКонтрагенты Цикл
    
    <b>СтрокаПолучателиСкидкиКонтрагенты = ПолучателиСкидкиКонтрагенты.Добавить();
    
    Инструкция = Новый Структура("Значение, ИмяПКО");
    Инструкция.Значение = ТекущаяСтрока.Получатель;
    Если ТекущаяСтрока.Получатель.ЭтоГруппа Тогда
        Инструкция.ИмяПКО = "Справочник_КонтрагентыГруппа_Отправка";
    Иначе
        Инструкция.ИмяПКО = "Справочник_Контрагенты_Отправка";
    КонецЕсли;
    СтрокаПолучателиСкидкиКонтрагенты.Получатель = Инструкция;
    
    СтрокаПолучателиСкидкиКонтрагенты.ЭтоГруппа = ТекущаяСтрока.Получатель.ЭтоГруппа;</b>
    
КонецЦикла;
Если ПолучателиСкидкиКонтрагенты.Количество()>0 Тогда
    ДанныеXDTO.Вставить("ПолучателиСкидкиКонтрагенты",ПолучателиСкидкиКонтрагенты);
КонецЕсли;
Показать

3. В обработчике ПриКонвертацииДанныхXDTO (на стороне приёма) ставить такой код:
Если ДанныеXDTO.Свойство("ПолучателиСкидкиКонтрагенты") Тогда
    
    ПолучателиСкидкиКонтрагенты = Новый Массив();
    Для каждого ТекущаяСтрока Из ДанныеXDTO.ПолучателиСкидкиКонтрагенты Цикл
        
        <b>СтрокаДанных = Новый Структура("Получатель");
        
        Если ТекущаяСтрока.ЭтоГруппа Тогда
            ИмяПКО = "Справочник_КонтрагентыГруппа_Получение";
        Иначе
            ИмяПКО = "Справочник_Контрагенты_Получение";        
        КонецЕсли;</b>        
        
        СтрокаДанных.Получатель = Новый Структура("Значение,ИмяПКО", ТекущаяСтрока.Получатель, ИмяПКО);
        ПолучателиСкидкиКонтрагенты.Добавить(СтрокаДанных);
        
    КонецЦикла;
    ПолученныеДанные.ДополнительныеСвойства.Вставить("ПолучателиСкидкиКонтрагенты", ПолучателиСкидкиКонтрагенты);
    
КонецЕсли;
Показать


Согласен, возможно это не лучшее решение. Но другого не нашлось...
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. newborn 15.03.23 16:07 Сейчас в теме
3. newborn 27.03.23 09:30 Сейчас в теме
Ну, в общем, нормального решения не нашлось. Пришлось:
1. изменять XDTO пакет от БСП
2. в обработчике "ПриОтправке" (на стороне отправки) ставить такой код:
// ПолучателиСкидкиКонтрагенты
ПолучателиСкидкиКонтрагенты = Новый ТаблицаЗначений();
ПолучателиСкидкиКонтрагенты.Колонки.Добавить("Получатель");
ПолучателиСкидкиКонтрагенты.Колонки.Добавить("ЭтоГруппа");

Для каждого ТекущаяСтрока Из ДанныеИБ.ПолучателиСкидкиКонтрагенты Цикл
    
    <b>СтрокаПолучателиСкидкиКонтрагенты = ПолучателиСкидкиКонтрагенты.Добавить();
    
    Инструкция = Новый Структура("Значение, ИмяПКО");
    Инструкция.Значение = ТекущаяСтрока.Получатель;
    Если ТекущаяСтрока.Получатель.ЭтоГруппа Тогда
        Инструкция.ИмяПКО = "Справочник_КонтрагентыГруппа_Отправка";
    Иначе
        Инструкция.ИмяПКО = "Справочник_Контрагенты_Отправка";
    КонецЕсли;
    СтрокаПолучателиСкидкиКонтрагенты.Получатель = Инструкция;
    
    СтрокаПолучателиСкидкиКонтрагенты.ЭтоГруппа = ТекущаяСтрока.Получатель.ЭтоГруппа;</b>
    
КонецЦикла;
Если ПолучателиСкидкиКонтрагенты.Количество()>0 Тогда
    ДанныеXDTO.Вставить("ПолучателиСкидкиКонтрагенты",ПолучателиСкидкиКонтрагенты);
КонецЕсли;
Показать

3. В обработчике ПриКонвертацииДанныхXDTO (на стороне приёма) ставить такой код:
Если ДанныеXDTO.Свойство("ПолучателиСкидкиКонтрагенты") Тогда
    
    ПолучателиСкидкиКонтрагенты = Новый Массив();
    Для каждого ТекущаяСтрока Из ДанныеXDTO.ПолучателиСкидкиКонтрагенты Цикл
        
        <b>СтрокаДанных = Новый Структура("Получатель");
        
        Если ТекущаяСтрока.ЭтоГруппа Тогда
            ИмяПКО = "Справочник_КонтрагентыГруппа_Получение";
        Иначе
            ИмяПКО = "Справочник_Контрагенты_Получение";        
        КонецЕсли;</b>        
        
        СтрокаДанных.Получатель = Новый Структура("Значение,ИмяПКО", ТекущаяСтрока.Получатель, ИмяПКО);
        ПолучателиСкидкиКонтрагенты.Добавить(СтрокаДанных);
        
    КонецЦикла;
    ПолученныеДанные.ДополнительныеСвойства.Вставить("ПолучателиСкидкиКонтрагенты", ПолучателиСкидкиКонтрагенты);
    
КонецЕсли;
Показать


Согласен, возможно это не лучшее решение. Но другого не нашлось...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот