КД3 Программное заполнение общего свойства из структуры. Косяк 1С-ников или я тупой?

1. newborn 02.08.21 20:41 Сейчас в теме
Прошу прощения, уважаемый All, вопрос длинный, чисто технический и перегружен специфической информацией.
Предупреждаю заранее, что я в данной теме не силён и возможно делаю очевидную глупую ошибку.
Вынужден осваивать КД3. Знаю его плохо. Но есть необходимость использовать именно его.
(Этот пост НЕ по КД2)
Для разработки правил использую КД 3 (3.1.1.4).
Пишем самопсиную конфигурацию на БСП 3.1.2.430, делаем выгрузку в 1С:Касса.
Используем схему EnterpriseData 1.8.6.
Выгружаю документ УстановкаЦенНоменклатуры.
Одно из обязательных свойств ТипЦен с типом КлючевыеСвойстваТипЦен.
У типа КлючевыеСвойстваТипЦен есть обязательное свойство ВалютаЦены с типом КлючевыеСвойстваВалюта.
У типа КлючевыеСвойстваВалюта есть обязательное свойство ДанныеКлассификатора с типом ОбщиеСвойстваДанныеКлассификатора.
У типа ОбщиеСвойстваДанныеКлассификатора есть два НЕОБЯЗАТЕЛЬНЫХ свойства Код и Наименования типа String.
В ПКО Справочник_ТипыЦен для свойства ВалютаЦены ставлю галочку "Используется алгоритм конвертации" и в обработчике события "При отправке" делаю такой код:

СтруктураДанныеКлассификатора = Новый Структура("Код, Наименование");

СтруктураВалютаЦены = Новый Структура("Ссылка, ДанныеКлассификатора");
СтруктураВалютаЦены.ДанныеКлассификатора = СтруктураДанныеКлассификатора;

ТекущаяВалютаЦены = ДанныеИБ.ВалютаЦены;
Если ЗначениеЗаполнено(ТекущаяВалютаЦены) Тогда

	СтруктураДанныеКлассификатора.Код = ТекущаяВалютаЦены.Код;
	СтруктураДанныеКлассификатора.Наименование = ТекущаяВалютаЦены.Наименование;

	СтруктураВалютаЦены.Ссылка = ТекущаяВалютаЦены.Ссылка;
	
КонецЕсли;

ДанныеXDTO.Вставить("ВалютаЦены", СтруктураВалютаЦены);
Показать


Синхронизация заканчивается ошибкой :

Ошибка проверки данных XDTO:
Структура объекта '/ТипЦен/ВалютаЦены' не соответствует типу: {http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.8}КлючевыеСвойстваВалюта
Проверка свойства 'ДанныеКлассификатора':
форма: Элемент
имя: {http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.8}ДанныеКлассификатора
тип: {http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.8}ОбщиеСвойстваДанныеКлассификатора
Отсутствует обязательное свойство


Я три дня бился, пытаясь понять, почему обязательные свойства отсутствуют, хотя я их явно указал:

СтруктураДанныеКлассификатора = Новый Структура("Код, Наименование");

СтруктураВалютаЦены = Новый Структура("Ссылка, ДанныеКлассификатора");
СтруктураВалютаЦены.ДанныеКлассификатора = СтруктураДанныеКлассификатора;
...


Оказалось, что поскольку конфигурация самописная и не всё ещё отработано, то валюта цены не была явно указана. Таким образом поля Код и Наименование структуры СтруктураДанныеКлассификатора не заполнялись. Но сами эти поля присутствовали, просто там стояло НЕОПРЕДЕЛЕНО
В таком случае в общем модуле ОбменДанными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. titanium2008 42 03.08.21 07:49 Сейчас в теме
ДанныеXDTO.КлючевыеСвойства.Вставить("ВалютаЦены", СтруктураВалютаЦены);

если ВалютаЦены ключевое свойство.
А так если у Вас самописка - то и пакет XDTO можете под себя настроить.
3. newborn 03.08.21 09:07 Сейчас в теме
(2) Можем. Но я не об этом.
У меня другой вопрос. Если я всё делал правильно, то в тексте стандартного модуля ошибка. Или это не ошибка а так и задумывалось? А я просто неправильно всё делал?
ЗЫ. И в данном случае "ВалютаЦены" не ключевое свойство. Они имеет тип "КлючевыеСвойстваВалюта" но у свойства "КлючевыеСвойстваТипЦен" нет ключевых свойств. А есть НЕключевое свойство "ВалютаЦены" с типом "КлючевыеСвойстваВалюта"
4. blank1c 02.02.23 18:30 Сейчас в теме
(1) И пусть уже прошло 1,5 года, НО:

спасибо тебе добрый человек, что ты докопался до этой адской дичи от 1С. По теме "ДанныеКлассификатора" гугл иногда отвечает одной ссылкой сюда )))

я потратил пол дня, а благодаря тебе сэкономил себе нервные клетки.


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

Вот вопрос к 1С и их формату: зачем мне соблюдать все ключевые свойства вместо того чтобы просто передать Неопределено?
вопрос риторический.

P.S. может есть альтернативный способ, вместо того чтобы в ДанныеXDTO вставлять воссозданные структуры?
Оставьте свое сообщение

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