Выбор элементов справочников в поле формы

06.09.12

Разработка - Универсальные функции

Шаблон позволяет устанавливать правило подбора элементов справочников, затем выбрать элементы, согласно правилу.

Скачать файлы

Наименование Файл Версия Размер
ВыборЭлементовСправочникаВПолеФормы.epf
.epf 8,03Kb
22
.epf 8,03Kb 22 Скачать

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

Для элемента формы, отвечающего за правило подбора заполняем его "список значений для выбора" необходимыми вариантами как на рисунке 1. Устанавливаем событие "ПриИзменении" для этого элемента, устанавливаем событие "ПередОткрытием" для всей формы, вставляем этот код и всё.

Благодарю за внимание!

 
перем ПредыдущаяПараПравил;


Процедура
КнопкаВыполнитьНажатие(Кнопка)
   
ТаблицаКонтрагенты = ПолучитьТаблицуЭлементовИзПоляФормы("Контрагенты", Истина);
    Для каждого
СтрокаТаблицы Из ТаблицаКонтрагенты Цикл
       
Сообщить(СтрокаТаблицы.Ссылка.Наименование);
       
ОбработкаПрерыванияПользователя();
    КонецЦикла;
   
ТаблицаНоменклатура = ПолучитьТаблицуЭлементовИзПоляФормы("Номенклатура");
    Для каждого
СтрокаТаблицы Из ТаблицаНоменклатура Цикл
       
Сообщить(СтрокаТаблицы.Ссылка.Наименование);
       
ОбработкаПрерыванияПользователя();
    КонецЦикла;
КонецПроцедуры

Процедура
ПередОткрытием(Отказ, СтандартнаяОбработка)
   
УстановитьПравилоПодбораВПолеФормы(ЭлементыФормы.ПравилоКонтрагенты.Значение, "Контрагенты");
   
УстановитьПравилоПодбораВПолеФормы(ЭлементыФормы.ПравилоНоменклатура.Значение, "Номенклатура");
КонецПроцедуры

Процедура
ПравилоКонтрагентыПриИзменении(Элемент)
   
УстановитьПравилоПодбораВПолеФормы(Элемент.Значение, "Контрагенты");
КонецПроцедуры

Процедура
ПравилоНоменклатураПриИзменении(Элемент)
   
УстановитьПравилоПодбораВПолеФормы(Элемент.Значение, "Номенклатура");
КонецПроцедуры

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

//Возвращает таблицу выбранных элементов справочника с колонкой "Ссылка"
Функция ПолучитьТаблицуЭлементовИзПоляФормы(НазваниеСправочника, ВключатьГруппы = Ложь)
   
ИсходнаяТаблица = Новый ТаблицаЗначений();
   
ИсходнаяТаблица.Колонки.Добавить("КолонкаЭлементов", Новый ОписаниеТипов("СправочникСсылка." + НазваниеСправочника));
   
ЗначениеПравила = ЭлементыФормы["Правило" + НазваниеСправочника].Значение;
    Если
ЗначениеПравила = "Равно" ИЛИ ЗначениеПравила = "ВГруппе" Тогда
        Если
ЭлементыФормы[НазваниеСправочника].Значение = Справочники[НазваниеСправочника].ПустаяСсылка() Тогда
           
ВыборВключаетЭлементы = Ложь;
        Иначе
           
ВыборВключаетЭлементы = Истина;
        КонецЕсли;
    ИначеЕсли
ЗначениеПравила = "НеРавно" ИЛИ ЗначениеПравила = "НеВГруппе" Тогда
       
ВыборВключаетЭлементы = Ложь;
    ИначеЕсли
ЗначениеПравила = "ВСписке" Тогда
           
ВыборВключаетЭлементы = Истина;
    ИначеЕсли
ЗначениеПравила = "НеВСписке" Тогда
        Если
ЭтаФорма[НазваниеСправочника].Количество() = 0 Тогда
           
ВыборВключаетЭлементы = Истина;
        Иначе
           
ВыборВключаетЭлементы = Ложь;
        КонецЕсли;
    Иначе
       
ВыборВключаетЭлементы = Истина;
    КонецЕсли;
    Если
ТипЗнч(ЭлементыФормы[НазваниеСправочника].Значение) = Тип("СписокЗначений") Тогда
        Для Каждого
текСтрока Из ЭлементыФормы[НазваниеСправочника].Значение Цикл
           
табСтрока = ИсходнаяТаблица.Добавить();
           
табСтрока.КолонкаЭлементов = текСтрока.Значение;
        КонецЦикла;
    Иначе
       
