Создание множественного дополнительного реквизита. Управление торговлей 11

0. bad_wag 44 20.03.18 11:36 Сейчас в теме
Создание механизма множественного дополнительного реквизита для выгрузки в битрикс.

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. EmpireSer 21.03.18 00:47 Сейчас в теме
По мне "ЗначениеСвойства" в XSD задан "не красиво". Можно было всё в одном месте указать:
<xs:element name="ЗначениеСвойства" type="tns:ЗначениеТип" minOccurs="0" maxOccurs="unbounded" />

Так же можно было доработать доп. реквизит так, что бы он просто принимал "СписокЗначений", а не делать копирование. По моему мнению это получилось "элегантнее".
shurik_shurik; +1 Ответить
2. bad_wag 44 21.03.18 11:06 Сейчас в теме
(1) В начале я так и пытался сделать, но для этого потребовалось дорабатывать поддержку списков значений доп реквизитами, а это, на мой взгляд, гораздо сложнее данной реализации
3. vis_tmp 31 11.05.18 18:15 Сейчас в теме
Спасибо, очень познавательно про множественные доп. реквизиты.
6. bad_wag 44 06.06.18 02:00 Сейчас в теме
4. mark_oilbass 05.06.18 14:07 Сейчас в теме
5. bad_wag 44 06.06.18 01:59 Сейчас в теме
9. itdvl 28 16.08.18 06:41 Сейчас в теме
(5) не понимаю как сделать кнопку удалить. Не подскажете?
7. mark_oilbass 04.07.18 15:39 Сейчас в теме
Коллеги, подскажите пожалуйста! как быть если множественных реквизитов несколько? Я в плане видов характеристик создал реквизит МножественныйРеквизит и с помощью него получаю все множественные доп свойства. Перед выгрузкой свойств формирую запрос результатом, которого является список всех множественных свойств и дальше делаю такие же проверки как в этой статье. Прикрепляю файл с кодом. Заработает ли такой код?
Прикрепленные файлы:
Код.txt
8. mark_oilbass 05.07.18 11:24 Сейчас в теме
10. EliWalles 27.05.19 10:02 Сейчас в теме
Возможно ли вынести функции в расширение и воспользоваться &Вместо("ЗаполнитьДополнительныеРеквизитыВФорме") такой конструкцией, что бы не менять конфигурацию, будет работать?
УИД - это в XML файле экспорта поле <Ид>?
11. bad_wag 44 27.05.19 13:41 Сейчас в теме
(10) Вынести в расширение можно, работать будет, но при обновлениях конфигурации надо будет следить за изменениями в этой функции. Про УИД сейчас не вспомню, можно посмотреть отладчиком или выгрузить в файл там уже глянуть
12. goodwill 20 02.07.19 15:40 Сейчас в теме
Большое спасибо за выложенный материал, очень помог.

Хочу добавить от себя немного, Мне показалось не очень удачным определять множественный реквизит по GUID, в разных базах они разные и код получается не универсальным. Так же нет возможности добавить несколько множественных реквизитов. Для того что бы это исправить я добавил в ПланВидовХарактеристик.ДополнитеотныеРеквизитыИСведения новый реквизит МножественныйРеквизит

Изменения от первоначальной статьи следующие
1) Функция ПолучитьУИДМножественногоСвойства() не нужна
2) В модуле УправлениСвойствами

Если ОписаниеСвойства.Свойство.МножественныйРеквизит Тогда
	ОписаниеСвойства.ИмяУникальнаяЧасть = ОписаниеСвойства.ИмяУникальнаяЧасть    +"_"+ Строка(СчСвойств);            
	СчСвойств = СчСвойств + 1;                                                  
КонецЕсли;


3) УправлениеСвойствамиСлужебный


// < -- xs
СоответствиеСвойствЭтоПервый = Новый Соответствие;
// xs -- > 
	
