Top.Mail.Ru
26 февраля в 17:00 МСК
онлайн-митап
Как мы перенесли игру «Герои меча и магии 3» на 1С

Получение данных форм выбора с использованием параметров

Я Иван, ведущий разработчик 1С и тимлид в Programming Store. В программировании 13 лет. Сейчас работаю на проекте с конфигурациями 1С: ERP 2.5, Управление автотранспортом Проф 2.2, 1С:ТОИР 3.0 и другими. Решаю задачи от мелких доработок до крупных подсистем и обменов. На проектах частенько возникают нетривиальные задачки. Бывает не знаешь как решить, а время ограничено, «костыли» не используем.  

Эта статья про решение такой нетривиальной задачки, точнее про применение обработки модуля менеджера ОбработкаПолученияДанныхВыбора. Будет интересно сторонникам чистой архитектуры, поможет не изобретать новый велосипед.

Задача

Вводные

  • Есть Перечисление (пусть СтатусыЗаказа).
  • Есть несколько документов, на формах которых есть поле нашего перечисления.

Цель: Ограничить список выбора этого поля, соблюдая 3 условия:

  • Обработчики самого поля на форме трогать нельзя.
  • Решать задачу только(!) программно (без изменения форм, метаданных).
  • Ограничение списка должно быть ТОЛЬКО на полях, расположенных на формах  наших документов.

Результатом решения станет гибкая настройка списка практически любого объекта метаданных, имеющего в своем модуле менеджера обработчик ОбработкаПолученияДанныхВыбора.

Предыстория

Как-то уже сталкивался с подобной задачей, долго ломал голову как ее решить. Обратил внимание на параметр Параметры (рис. 1). Не мог понять, откуда он заполняется: стек вызова пуст, обработчик пуст, а в параметрах  (помимо стандартных значений) есть еще что-то. Удивительно, но такая картина может быть и при отсутствии кода вообще.

рис. 1

Данный параметр посчитал ключом к решению.

Решение

Все дело в свойстве СвязиПараметровВыбора.

  1. В Обработчике ПриСозданииНаСервере формы документа программно создаем реквизит (пусть называется ОграничиватьСписок) и СвязиПараметровВыбора по нему же. Наличие этого реквизита и будет служить параметром, определяющим нашу форму.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	//1. новый реквизит
	ДобавляемыеРеквизиты = Новый Массив;
	НовыйРеквизит = 
        Новый РеквизитФормы("ОграничиватьСписок", Новый ОписаниеТипов("Булево")); 
	ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
	ИзменитьРеквизиты(ДобавляемыеРеквизиты);
	
	//2. связи параметров выбора
	Элементы.СтатусЗаказа.СвязиПараметровВыбора =
        Новый ФиксированныйМассив(Новый массив);
	НоваяСвязь = 
        Новый СвязьПараметраВыбора("ОграничиватьСписок",
	"ОграничиватьСписок",
	РежимИзмененияСвязанногоЗначения.НеИзменять);
	НовыйМассив = Новый Массив();
	НовыйМассив.Добавить(НоваяСвязь);
	Элементы.СтатусЗаказа.СвязиПараметровВыбора = Новый ФиксированныйМассив(НовыйМассив);
	
КонецПроцедуры

2. В модуле менеджера перечисления СтатусыЗаказа в обработчик ОбработкаПолученияДанныхВыбора добавляем условие по параметру и программно ограничиваем список. Например, оставляем только 2 статуса — Выполнен и Отменен.

Если работать с расширением, то это условие лучше добавлять в После.

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
	
	Если Параметры.Свойство("ОграничиватьСписок") Тогда 
		СтандартнаяОбработка = Ложь;
		ДанныеВыбора = Новый СписокЗначений;
		ДанныеВыбора.Добавить(Перечисления.СтатусыЗаказа. Выполнен);
		ДанныеВыбора.Добавить(Перечисления.СтатусыЗаказа.Отменен);
	КонецЕсли;
	
КонецПроцедуры

Обратите внимание, что значение переменной ОграничиватьСписок не имеет значения. Нам важен лишь факт того, что она в параметрах есть (рис. 2).

рис. 2

Получаем то, что необходимо было получить. Все условия выполнены и задача решена!

Преимущества способа

  1. Нам не важна сложность механизма построения списка ДанныеВыбора. Мы просто правим его в конце процедуры, используя наш параметр.
  2. Компактность и гибкость. При желании механизм можно прописать в общем модуле и использовать на формах практически любых метаданных: документов, справочников, обработок, отчетов и т. д.
  3. Подойдет и для полей внутри табличных частей.
  4. Используем всего лишь 2 обработчика.
  5. Удобно для работы в расширениях, помещенные в расширения формы достаточно изменить программно

Все гениальное просто!

Видео на Rutube

«Управление списком выбора на форме через обработку получения данных выбора по параметрам»

Ссылка на базу, где решалась задача, под видео.

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar