Автоматическая подстановка значений характеристик на неуправляемых формах

19.11.14

Разработка - Механизмы платформы 1С

В статье описан простой иерархический метод подстановки значений характеристик по приоритету из нетипового регистра сведений.

Была поставлена задача - реализовать простую подстановку значений свойств при создании новой характеристики (ибо характеристик много, на их заполнение уходит большой объем времени, да и у многих групп номенклатуры они одинаковые).

Решили, что это будет иерархическая система по приоритету. Т.е. если группе «Столы» назначить значение «Постформинг с двух сторон», то для всех входящих в нее позиций номенклатуры будет устанавливаться это значение. Но, если, в добавок к этому, добавить другое значение (например "Постформинг с одной стороны") для одной из входящих в нее папок, то для позиций в этой папке будет использоваться новое значение. Такое решение было принято для того, что бы не назначать многим папкам одинаковые значения характеристик.

Для решения этой задачи понадобилось создать регистр сведений "СоответствиеХарактеристикНоменклатуры" со следующией структурой:

- Измерение "Харакеристика" (ПланВидовХарактеристикСсылка.СвойстваОбъектов);

- измерение "Номенклатура" (СправочникСсылка.Номенклатура - группа номенклатуры);

- ресурс "ЗначениеПоУмолчанию" (СправочникСсылка.ЗначенияСвойствОбъектов).

Была автоматически сформирована форма записи и добавлено событие для поля "ЗначениеПоУмолчанию" (установка отбора, дабы не выбирать из огромного списка значений).

Код события:

Процедура ЗначениеПоУмолчаниюНачалоВыбора(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	
	ФормаВыбора = Справочники.ЗначенияСвойствОбъектов.ПолучитьФормуВыбора(, Элемент);
	
	ФормаВыбора.РежимВыбора = Истина;
	ФормаВыбора.Отбор.Владелец.ВидСравнения  = ВидСравнения.Равно;
	ФормаВыбора.Отбор.Владелец.Значение      = Характеристика;
	ФормаВыбора.Отбор.Владелец.Использование = Истина;
	ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.Владелец.Доступность = Ложь;
	ФормаВыбора.ЭлементыФормы.СправочникСписок.ИерархическийПросмотр = Ложь;
	ФормаВыбора.Открыть();
КонецПроцедуры

Далее нужно лишь поправить форму элемента справочника "ХарактеристикаНоменклатуры", а именно добавить следующий код в событие "ПередОткрытием":

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

После внесения изменений в конфигурацию остается только заполнить наш регистр сведений или отдать на заполнение ответственным пользователям.

Вообще, такой механизм сработает и для свойств, если добавить автоматическую подстановку значений свойств в форме номенклатуры.

характеристики свойства

См. также

Механизмы платформы 1С Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    6003    bayselonarrend    126    

59

Механизмы платформы 1С Программист Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    7786    dsdred    57    

99

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    11506    bayselonarrend    21    

162

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    7849    dsdred    18    

82

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    27016    YA_418728146    33    

73
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. DAnry 9 26.11.14 14:18 Сейчас в теме
Интересный опыт. Спасибо, что поделились
2. jaroslav.h 181 26.11.14 20:45 Сейчас в теме
Спасибо, взял на заметку.
Оставьте свое сообщение