// Заполнение значений свойств.
Для Каждого Строка Из ДополнительныеСвойстваОбъекта Цикл
	ОписаниеСвойства = ОписаниеСвойств.Найти(Строка.Свойство, "Свойство");
	Если ОписаниеСвойства <> Неопределено Тогда
		
		// < -- xs
		Если СоответствиеСвойствЭтоПервый.Получить(Строка.Свойство) = Неопределено Тогда
			СоответствиеСвойствЭтоПервый.Вставить(Строка.Свойство, Истина);
		КонецЕсли; 
		
		Если Строка.Свойство.МножественныйРеквизит Тогда
			
			Если СоответствиеСвойствЭтоПервый.Получить(Строка.Свойство) Тогда
				СоответствиеСвойствЭтоПервый.Вставить(Строка.Свойство, Ложь);
			Иначе 
				фКэшОписания = ОписаниеСвойства;
				ОписаниеСвойства = ОписаниеСвойств.Добавить();
				ЗаполнитьЗначенияСвойств(ОписаниеСвойства, фКэшОписания);
			КонецЕсли;
		КонецЕсли;
		// xs -- > 

		// Поддержка строк неограниченной длины.
		Если НЕ ЭтоДополнительноеСведение
		   И ИспользоватьНеограниченнуюСтроку(
		         ОписаниеСвойства.ТипЗначения, ОписаниеСвойства.МногострочноеПолеВвода)
		   И НЕ ПустаяСтрока(Строка.ТекстоваяСтрока) Тогда 
			
			ОписаниеСвойства.Значение = Строка.ТекстоваяСтрока;
		Иначе
			ОписаниеСвойства.Значение = Строка.Значение;
			КонецЕсли;
	КонецЕсли;
КонецЦикла;
Показать


4) Форма элемента справочника Номенклатура, так же добавил туда кнопку удаления реквизита.


&НаСервере
Процедура хот_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
	
	НоваяКоманда = ЭтаФорма.Команды.Добавить("СкопироватьСвойство");
	НоваяКоманда.Заголовок = "+";
	НоваяКоманда.Действие = "хот_СкопироватьСвойство";
	
	НоваяКоманда = ЭтаФорма.Команды.Добавить("УдалитьСвойство");
	НоваяКоманда.Заголовок = "-";
	НоваяКоманда.Действие = "хот_УдалитьСвойство"; 
	
	Для каждого стрДополнительногоРеквизита Из ЭтаФорма.Свойства_ОписаниеДополнительныхРеквизитов Цикл
		
		Если НЕ стрДополнительногоРеквизита.Свойство.МножественныйРеквизит Тогда
			Продолжить;
		КонецЕсли; 
			
		Если Элементы.Найти("КнопкаСкопироватьСвойство") = Неопределено Тогда
			НоваяКнопка = Элементы.Добавить("КнопкаСкопироватьСвойство", Тип("КнопкаФормы"),   Элементы.Найти("ГруппаДополнительныеРеквизитыКнопки"));
			НоваяКнопка.ИмяКоманды = "СкопироватьСвойство";
		КонецЕсли; 
		
	КонецЦикла; 
	
	спМножественныхСвойств = ПолучитьСписокМножественныхСвойств();
	Если спМножественныхСвойств.Количество() > 0 Тогда
		НоваяКнопка = Элементы.Добавить("КнопкаУдалитьСвойство", Тип("КнопкаФормы"), Элементы.Найти("ГруппаДополнительныеРеквизитыКнопки"));
		НоваяКнопка.ИмяКоманды = "УдалитьСвойство";
	КонецЕсли;
		
КонецПроцедуры

