Имя: Пароль:
1C
1С v8
Ошибка Несоответствие типов XDTO
,
0 Роспатнюк Сергей Сер
 
25.02.22
14:59
Всем привет добрые формучане помогите разобраться с этим зверем - xdto

текст ошибки
Несоответствие типов XDTO:
Тип '{http://diadoc.kontur.ru/dll_types}ItemIdentificationNumber' не соответствует типу '{http://diadoc.kontur.ru/dll_types}ItemIdentificationNumber'
Тип свойства не соответствует типу значения

Что хочу
Добавить КИЗ в СписокXDTO для каждого элемента таблицы Items

Текст Функции
// Позволяет дополнить/изменить контент электронного документа
// перед его отправкой.
//
// Параметры
//  Параметры - Структура - Содержит коллекцию, переданных параметров:
//    * ТипКонтента         - Строка - идентификатор типа контента (см. ТипыКонтента());
//    * Content             - Структура - Протоконтент исходящего документа;
//    * ДокументСсылка     - ЛюбаяСсылка - Ссылка на документ информационной базы, по которому собирается протоконтент;
//    * DocumentType     - Строка - (Устарел) Позволяет определить тип протоструктуры.
//                                  Параметр сохранен для обратной совместимости с ПМ версии 1.4 или ниже.
//                                  Рекомендуется вместо него ориентироваться на ТипКонтента.
//
// Возвращаемое значение:
//  Структура - Протоконтент электронного документа.
//
Функция ПодготовитьЭлектронныйДокумент(Параметры)
    
    Если ТипЗнч(Параметры) = Тип("Структура") Тогда

        Документ1С         = Параметры.Результат.Документ1С;
        ШтрихкодыУпаковок = Документ1С.ШтрихкодыУпаковок;
        
         Протоконтент   = Параметры.Результат.Content;
        КоллекцияСтрок = Протоконтент.Table.Items;
        
        ProtoФабрикаXDTO            = ProtoФабрикаXDTO();
        ТипЗначенияXDTO_String255 = ProtoФабрикаXDTO.Тип("http://diadoc.kontur.ru/dll_types", "String255");
        
        Если Параметры.ВидДокументаРазвернутый.ID = "ID_УПД_ДОП" Тогда
            
            Для Сч = 1 По КоллекцияСтрок.Количество() - 1 Цикл
                
                Индекс             = Сч - 1;
                Элемент         = КоллекцияСтрок[Индекс];
                НомСредИдентТов = ШтрихкодыУпаковок[Индекс].ЗначениеШтрихкода; // лучше добавить поле НоменклатураСсылка в ТЧ "ШтрихкодыУпаковок" чем опиратся на индекс в строках !
                
                СписокXDTO = Элемент.ItemIdentificationNumbers;
                ВладеющееСвойствоТипИмя = СписокXDTO.ВладеющееСвойство.Тип.Имя;
                
                // тип создаваемого ОбъектаXDTO - ItemIdentificationNumber
                // Свойства:
                //            PackageIds: Коллекция Cтрок (1-255) — уникальный идентификатор вторичной (потребительской)/третичной (заводской, транспортной) упаковки [НомУпак].
                //                        Обязателен при отсутствии [КИЗ] и [ИдентТрансУпак]
                //          TransPackageId: Строка (1-255) — уникальный идентификатор транспортной упаковки [ИдентТрансУпак]. Обязателен при отсутствии [КИЗ] и [НомУпак]
                //          Units: Коллекция Cтрок (1-255) — контрольный идентификационный знак [КИЗ]. Обязателен при отсутствии [ИдентТрансУпак] и [НомУпак]
                
                ProtoОбъектXDTO  = НовыйProtoОбъектXDTO(ВладеющееСвойствоТипИмя);
                СписокXDTO_Units = ProtoОбъектXDTO.Units;
                
                ЗначениеXDTO     = ProtoФабрикаXDTO.Создать(ТипЗначенияXDTO_String255, НомСредИдентТов);
                
                СписокXDTO_Units.Добавить(ЗначениеXDTO);
                СписокXDTO.Добавить(ProtoОбъектXDTO);                
                
            КонецЦикла;
            
        КонецЕсли;
            
    КонецЕсли;
    
    Возврат Истина;

КонецФункции
1 Роспатнюк Сергей Сер
 
25.02.22
15:03
+ 1 падает на строке СписокXDTO.Добавить(ProtoОбъектXDTO)
2 acht
 
25.02.22
15:09
(1) Фабрики, небось, разные
3 Роспатнюк Сергей Сер
 
25.02.22
15:11
(2) Функция ProtoФабрикаXDTO() Экспорт
        
        Результат = XML_ФабрикаXDTO("Proto");
        
        Возврат Результат;
        
