Прошу прощения, уважаемый All, вопрос длинный, чисто технический и перегружен специфической информацией.
Предупреждаю заранее, что я в данной теме не силён и возможно делаю очевидную глупую ошибку.
Вынужден осваивать КД3. Знаю его плохо. Но есть необходимость использовать именно его.
(Этот пост НЕ по КД2)
Для разработки правил использую КД 3 (3.1.1.4).
Пишем самопсиную конфигурацию на БСП 3.1.2.430, делаем выгрузку в 1С:Касса.
Используем схему EnterpriseData 1.8.6. Выгружаю документ УстановкаЦенНоменклатуры.
Одно из обязательных свойств ТипЦен с типом КлючевыеСвойстваТипЦен.
У типа КлючевыеСвойстваТипЦен есть обязательное свойство ВалютаЦены с типом КлючевыеСвойстваВалюта.
У типа КлючевыеСвойстваВалюта есть обязательное свойство ДанныеКлассификатора с типом ОбщиеСвойстваДанныеКлассификатора.
У типа ОбщиеСвойстваДанныеКлассификатора есть два НЕОБЯЗАТЕЛЬНЫХ свойства Код и Наименования типа String.
В ПКО Справочник_ТипыЦен для свойства ВалютаЦены ставлю галочку "Используется алгоритм конвертации" и в обработчике события "При отправке" делаю такой код:
СтруктураДанныеКлассификатора = Новый Структура("Код, Наименование");
СтруктураВалютаЦены = Новый Структура("Ссылка, ДанныеКлассификатора");
СтруктураВалютаЦены.ДанныеКлассификатора = СтруктураДанныеКлассификатора;
ТекущаяВалютаЦены = ДанныеИБ.ВалютаЦены;
Если ЗначениеЗаполнено(ТекущаяВалютаЦены) Тогда
СтруктураДанныеКлассификатора.Код = ТекущаяВалютаЦены.Код;
СтруктураДанныеКлассификатора.Наименование = ТекущаяВалютаЦены.Наименование;
СтруктураВалютаЦены.Ссылка = ТекущаяВалютаЦены.Ссылка;
КонецЕсли;
ДанныеXDTO.Вставить("ВалютаЦены", СтруктураВалютаЦены);
Я три дня бился, пытаясь понять, почему обязательные свойства отсутствуют, хотя я их явно указал:
СтруктураДанныеКлассификатора = Новый Структура("Код, Наименование");
СтруктураВалютаЦены = Новый Структура("Ссылка, ДанныеКлассификатора");
СтруктураВалютаЦены.ДанныеКлассификатора = СтруктураДанныеКлассификатора;
...
Оказалось, что поскольку конфигурация самописная и не всё ещё отработано, то валюта цены не была явно указана. Таким образом поля Код и Наименование структуры СтруктураДанныеКлассификатора не заполнялись. Но сами эти поля присутствовали, просто там стояло НЕОПРЕДЕЛЕНО В таком случае в общем модуле ОбменДаннымиXDTOСервер на строке 844 при рекурсивном вызове функции ОбъектXDTOИзДанныхXDTO(...) переменная ПроведеноЗаполнениеВложенныхСвойств остаётся равно ЛОЖЬ. И тогда структура Приемник остаётся незаполненной.
Вот код:
ПроведеноЗаполнениеВложенныхСвойств = Ложь;
Если ТипЗнч(Источник) = Тип("Структура") И СвойствоНайдено Тогда
ЗначениеXDTO = ОбъектXDTOИзДанныхXDTO(КомпонентыОбмена, ЗначениеСвойства,
Свойство.Тип,, СсылкиИзОбъекта, ПроведеноЗаполнениеВложенныхСвойств);
Иначе
ЗначениеXDTO = ОбъектXDTOИзДанныхXDTO(КомпонентыОбмена, Источник,
Свойство.Тип,, СсылкиИзОбъекта, ПроведеноЗаполнениеВложенныхСвойств);
КонецЕсли;
Если Не ПроведеноЗаполнениеВложенныхСвойств Тогда
Продолжить;
КонецЕсли;
Показать
То есть в результирующем ОбъектXDTO вложенное свойство /ТипЦен/ВалютаЦены/ДанныеКлассификатора есть, но в нём уже нет вложенных полей Код и Наименование
Если добавить одну строку Приемник[Свойство.Имя] = ЗначениеXDTO; в оператор "Если.." в код, то проблема решается и выгрузка проходит нормально и загрузка в кассу проходит тоже нормально.
ПроведеноЗаполнениеВложенныхСвойств = Ложь;
Если ТипЗнч(Источник) = Тип("Структура") И СвойствоНайдено Тогда
ЗначениеXDTO = ОбъектXDTOИзДанныхXDTO(КомпонентыОбмена, ЗначениеСвойства,
Свойство.Тип,, СсылкиИзОбъекта, ПроведеноЗаполнениеВложенныхСвойств);
Иначе
ЗначениеXDTO = ОбъектXDTOИзДанныхXDTO(КомпонентыОбмена, Источник,
Свойство.Тип,, СсылкиИзОбъекта, ПроведеноЗаполнениеВложенныхСвойств);
КонецЕсли;
Если Не ПроведеноЗаполнениеВложенныхСвойств Тогда
Приемник[Свойство.Имя] = ЗначениеXDTO;// Вот эта строка
Продолжить;
КонецЕсли;
Показать
Но это стандартный родной модуль БСП.
Принципиально, в общем случае, у типа цены в свойстве ВалютаЦены/ДанныеКлассификатора, поля Код и Наименование не запрещено оставлять пустыми, согласно схеме EnterpriseData 1.8.6. согласно описанию типа ОбщиеСвойстваДанныеКлассификатора. Ну, может такое случится, что у типа цены не будет заполнено валюта типа цены. Вот в моём случае конфигурация самописная и к тому же ещё в процессе написания, возможны любые логики и варианты.
И в этом контексте я не могу понять:
Это я туплю или это косяк 1С-ников?
(2) Можем. Но я не об этом.
У меня другой вопрос. Если я всё делал правильно, то в тексте стандартного модуля ошибка. Или это не ошибка а так и задумывалось? А я просто неправильно всё делал?
ЗЫ. И в данном случае "ВалютаЦены" не ключевое свойство. Они имеет тип "КлючевыеСвойстваВалюта" но у свойства "КлючевыеСвойстваТипЦен" нет ключевых свойств. А есть НЕключевое свойство "ВалютаЦены" с типом "КлючевыеСвойстваВалюта"
спасибо тебе добрый человек, что ты докопался до этой адской дичи от 1С. По теме "ДанныеКлассификатора" гугл иногда отвечает одной ссылкой сюда )))
я потратил пол дня, а благодаря тебе сэкономил себе нервные клетки.
У меня вообще задача простейшая:
в источнике в документе нет валюты, а в приемнике есть. мне надо сформировать пустоту при выгрузке и при загрузке заполнить по алгоритму.
Вот вопрос к 1С и их формату: зачем мне соблюдать все ключевые свойства вместо того чтобы просто передать Неопределено?
вопрос риторический.
P.S. может есть альтернативный способ, вместо того чтобы в ДанныеXDTO вставлять воссозданные структуры?