&НаСервере
Функция ПолучитьСписокМножественныхСвойств()
	
	спМножественныхСвойств = Новый СписокЗначений;
	
	вт_Свойства = ЭтаФорма.Свойства_ОписаниеДополнительныхРеквизитов.Выгрузить();
	вт_Свойства.Колонки.Добавить("Счетчик");
	вт_Свойства.ЗаполнитьЗначения(1, "Счетчик");
	вт_Свойства.Свернуть("Свойство", "Счетчик");
	
	Для Каждого стрСвойство из вт_Свойства Цикл 
		Если стрСвойство.Счетчик > 1 Тогда
			спМножественныхСвойств.Добавить(стрСвойство.Свойство);
		конецЕсли
	КонецЦикла;
	
	Возврат спМножественныхСвойств;
	
КонецФункции

&НаСервере
Функция ПолучитьСписокМножественныхСвойствВсе()
	
	спМножественныхСвойств = Новый СписокЗначений;
	
	Для каждого стрДополнительногоРеквизита Из ЭтаФорма.Свойства_ОписаниеДополнительныхРеквизитов Цикл
		
		Если НЕ спМножественныхСвойств.НайтиПоЗначению(стрДополнительногоРеквизита.Свойство) = Неопределено Тогда
			Продолжить;
		КонецЕсли; 
		
		Если стрДополнительногоРеквизита.Свойство.МножественныйРеквизит Тогда
			спМножественныхСвойств.Добавить(стрДополнительногоРеквизита.Свойство);
		КонецЕсли; 
		
	КонецЦикла;
	
	Возврат спМножественныхСвойств;
	
КонецФункции

&НаКлиенте
Процедура хот_СкопироватьСвойство()
	
	спМножественныхСвойств = ПолучитьСписокМножественныхСвойствВсе();
	
	Оповещение = Новый ОписаниеОповещения("хот_ПослеВыбораИзМеню", ЭтотОбъект);
	ПоказатьВыборИзМеню(Оповещение, спМножественныхСвойств, Элементы.КнопкаСкопироватьСвойство);
	
КонецПроцедуры

&НаКлиенте
Процедура хот_УдалитьСвойство()
	
	//Список свойств, для которых есть несколько значений
	спМножественныхСвойств = ПолучитьСписокМножественныхСвойств();
	
	спМножественныхСвойствВыбор = Новый СписокЗначений;
	Для каждого стрДополнительногоРеквизита Из ЭтаФорма.Свойства_ОписаниеДополнительныхРеквизитов Цикл
		
		Если спМножественныхСвойств.НайтиПоЗначению(стрДополнительногоРеквизита.Свойство) = Неопределено Тогда
			Продолжить;
		КонецЕсли; 
		
		спМножественныхСвойствВыбор.Добавить(стрДополнительногоРеквизита, СокрЛП(стрДополнительногоРеквизита.Свойство) + " " + СокрЛП(ЭтаФорма[стрДополнительногоРеквизита.ИмяРеквизитаЗначение]));
				
	КонецЦикла;
	
	Оповещение = Новый ОписаниеОповещения("хот_ПослеВыбораИзМенюУдалитьСвойство", ЭтотОбъект);
	ПоказатьВыборИзМеню(Оповещение, спМножественныхСвойствВыбор, Элементы.КнопкаУдалитьСвойство);
	
КонецПроцедуры

&НаКлиенте
Процедура хот_ПослеВыбораИзМеню(ВыбранныйЭлемент, Параметры) Экспорт
	Если НЕ ВыбранныйЭлемент = Неопределено Тогда
		хот_ДобавитьРеквизиты(ВыбранныйЭлемент.Значение)
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура хот_ПослеВыбораИзМенюУдалитьСвойство(ВыбранныйЭлемент, Параметры) Экспорт
	Если НЕ ВыбранныйЭлемент = Неопределено Тогда
		УдалитьСвойство(ВыбранныйЭлемент.Значение.ИмяРеквизитаЗначение);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура УдалитьСвойство(ИмяРеквизитаЗначение)
	Элементы.Удалить(Элементы.Найти(ИмяРеквизитаЗначение));
	
	НайденныеСтроки = ЭтаФорма.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(Новый Структура("ИмяРеквизитаЗначение", ИмяРеквизитаЗначение));
	Для Каждого стрСвойство Из НайденныеСтроки Цикл 
		ЭтаФорма.Свойства_ОписаниеДополнительныхРеквизитов.Удалить(стрСвойство);
	КонецЦикла;
	