КонецФункции

Функция XML_ФабрикаXDTO(ИмяПакетаXDTO) Экспорт
    
    КлючКэш = "ФабрикаXDTO_" + ИмяПакетаXDTO;
    
    Результат = Кэш_Прочитать(КлючКэш);
    
    Если Результат = Неопределено Тогда
        
        ИмяМакета     = ИмяПакетаXDTO + "_xsd";
        ТекстМакета     = ПолучитьМакет(ИмяМакета).ПолучитьТекст();
        
        ЧтениеXML = Новый ЧтениеXML;
        ЧтениеXML.УстановитьСтроку(ТекстМакета);
        
        ПостроительDOM = Новый ПостроительDOM;
        ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
        
        ПостроительСхемXML = Новый ПостроительСхемXML;
        СхемаXML = ПостроительСхемXML.СоздатьСхемуXML(ДокументDOM);
        
        НаборСхемXML = Новый НаборСхемXML;
        НаборСхемXML.Добавить(СхемаXML);
        
        Результат = Новый ФабрикаXDTO(НаборСхемXML);
        
        Кэш_Поместить(КлючКэш, Результат);
        
    КонецЕсли;
    
    Возврат Результат;
    
КонецФункции
4 acht
 
25.02.22
15:11
Это все зашибись. А СписокXDTO чем создан?
5 Роспатнюк Сергей Сер
 
25.02.22
15:13
(4) понял получается надо лезть в недры модуля Диадок и смотреть какой фабрикой создан Протоконтент ?
6 acht
 
25.02.22
15:17
(5) Угу. Если они создаются разными объектами фабрик, то это запросто может разваливать тебе логику.
7 Роспатнюк Сергей Сер
 
25.02.22
15:24
(6) ну да наверно это и происходит так как я Proto_xsd скопировал из модуля ГенерацияXML обработки диадок.
    то есть это 2 разных объекта(макета) хоть и копипаст.
8 Роспатнюк Сергей Сер
 
25.02.22
15:28
(6) заранее спасибо, подскажи ещё надо ли так делать ?

ЗначениеXDTO     = ProtoФабрикаXDTO.Создать(ТипЗначенияXDTO_String255, НомСредИдентТов);
СписокXDTO_Units.Добавить(ЗначениеXDTO);

Или могу просто СписокXDTO_Units.Добавить(НомСредИдентТов);
9 Роспатнюк Сергей Сер
 
25.02.22
15:55
получил макет так не помогло

Функция XML_ФабрикаXDTO(ИмяПакетаXDTO) Экспорт
    
    КлючКэш = "ФабрикаXDTO_" + ИмяПакетаXDTO;
    
    Результат = Кэш_Прочитать(КлючКэш);
    
    СсылкаНаОбъект     = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Диадок (СКБ Контур)");
    ХранилищеОбработки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаОбъект, "ХранилищеОбработки");
    ДвоичныеДанные     = ХранилищеОбработки.Получить();
    АдресХранилища     = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
    ИмяВнОбработки     = ВнешниеОбработки.Подключить(АдресХранилища, , Ложь);
    ОбработкаОбъект    = ВнешниеОбработки.Создать(ИмяВнОбработки);
    
    Если Результат = Неопределено Тогда
        
        ИмяМакета     = ИмяПакетаXDTO + "_xsd";
        ТекстМакета     = ОбработкаОбъект.ПолучитьМакет(ИмяМакета).ПолучитьТекст();
        
        ЧтениеXML = Новый ЧтениеXML;
        ЧтениеXML.УстановитьСтроку(ТекстМакета);
10 mikecool
 
25.02.22
16:06
у диадока разве нет специальной структуры под КИЗ?
11 mikecool
 
25.02.22
16:06
+10 обычно все, что представляется в протоконтенте имеет аналог в объектах 1с
12 Роспатнюк Сергей Сер
 
25.02.22
16:10
(10) если верить тех поддержке то диадок не умеет работать с КИЗ в БП3.0 и нужны доработки с помощью Подключаемого модуля.
13 mikecool
 
25.02.22
16:11
(12) я про это и спрашиваю, техподдержка не намекнула, какую структуру потом превращают в эту информацию?
14 mikecool
 
25.02.22
16:12
вполне себе структуру ДопИнфо или как то так зовется
15 Роспатнюк Сергей Сер
 
25.02.22
16:12
(11) не знаю может и есть дока у них суховатая во всему этому делу.
16 Роспатнюк Сергей Сер
 
25.02.22
16:14
(13) какие там намёки они сразу "анкету на внедрение" в нас швырнули )
17 Роспатнюк Сергей Сер
 
25.02.22
16:14
(14) ок спс посмотрю что то подобное в модулях.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс