Блок 1. Приведем код к следующему виду:
УдалитьСтарыеРеквизитыИЭлементы(Форма); // Создание реквизитов. ДобавляемыеРеквизиты = Новый Массив(); //++ ingenum.com.ua / Торговые площадки СоответствиеСвойств = Новый Соответствие; МассивМножественныхСвойств = Новый Массив; //-- ingenum Для каждого ОписаниеСвойства Из ОписаниеСвойств Цикл
Блок 2. Приведем код к следующему виду:
ОписаниеСвойства.ИмяУникальнаяЧасть =
СтрЗаменить(ВРег(Строка(ОписаниеСвойства.Набор.УникальныйИдентификатор())), "-", "x")
+ "_"
+ СтрЗаменить(ВРег(Строка(ОписаниеСвойства.Свойство.УникальныйИдентификатор())), "-", "x");
//++ ingenum.com.ua / Торговые площадки
Если ОписаниеСвойства.МножественныйРеквизит Тогда
СвойствоНайдено = Ложь;
Для Каждого СтруктураДанных Из МассивМножественныхСвойств Цикл
Если СтруктураДанных.Свойство = ОписаниеСвойства.Свойство Тогда
// Свойство уже запомнили
СвойствоНайдено = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ СвойствоНайдено Тогда
МассивМножественныхСвойств.Добавить(Новый Структура("Свойство, ИмяУникальнаяЧасть, ТипЗначения, Наименование"
, ОписаниеСвойства.Свойство,
ОписаниеСвойства.ИмяУникальнаяЧасть,
ОписаниеСвойства.ТипЗначения,
ОписаниеСвойства.наименование));
КонецЕсли;
Если СоответствиеСвойств[ОписаниеСвойства.Свойство] = Неопределено Тогда
СоответствиеСвойств.Вставить(ОписаниеСвойства.Свойство, 1);
Иначе
СоответствиеСвойств.Вставить(ОписаниеСвойства.Свойство, СоответствиеСвойств.Получить(ОписаниеСвойства.Свойство)+1);
КонецЕсли;
ОписаниеСвойства.ИмяУникальнаяЧасть = ОписаниеСвойства.ИмяУникальнаяЧасть +"_"+ Строка(СоответствиеСвойств.Получить(ОписаниеСвойства.Свойство));
КонецЕсли;
//-- ingenum
ОписаниеСвойства.ИмяРеквизитаЗначение =
"ДополнительныйРеквизитЗначение_" + ОписаниеСвойства.ИмяУникальнаяЧасть;
Блок 3. Приведем код к следующему виду:
ОписаниеСвойства.Булево = ОбщегоНазначения.ОписаниеТипаСостоитИзТипа(ТипЗначенияСвойства, Тип("Булево"));
КонецЦикла;
//++ ingenum.com.ua / Торговые площадки
Для Каждого ЭлементМассива Из МассивМножественныхСвойств Цикл
Массив= Новый Массив;
Массив.Добавить(Тип("СписокЗначений"));
ОТ = Новый ОписаниеТипов(Массив);
Реквизит = Новый РеквизитФормы("ДополнительныйМножественныйРеквизитЗначение_" + ЭлементМассива.ИмяУникальнаяЧасть, ОТ, , ЭлементМассива.Наименование, Истина);
ДобавляемыеРеквизиты.Добавить(Реквизит);
КонецЦикла;
//-- ingenum
Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
//++ ingenum.com.ua / Торговые площадки
Для Каждого ЭлементМассива Из МассивМножественныхСвойств Цикл
ПараметрыПоиска = Новый Структура("Свойство", ЭлементМассива.Свойство);
СтрокиЗначений = ОписаниеСвойств.НайтиСтроки(ПараметрыПоиска);
Для Каждого Стр Из СтрокиЗначений Цикл
Форма["ДополнительныйМножественныйРеквизитЗначение_" + ЭлементМассива.ИмяУникальнаяЧасть].Добавить(Стр.Значение);
КонецЦикла;
Элемент = Форма.Элементы.Добавить("ДополнительныйМножественныйРеквизитЗначение_" + ЭлементМассива.ИмяУникальнаяЧасть, Тип("ПолеФормы"), Форма.Элементы.ГруппаДополнительныеРеквизиты);
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.РастягиватьПоВертикали = Ложь;
Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Лево;
Элемент.ПутьКДанным = "ДополнительныйМножественныйРеквизитЗначение_" + ЭлементМассива.ИмяУникальнаяЧасть;
Элемент.КнопкаОткрытия= Истина;
Элемент.КнопкаВыбора = Ложь;
//Элемент.УстановитьДействие("ПриИзменении" , "Подключаемый_ПриИзмененииМножественногоДополнительногоРеквизита");
Элемент.УстановитьДействие("Открытие" , "Подключаемый_ОткрытиеМножественногоДополнительногоРеквизита");
КонецЦикла;
//-- ingenum
// Создание элементов формы.
ИмяЭлементаДляРазмещения = Форма.Свойства_ИмяЭлементаДляРазмещения;
Блок 4. Приведем код к следующему виду:
Если НЕ ПоляНадписей И ОписаниеСвойства.ДополнительноеЗначение Тогда
ПараметрыВыбора = Новый Массив;
ПараметрыВыбора.Добавить(Новый ПараметрВыбора("Отбор.Владелец",
?(ЗначениеЗаполнено(ОписаниеСвойства.ВладелецДополнительныхЗначений),
ОписаниеСвойства.ВладелецДополнительныхЗначений, ОписаниеСвойства.Свойство)));
Элемент.ПараметрыВыбора = Новый ФиксированныйМассив(ПараметрыВыбора);
КонецЕсли;
//++ ingenum.com.ua / Торговые площадки
Если ОписаниеСвойства.МножественныйРеквизит = истина Тогда
Элемент.Видимость = Ложь;
КонецЕсли;
//-- ingenum
КонецЦикла;
// Установка видимости, доступности и обязательности заполнения дополнительных реквизитов.
Для Каждого ОписаниеЗависимогоРеквизита Из Форма.Свойства_ОписаниеЗависимыхДополнительныхРеквизитов Цикл
Блок 1. Приведем код к следующему виду:
Реквизиты.Добавить(Новый РеквизитФормы(
"ЭлементФормыДобавлен", Новый ОписаниеТипов("Булево"), ИмяОписания));
//++ ingenum.com.ua / Торговые площадки
Реквизиты.Добавить(Новый РеквизитФормы(
"МножественныйРеквизит", Новый ОписаниеТипов("Булево"), ИмяОписания));
//-- ingenum
// Добавление реквизита описания зависимых реквизитов.
ТаблицаЗависимыхРеквизитов = "Свойства_ОписаниеЗависимыхДополнительныхРеквизитов";
Блок 1. Приведем код к следующему виду:
УдаляемыеРеквизиты = Новый Массив; Для каждого ОписаниеСвойства Из Форма.Свойства_ОписаниеДополнительныхРеквизитов Цикл УдаляемыеРеквизиты.Добавить(ОписаниеСвойства.ИмяРеквизитаЗначение); Если ОписаниеСвойства.ЭлементФормыДобавлен Тогда Форма.Элементы.Удалить(Форма.Элементы[ОписаниеСвойства.ИмяРеквизитаЗначение]); КонецЕсли; //++ ingenum.com.ua / Торговые площадки Если ОписаниеСвойства.МножественныйРеквизит Тогда НаименованиеМассивом = eCommСервер.РазложитьСтрокуВМассивПодстрок(ОписаниеСвойства.ИмяРеквизитаЗначение, "_"); ИмяУдаляемогоМножественногоРеквизита = "ДополнительныйМножественныйРеквизитЗначение_" + НаименованиеМассивом[1] + "_" + НаименованиеМассивом[2]; Если НЕ Форма.Элементы.Найти(ИмяУдаляемогоМножественногоРеквизита) = Неопределено Тогда УдаляемыеРеквизиты.Добавить(ИмяУдаляемогоМножественногоРеквизита); Форма.Элементы.Удалить(Форма.Элементы[ИмяУдаляемогоМножественногоРеквизита]); КонецЕсли; КонецЕсли; //-- ingenum КонецЦикла; Если УдаляемыеРеквизиты.Количество() > 0 Тогда Форма.ИзменитьРеквизиты(, УдаляемыеРеквизиты); КонецЕсли;
Блок 1. Приведем код к следующему виду:
ОписаниеСвойств.Колонки.Добавить("ТипЗначения");
ОписаниеСвойств.Колонки.Добавить("ФорматСвойства");
ОписаниеСвойств.Колонки.Добавить("МногострочноеПолеВвода");
ОписаниеСвойств.Колонки.Добавить("Удалено");
ОписаниеСвойств.Колонки.Добавить("Значение");
//++ ingenum.com.ua / Торговые площадки
ОписаниеСвойств.Колонки.Добавить("МножественныйРеквизит");
//-- ingenum
Возврат ОписаниеСвойств;
КонецЕсли;
КонецЕсли;
Свойства = ДополнительныеСвойстваОбъекта.ВыгрузитьКолонку("Свойство");
Блок 2. Приведем код к следующему виду:
| ДополнительныеРеквизитыИСведения.МногострочноеПолеВвода, | ВсеСвойства.Удалено КАК Удалено, | ДополнительныеРеквизитыИСведения.Доступен, | ДополнительныеРеквизитыИСведения.Виден, //++ ingenum.com.ua / Торговые площадки | ДополнительныеРеквизитыИСведения.МножественныйРеквизит КАК МножественныйРеквизит, //-- ingenum | ДополнительныеРеквизитыИСведения.ЗависимостиДополнительныхРеквизитов.( | ЗависимоеСвойство, | Реквизит, | Условие, | Значение | ) |ИЗ | ВсеСвойства КАК ВсеСвойства
Блок 3. Приведем код к следующему виду:
Индекс = Индекс-1; КонецЦикла; //++ ingenum.com.ua / Торговые площадки СоответствиеСвойствЭтоПервый = Новый Соответствие; //-- ingenum // Заполнение значений свойств. Для Каждого Строка Из ДополнительныеСвойстваОбъекта Цикл ОписаниеСвойства = ОписаниеСвойств.Найти(Строка.Свойство, "Свойство"); Если ОписаниеСвойства <> Неопределено Тогда //++ ingenum.com.ua / Торговые площадки Если СоответствиеСвойствЭтоПервый.Получить(Строка.Свойство) = Неопределено Тогда СоответствиеСвойствЭтоПервый.Вставить(Строка.Свойство, Истина); КонецЕсли; Если Строка.Свойство.МножественныйРеквизит Тогда Если СоответствиеСвойствЭтоПервый.Получить(Строка.Свойство) Тогда СоответствиеСвойствЭтоПервый.Вставить(Строка.Свойство, Ложь); Иначе фКэшОписания = ОписаниеСвойства; ОписаниеСвойства = ОписаниеСвойств.Добавить(); ЗаполнитьЗначенияСвойств(ОписаниеСвойства, фКэшОписания); КонецЕсли; КонецЕсли; //-- ingenum // Поддержка строк неограниченной длины. Если НЕ ЭтоДополнительноеСведение И ИспользоватьНеограниченнуюСтроку( ОписаниеСвойства.ТипЗначения, ОписаниеСвойства.МногострочноеПолеВвода) И НЕ ПустаяСтрока(Строка.ТекстоваяСтрока) Тогда ОписаниеСвойства.Значение = Строка.ТекстоваяСтрока; Иначе ОписаниеСвойства.Значение = Строка.Значение; КонецЕсли;
&НаКлиенте
Процедура Подключаемый_ОткрытиеМножественногоДополнительногоРеквизита(Элемент, СтандартнаяОбработка) //++ eComm+
СтандартнаяОбработка = Ложь;
МассивЗначений = Новый Массив;
Сч = 0;
ИмяМножественногоРеквизитаБезСуффикса = СтрЗаменить(Элемент.Имя, "Множественный", "");
МассивВыбранныхЗначенийМножественногоРеквизита = Новый Массив;
Пока Истина Цикл
Сч = Сч + 1;
ИмяЗначенияМножественногоРеквизита = ИмяМножественногоРеквизитаБезСуффикса + "_" + Сч;
НайденныеСтроки = ЭтаФорма.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(Новый Структура("ИмяРеквизитаЗначение", ИмяЗначенияМножественногоРеквизита));
Если НЕ НайденныеСтроки.Количество() = 0 Тогда
// Строк логически не может быть больше одной
Свойство = НайденныеСтроки[0].Свойство;
ЗначениеСвойства = ЭтаФорма[ИмяЗначенияМножественногоРеквизита];
Если ЗначениеЗаполнено(ЗначениеСвойства) Тогда
МассивЗначений.Добавить(Новый Структура("Свойство, ЗначениеСвойства, Пометка", Свойство, ЗначениеСвойства, Истина));
МассивВыбранныхЗначенийМножественногоРеквизита.Добавить(ЗначениеСвойства);
КонецЕсли;
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
МассивНевыбранныхЗначений = ВернутьМассивНевыбранныхЗначений(Свойство, МассивВыбранныхЗначенийМножественногоРеквизита);
Для Каждого ЭлМассива Из МассивНевыбранныхЗначений Цикл
МассивЗначений.Добавить(Новый Структура("Свойство, ЗначениеСвойства, Пометка", Свойство, ЭлМассива, Ложь));
КонецЦикла;
ОповещениеОВыборе = Новый ОписаниеОповещения("ВыполнитьПослеВыбораЗначений", ЭтаФорма, ИмяМножественногоРеквизитаБезСуффикса);
ОткрытьФорму("Справочник.eComm_СвойстваТоваров.Форма.ФормаМножественногоРеквизита", Новый Структура("Свойство, СписокЗначенийСвойств", Свойство, МассивЗначений), Элемент, , , , ОповещениеОВыборе, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПослеВыбораЗначений(ВыбранныеЗначения, ИмяМножественногоРеквизитаБезСуффикса = Неопределено) Экспорт //++ eComm+
Если НЕ ТипЗнч(ВыбранныеЗначения) = Тип("Массив") Тогда
Возврат;
КонецЕсли;
Сч = 0;
ИмяРеквизитаСписокЗначений = СтрЗаменить(ИмяМножественногоРеквизитаБезСуффикса, "ДополнительныйРеквизит", "ДополнительныйМножественныйРеквизит");
ЭтаФорма[ИмяРеквизитаСписокЗначений].Очистить();
Для Каждого ЭлементМассива Из ВыбранныеЗначения Цикл
Сч = Сч + 1;
НайденныеСтроки = ЭтаФорма.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(Новый Структура("ИмяРеквизитаЗначение", ИмяМножественногоРеквизитаБезСуффикса + "_" + Сч));
Если НайденныеСтроки.Количество() > 0 Тогда
// Значение было выбрано ранее
ОписаниеСвойства = НайденныеСтроки[0];
Иначе
Если ЭлементМассива.Пометка = Истина Тогда
// Значение не было выбрано ранее, но теперь выбрали
ДобавитьРеквизитФормыНаСервере(ЭлементМассива.Свойство, ИмяМножественногоРеквизитаБезСуффикса + "_" + Сч);
ШаблонСвойства = ЭтаФорма.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(Новый Структура("Свойство", ЭлементМассива.Свойство));
ОписаниеСвойства = ЭтаФорма.Свойства_ОписаниеДополнительныхРеквизитов.Добавить();
Если ШаблонСвойства.Количество() > 0 Тогда
ЗаполнитьЗначенияСвойств(ОписаниеСвойства, ШаблонСвойства[0]);
ОписаниеСвойства.ИмяРеквизитаЗначение = ИмяМножественногоРеквизитаБезСуффикса + "_" + Сч;
КонецЕсли;
Иначе
// Значение не было выбрано ранее
// и сейчас нам не понадобилось
Продолжить;
КонецЕсли;
КонецЕсли;
Если ЭлементМассива.Пометка = Ложь Тогда
// Это отключенное значение множественного реквизита
ЭтаФорма.Свойства_ОписаниеДополнительныхРеквизитов.Удалить(ОписаниеСвойства);
УдалитьРеквизитФормыНаСервере(ЭлементМассива.Свойство, ИмяМножественногоРеквизитаБезСуффикса + "_" + Сч);
Иначе
// Будем считать что это измененное значение множественного реквизита
ЭтаФорма[ИмяМножественногоРеквизитаБезСуффикса + "_" + Сч] = ЭлементМассива.ЗначениеСвойства;
ЭтаФорма[ИмяРеквизитаСписокЗначений].Добавить(ЭлементМассива.ЗначениеСвойства);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ДобавитьРеквизитФормыНаСервере(Свойство, ИмяРеквизитаЗначение) //++ eComm+
ОписаниеТипа = Новый ОписаниеТипов("СправочникСсылка.ЗначенияСвойствОбъектов");
Для каждого стрДополнительногоРеквизита Из ЭтаФорма.Свойства_ОписаниеДополнительныхРеквизитов Цикл
Если стрДополнительногоРеквизита.Свойство = Свойство Тогда
ОписаниеТипа = стрДополнительногоРеквизита.ТипЗначения;
Прервать;
КонецЕсли;
КонецЦикла;
МассивДобавленных = Новый Массив;
МассивДобавленных.Добавить(Новый РеквизитФормы(ИмяРеквизитаЗначение, ОписаниеТипа,,Свойство.Наименование, Истина));
ИзменитьРеквизиты(МассивДобавленных);
КонецПроцедуры
&НаСервере
Процедура УдалитьРеквизитФормыНаСервере(Свойство, ИмяРеквизитаЗначение) //++ eComm+
МассивУдаляемых = Новый Массив;
МассивУдаляемых.Добавить(ИмяРеквизитаЗначение);
ИзменитьРеквизиты(, МассивУдаляемых);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ВернутьМассивНевыбранныхЗначений(Свойство, МассивВыбранныхЗначенийМножественногоРеквизита) //++ eComm+
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗначенияСвойствОбъектов.Ссылка КАК Ссылка
|ИЗ
| Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
|ГДЕ
| НЕ ЗначенияСвойствОбъектов.Ссылка В (&Ссылка)
| И ЗначенияСвойствОбъектов.Владелец = &Свойство";
Запрос.УстановитьПараметр("Свойство", Свойство);
Запрос.УстановитьПараметр("Ссылка", МассивВыбранныхЗначенийМножественногоРеквизита);
РезультатЗапроса = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
Возврат РезультатЗапроса;
КонецФункции