Конецпроцедуры

&НаСервере
Процедура хот_ДобавитьРеквизиты(ДопРеквизит)
	
	ОписаниеТипа = Новый ОписаниеТипов("СправочникСсылка.ЗначенияСвойствОбъектов");
	Для каждого стрДополнительногоРеквизита Из ЭтаФорма.Свойства_ОписаниеДополнительныхРеквизитов Цикл
		Если стрДополнительногоРеквизита.Свойство = ДопРеквизит Тогда
			ОписаниеТипа = стрДополнительногоРеквизита.ТипЗначения;		
			Прервать;
		КонецЕсли; 
	КонецЦикла;
	
	ИмяРеквизита = СтандартныеПодсистемыСервер.ПреобразоватьСтрокуВДопустимоеНаименованиеКолонки("ДополнительныйРеквизит_" + Строка(Новый УникальныйИдентификатор));
	лСвойство = ДопРеквизит;
	
	лМассив = Новый Массив;
	лМассив.Добавить(Новый РеквизитФормы(ИмяРеквизита, ОписаниеТипа,,ДопРеквизит.Наименование, Истина));
	ИзменитьРеквизиты(лМассив);
	
	НовЭлемент = Элементы.Вставить(ИмяРеквизита, Тип("ПолеФормы"), Элементы.Найти("ГруппаДополнительныеРеквизиты"));
	НовЭлемент.ПутьКДанным = ИмяРеквизита;
	НовЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	
	МассивПараметров = Новый Массив;
	МассивПараметров.Добавить(Новый ПараметрВыбора("Отбор.Владелец", лСвойство));
	
	Элементы[ИмяРеквизита].ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);
	
	ДобавитьСвойство(ЭтаФорма, ИмяРеквизита, лСвойство);
	
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ДобавитьСвойство(лФорма, ИмяРеквизита, Свойство)

	лШаблон = лФорма.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(Новый Структура("Свойство", Свойство));
	НовоеСвойство = лФорма.Свойства_ОписаниеДополнительныхРеквизитов.Добавить();
	
	Если лШаблон.Количество() > 0 Тогда
		ЗаполнитьЗначенияСвойств(НовоеСвойство, лШаблон[0]);
		НовоеСвойство.ИмяРеквизитаЗначение = ИмяРеквизита;
	КонецЕсли;
	
КонецПроцедуры


Показать


5) Модуль Б_ОбменССайтомСерверВыгрузкаДанных

Процедура ВыгрузитьСвойстваXDTO

// < -- xs
XDTOСвойство.Множественное = ТекСвойство.СвойствоНоменклатуры.МножественныйРеквизит;
// xs -- > 


Процедура ВыгрузитьСвойстваНоменклатурыXDTO


Процедура ВыгрузитьСвойстваНоменклатурыXDTO(ПараметрыОбмена, Владелец, ВладелецТип, ВыборкаНоменклатуры, МенеджерВременныхТаблиц);
	
	XDTOЗначенияСвойствТип 	= Б_ОбменССайтомСервер.ПолучениеТипОбъектаXDTO(ПараметрыОбмена,  "ЗначенияСвойств", Истина, ВладелецТип);
	XDTOЗначенияСвойстваТип = Б_ОбменССайтомСервер.ПолучениеТипОбъектаXDTO(ПараметрыОбмена,  "ЗначенияСвойства");
	
	// < -- xs
	XDTOЗначениеСвойства_МножТип = Б_ОбменССайтомСервер.ПолучениеТипОбъектаXDTO(ПараметрыОбмена,  "ЗначениеСвойства", Истина, XDTOЗначенияСвойстваТип);
	// xs -- > 
	
	Запрос = Новый Запрос;
	запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	запрос.Текст =  "ВЫБРАТЬ *
	|ИЗ
	|	ВремЗначенияСвойствТовара КАК ВремЗначенияСвойствТовара
	|ГДЕ
	|	(ВремЗначенияСвойствТовара.Номенклатура = &Номенклатура	
	|И НЕ ВремЗначенияСвойствТовара.НеВыгружатьВСвойстваТоваров)";
	
	Запрос.УстановитьПараметр("Номенклатура", ВыборкаНоменклатуры.Номенклатура);
	Выборка = Запрос.Выполнить();
	
	Если НЕ Выборка.Пустой() тогда	
		ВыборкаСвойств = Выборка.Выбрать();
		XDTOЗначенияСвойств = ПараметрыОбмена.МояФабрикаXDTO.Создать(XDTOЗначенияСвойствТип);
		
		// < -- xs
		XDTOЗначенияСвойства_Множ = ПараметрыОбмена.МояФабрикаXDTO.Создать(XDTOЗначенияСвойстваТип);
		// xs -- > 
		
		Пока ВыборкаСвойств.Следующий() Цикл
			
			XDTOЗначенияСвойства = ПараметрыОбмена.МояФабрикаXDTO.Создать(XDTOЗначенияСвойстваТип);
			
			XDTOЗначенияСвойства.Ид = XMLСтрока(ВыборкаСвойств.ИдентификаторСвойства);
			
			// < -- xs
			Если ВыборкаСвойств.Свойство.МножественныйРеквизит Тогда
				XDTOЗначениеСвойстваМнож = ПараметрыОбмена.МояФабрикаXDTO.Создать(XDTOЗначениеСвойства_МножТип);
				XDTOЗначениеСвойстваМнож.Значение = XMLСтрока(ВыборкаСвойств.ИдентификаторЗначения);
				
			    XDTOЗначенияСвойства_Множ.Ид = XMLСтрока(ВыборкаСвойств.ИдентификаторСвойства);
				XDTOЗначенияСвойства_Множ.ЗначениеСвойства.Добавить(XDTOЗначениеСвойстваМнож);
				XDTOЗначенияСвойства_Множ.Значение.Добавить(XMLСтрока(ВыборкаСвойств.ИдентификаторЗначения));
				Продолжить;
			КонецЕсли;
			// xs -- > 
			
			XDTOЗначенияСвойства.Значение.Добавить(XMLСтрока(ВыборкаСвойств.ИдентификаторЗначения));
			
			XDTOЗначенияСвойств.ЗначенияСвойства.Добавить(XDTOЗначенияСвойства);	
			
		КонецЦикла;
		
		// < -- xs	
		XDTOЗначенияСвойств.ЗначенияСвойства.Добавить(XDTOЗначенияСвойства_Множ);
		// xs -- >

		Владелец.ЗначенияСвойств = XDTOЗначенияСвойств;
	КонецЕсли;
	
КонецПроцедуры

Показать
Прикрепленные файлы:
nemec; Varozh; Buхter; bonya_by; chng; user1136006; +6 Ответить
13. bad_wag 44 02.07.19 18:09 Сейчас в теме
(12) Спасибо! Ну я решал свою задачу, по этому об универсальности не думал, но вы развернулись на широкую ногу! Хоть в типовую переноси :) Отличное дополнение
14. Djo82 82 04.07.19 15:17 Сейчас в теме
с кнопками не разобрался, если не сложно поясните подробнее
15. Djo82 82 04.07.19 16:51 Сейчас в теме
16. user1136006 07.08.19 11:54 Сейчас в теме
(12) Прекрасное решение, спасибо! Но обнаружил проблему: если было выбрано несколько значений, а потом меньшее количество - предыдущий выбор сохраняется. Наверное, надо каким-то образом очищать реквизиты во время загрузки, может быть проблема только у меня...
17. RSTR 07.09.19 13:16 Сейчас в теме
bad_wag, просьба-вопрос к вам. Можете ли вы сделать настройку данной доработки в нашей базе? Сделали всё по инструкции, в УТ множественный реквизит появился, но в файл обмена с Битриксом этот реквизит не попадает.. УТ (11.4.6.174), Битрикс 7.0.1.21
Сколько это будет стоить?
18. Djo82 82 31.01.20 19:33 Сейчас в теме
Статья помогла решить задачу. Спасибо!

