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