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