Но не отработала процедура "ВыгрузитьСвойстваНоменклатурыXDTO" при условии, что присутствует несколько множественных свойств. Подсмотрел исходники от партнеров с Битрикс. Немного подправил процедуру и файл "СхемаXSDОбмена". Вдруг кому поможет.

Процедура ВыгрузитьСвойстваНоменклатурыXDTO(ПараметрыОбмена, Владелец, ВладелецТип, ВыборкаНоменклатуры, МенеджерВременныхТаблиц);
	
	XDTOЗначенияСвойствТип 	= Б_ОбменССайтомСервер.ПолучениеТипОбъектаXDTO(ПараметрыОбмена,  "ЗначенияСвойств", Истина, ВладелецТип);
	XDTOЗначенияСвойстваТип = Б_ОбменССайтомСервер.ПолучениеТипОбъектаXDTO(ПараметрыОбмена,  "ЗначенияСвойства");
	
	//++все отлично
	XDTOЗначенияСвойствМножТип   = Б_ОбменССайтомСервер.ПолучениеТипОбъектаXDTO(ПараметрыОбмена, "ЗначениеСвойства", Истина, XDTOЗначенияСвойстваТип);
	//все отлично++
	
	Запрос = Новый Запрос;
	запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	запрос.Текст =  "ВЫБРАТЬ *
	|ИЗ
	|	ВремЗначенияСвойствТовара КАК ВремЗначенияСвойствТовара
	|ГДЕ
	|	(ВремЗначенияСвойствТовара.Номенклатура = &Номенклатура	
	|И НЕ ВремЗначенияСвойствТовара.НеВыгружатьВСвойстваТоваров)";
	
	Запрос.УстановитьПараметр("Номенклатура", ВыборкаНоменклатуры.Номенклатура);
	Выборка = Запрос.Выполнить();
	
	//Если НЕ Выборка.Пустой() тогда	
	//	ВыборкаСвойств = Выборка.Выбрать();
	//	XDTOЗначенияСвойств = ПараметрыОбмена.МояФабрикаXDTO.Создать(XDTOЗначенияСвойствТип);
	//	
	//	Пока ВыборкаСвойств.Следующий() Цикл
	//		
	//		XDTOЗначенияСвойства = ПараметрыОбмена.МояФабрикаXDTO.Создать(XDTOЗначенияСвойстваТип);
	//		
	//		XDTOЗначенияСвойства.Ид = XMLСтрока(ВыборкаСвойств.ИдентификаторСвойства);
	//		XDTOЗначенияСвойства.Значение.Добавить(XMLСтрока(ВыборкаСвойств.ИдентификаторЗначения));
	//		
	//		XDTOЗначенияСвойств.ЗначенияСвойства.Добавить(XDTOЗначенияСвойства);	
	//		
	//	КонецЦикла;
	//	Владелец.ЗначенияСвойств = XDTOЗначенияСвойств;
	//КонецЕсли;
	ТаблицаСвойств = Выборка.Выгрузить();
	
