eComm+

Модулі для BAS / 1С* - розроблено в Україні!

Инструменты пользователя

Инструменты сайта


horoshop_designer_utbas_multipleproperties

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+

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

КонецФункции
horoshop_designer_utbas_multipleproperties.txt · Последнее изменение: 2023/08/16 19:50 — webmaster