табСтрока = ИсходнаяТаблица.Добавить();
       
табСтрока.КолонкаЭлементов = ЭлементыФормы[НазваниеСправочника].Значение;
    КонецЕсли;
   
Запрос = Новый Запрос;
   
Запрос.Текст = "
    |ВЫБРАТЬ * ПОМЕСТИТЬ ИсходнаяТаблица ИЗ &ИсходнаяТаблица КАК ИсходнаяТаблица
    |;
    |ВЫБРАТЬ
    |   Ссылка
    |ИЗ
    |   Справочник."
+ НазваниеСправочника + "
    |ГДЕ
    |   "
+ ?(ВключатьГруппы, "", " НЕ ЭтоГруппа И ") + "
    |   Ссылка "
+ ?(ВыборВключаетЭлементы, "", "НЕ") + " В ИЕРАРХИИ (ВЫБРАТЬ КолонкаЭлементов ИЗ ИсходнаяТаблица)
    |"
;
   
Запрос.УстановитьПараметр("ИсходнаяТаблица", ИсходнаяТаблица);
    Возврат
Запрос.Выполнить().Выгрузить();
КонецФункции

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2678    1    John_d    8    

55

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4614    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    3963    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8842    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2077    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16150    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. KonstB 180 05.09.12 12:36 Сейчас в теме
Это Вы называете "мини" ???
Чем Вам типовой способ подбора, через построитель отчета/запроса не угодил????

Вот весь код (с учетом выбора из любого справочника), сделал за 1 мин 26 сек (специально засек...):

Процедура КнопкаВыполнитьНажатие(Кнопка)
	Результат = ПостроительОтчета.ПолучитьЗапрос().Выполнить().Выгрузить();
	ЭлементыФормы.Результат.СоздатьКолонки();
КонецПроцедуры

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
	Для каждого Спр Из Метаданные.Справочники Цикл
		ЭлементыФормы.ВидСправочника.СписокВыбора.Добавить(Спр.Имя, Спр.Синоним,, БиблиотекаКартинок.Справочник);  	
	КонецЦикла; 
КонецПроцедуры


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

Показать


В результате ТЗ со списком ссылок
Прикрепленные файлы:
ОтборЧерезПО.epf
user668563_greendayzpua; leles; +2 Ответить
3. leles 67 06.09.12 00:10 Сейчас в теме
(1) Да, спасибо, хороший пример. Когда я смотрел подбор номенклатуры в прайс, там с построителем было значительно больше кода, и честно сказать не захотел с этим разбираться и набросал свой вариант. Возможно колёса у него слегка угловатые, зато в спицы ленточки вплетены и трещотка стоит:
Хотелось не нагружать пользователя разнообразием выбора. Есть один справочник - выбрал способ отбора, затем сами элементы и всё. Без таблицы, без возможности выбора реквизитов элементов.
(2) По поводу ОбработкаПрерыванияПользователя() не подумал я, что у людей в справочнике много элементов может оказаться, пардон, исправлю.
Замечания дельные, принимаю. Покручу ещё Вашу обработку, может, переделаю свою. Спасибо за опыт!
4. KonstB 180 06.09.12 17:55 Сейчас в теме
(3) leles, Пожалуйста :)

Еще добавлю: Не хотите нагружать пользователя - не нагружайте:

	ПостроительОтчета.Текст = "ВЫБРАТЬ
	                          |	" + ОбъектМетаданных + ".Ссылка КАК " + ОбъектМетаданных + "
	                          |ИЗ
	                          |	Справочник." + ОбъектМетаданных + " КАК " + ОбъектМетаданных + "
	                          |{ГДЕ
	                          |	" + ОбъектМетаданных + ".Ссылка,
	                          |	" + ОбъектМетаданных + ".Код,
	                          |	" + ОбъектМетаданных + ".ИНН}";
	ПостроительОтчета.ЗаполнитьНастройки();						 

	ПостроительОтчета.ДоступныеПоля.Удалить(ПостроительОтчета.ДоступныеПоля.Найти(ОбъектМетаданных));

Показать


В результате отбор только по полям: Ссылка, Код и ИНН.

+ само поле отбора возможно навесить "рюшечками", чтобы пользователю нельзя было удалять/изменять данные - в общем все как ВАМ угодно :)
2. KonstB 180 05.09.12 12:40 Сейчас в теме
Зачем изобретать велосипед, да еще и с квадратными колесами...

Почитай, про: ОбработкаПрерыванияПользователя(); :)
Оставьте свое сообщение