СвернутьТаблицуПодСписокЗначений(ТаблицаСвойств,"ИдентификаторСвойства","Значение");
	
	Если НЕ ТаблицаСвойств.Количество() = 0 Тогда
		XDTOЗначенияСвойств = ПараметрыОбмена.МояФабрикаXDTO.Создать(XDTOЗначенияСвойствТип);
		Для Каждого ВыборкаСвойств из ТаблицаСвойств Цикл

				XDTOЗначенияСвойства = ПараметрыОбмена.МояФабрикаXDTO.Создать(XDTOЗначенияСвойстваТип);
				
				XDTOЗначенияСвойства.Ид = XMLСтрока(ВыборкаСвойств.ИдентификаторСвойства);
				Если НЕ ВыборкаСвойств.БулевоЗначение тогда
					Если НЕ ТипЗнч(ВыборкаСвойств.Значение) = Тип("СписокЗначений") Тогда
						XDTOЗначенияСвойства.Значение.Добавить(XMLСтрока(ВыборкаСвойств.ИдентификаторЗначения));
					Иначе
						Для каждого Свойство из ВыборкаСвойств.Значение Цикл
							XDTOЗначенияМножСвойств = ПараметрыОбмена.МояФабрикаXDTO.Создать(XDTOЗначенияСвойствМножТип);
							XDTOЗначенияМножСвойств.Значение = XMLСтрока(Свойство.Значение);
							XDTOЗначенияСвойства.ЗначениеСвойства.Добавить(XDTOЗначенияМножСвойств);
						КонецЦикла;
					КонецЕсли;
				Иначе
					XDTOЗначенияСвойства.Значение.Добавить(Строка(ВыборкаСвойств.ИдентификаторЗначения));
				КонецЕсли;
				
				XDTOЗначенияСвойств.ЗначенияСвойства.Добавить(XDTOЗначенияСвойства);
				
		КонецЦикла;
		Владелец.ЗначенияСвойств = XDTOЗначенияСвойств;
	КонецЕсли;
КонецПроцедуры

Процедура СвернутьТаблицуПодСписокЗначений(Таблица,ПолеДляАнализа,ПолеДляСвертки) Экспорт
	Если Ложь Тогда Таблица = Новый ТаблицаЗначений; КонецЕсли;
	СписокСвойств = Новый Соответствие;
	Для каждого Строка из Таблица Цикл
		НайденноеСвойство = СписокСвойств.Получить(Строка[ПолеДляАнализа]);
		Если НЕ НайденноеСвойство = неопределено Тогда
			Если НЕ ТипЗнч(НайденноеСвойство) = Тип("СписокЗначений") Тогда
				Список = Новый СписокЗначений;
				Список.Добавить(НайденноеСвойство);
				Список.Добавить(Строка[ПолеДляСвертки]);
				СписокСвойств.Вставить(Строка[ПолеДляАнализа], Список);
			Иначе
				НайденноеСвойство.Добавить(Строка[ПолеДляСвертки]);
			КонецЕсли;
		Иначе			
			СписокСвойств.Вставить(Строка[ПолеДляАнализа], Строка[ПолеДляСвертки]);
		КонецЕсли;
	КонецЦикла;
	КолонкиКопия = Таблица.ВыгрузитьКолонку("Значение");
	ОписаниеТипов = Новый ОписаниеТипов(Таблица.Колонки.Значение.ТипЗначения,"СписокЗначений");
	ШиринаКопия = Таблица.Колонки.Значение.Ширина;
	
	Таблица.Колонки.Удалить("Значение");
	Таблица.Колонки.Добавить("Значение",ОписаниеТипов,"Значение",ШиринаКопия);
	Таблица.ЗагрузитьКолонку(КолонкиКопия, "Значение");
	
	Для каждого Свойство из СписокСвойств Цикл
		Если ТипЗнч(Свойство.Значение) = Тип("СписокЗначений") Тогда
			НайденныеСтроки = Таблица.НайтиСтроки(Новый Структура(ПолеДляАнализа,Свойство.Ключ));
			Н = 0;
			Для Каждого Строка из НайденныеСтроки Цикл
				Н = Н + 1;
				Если Н = 1 Тогда
					Строка.Значение = Свойство.Значение;
				Иначе
					Таблица.Удалить(Строка);
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры


Показать


Немного другой текст в "СхемаXSDОбмена"

<xs:complexType name="ЗначенияСвойства">
        <xs:sequence>
            <xs:element name="Ид" type="tns:ИдентификаторГлобальныйТип" />
            <xs:element name="Наименование" type="tns:НаименованиеТип" minOccurs="0" />
            <xs:element name="Значение" type="tns:ЗначениеТип" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="ЗначениеСвойства" minOccurs="0" maxOccurs="unbounded" >
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="Значение" type="tns:ЗначениеТип" maxOccurs="1" />
                    </xs:sequence>
				</xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
Показать
19. user691380_bel4enkin 18.04.20 14:18 Сейчас в теме
А случайно никто не выкладывал подобное расширение под УТ11.4 чтобы не изучать все тонкости? Интересует множественный реквизит с выгрузкой на сайт Opencart
20. ArturShaibakov 09.02.21 20:47 Сейчас в теме
Для 1с Розница, редакция 2.3 (2.3.5.35), дальше первого пункта делать ничего не нужно, все работает.
21. user1375596 20.08.21 20:08 Сейчас в теме
вы уверены, что Битрикс умеет парсить такую конструкцию?

					<ЗначенияСвойства>
						<Ид>e94be4ad-fb60-11eb-80e2-c643fff9747c</Ид>
						<Значение>
							<Значение>f237f346-fb60-11eb-80e2-c643fff9747c</Значение>
							<Значение>f237f347-fb60-11eb-80e2-c643fff9747c</Значение>
							<ЗначенияСвойства>
								<Значение>f237f346-fb60-11eb-80e2-c643fff9747c</Значение>
							</ЗначенияСвойства>
							<ЗначенияСвойства>
								<Значение>f237f347-fb60-11eb-80e2-c643fff9747c</Значение>
							</ЗначенияСвойства>
						</Значение>
					</ЗначенияСвойства>
Показать



У меня БУС 21.400.300 не воспринимает такой массив.
22. user1375596 21.08.21 08:54 Сейчас в теме
23. sderzhu 10.11.22 16:30 Сейчас в теме
Если СтрНайти(XDTOЗначенияСвойства.Ид, УправлениеСвойствамиСлужебный.ПолучитьУИДМножественногоСвойства()) > 0 Тогда
				XDTOЗначениеСвойстваМнож = ПараметрыОбмена.МояФабрикаXDTO.Создать(XDTOЗначениеСвойства_МножТип);
				XDTOЗначениеСвойстваМнож.Значение = XMLСтрока(ВыборкаСвойств.ИдентификаторЗначения);
				
			    XDTOЗначенияСвойства_Множ.Ид = XMLСтрока(ВыборкаСвойств.ИдентификаторСвойства);
				XDTOЗначенияСвойства_Множ.ЗначениеСвойства.Добавить(XDTOЗначениеСвойстваМнож);
				//XDTOЗначенияСвойства_Множ.Значение.Добавить(XMLСтрока(ВыборкаСвойств.ИдентификаторЗначения));
				Продолжить;
			КонецЕсли;
Показать

Закоменченная строка не нужна - лишнее это...

И, кстати, если нужно полностью очистить множественное значение, нужно обязательно послать пустое значение:

XDTOЗначениеСвойстваМнож = ПараметрыОбмена.МояФабрикаXDTO.Создать(XDTOЗначениеСвойства_МножТип);
				XDTOЗначениеСвойстваМнож.Значение = XMLСтрока("");
Оставьте свое сообщение
Вакансии
Ведущий консультант 1С:ERP
Москва
зарплата от 200 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 150 000 руб. до 200 000 руб.
Полный день

Консультант-программист по информационным системам 1С
Москва
зарплата от 150 000 руб. до 200 000 руб.
Полный день

Системный архитектор 1С
Москва
зарплата от 250 000 руб.
Полный день

Руководитель группы 1С
Екатеринбург
зарплата от 200 000 руб.
Полный день