gifts2017

Форма редактирования списка значений

Опубликовал Иван (Spartan) в раздел Программирование - Универсальные функции

Форма предлагается в качестве замены стандартному диалогу "Редактирование списка": максимально полно повторяет его интерфейс и функционал, а также обладает дополнительными возможностями и преимуществами.

Иногда возникают такие ситуации, когда необходимо обработать события при редактировании списка значений. Кроме того для некоторых подбираемых элеметов не задается владелец, например для характеристик, и они вываливаются всем списком, что не очень удобно. Но поскольку стандартный диалог реализован на уровне платформы, программист не может внести в него никаких изменений. Для таких случаев я и сделал аналог стандартного диалога - он полностью повторяет его функционал, но позволяет при необходимости обрабатывать различные проблемные ситуации.

ОТЛИЧИЯ ОТ СТАНДАРТНОГО ДИАЛОГА

 - есть возможность задать свойство ВыборПоВладельцу для ограничения списка элементов,  предлагаемых для выбора и подбора (например, может применяться при использовании характеристик в отборах: в стандартном диалоге открывается полный список без установки владельца);
- можно назначать свои обработчики ПриИзменении, НачалоВыбора, Очистка, ОбработкаВыбора,  АвтоПодборТекста, ОкончаниеВводаТекста для значений списка (позволяет обработать процесс наполнения списка нужным образом);

ПАРАМЕТРЫ ФОРМЫ

Список - тип "СписокЗначений", в параметр передается список значений, который необходимо  редактировать (например, правое значение отбора с сответствующим видом сравнения), наполнение списка зависит от его свойства ТипЗначения;

ВыборПоВладельцу - тип "ЛюбаяСсылка", необязательный параметр, в который может передаваться элемент-владелец, по которому будут выбираться значения (например, элемент плана видов характеристик, для ограничения списка свойств предлагаемых для выбора и подбора);

ОбработчикиСобытий - тип "Структура", необязательный параметр, в который может передаваться структура вида (<Событие>, <Обработчик>) с описанием обработчиков событий для значений списка;

ОБРАБОТКА РЕЗУЛЬТАТА

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

ПРИМЕР ИСПОЛЬЗОВАНИЯ

Необходимо в отборе отчета, построенного на СКД, ограничить перечень предлагаемых для выбора элементов справочника "Контрагенты" (только юрлица) и их свойств при редактировании списка.

Код в форме настройки отчета:


 Процедура ОтборПравоеЗначениеНачалоВыбора(Элемент, СтандартнаяОбработка)

     
ТекущийВидСравнения = ЭлементыФормы.Отбор.ТекущиеДанные.ВидСравнения;

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

         ПредставлениеОтбора = Строка(ЭлементыФормы.Отбор.ТекущиеДанные.ЛевоеЗначение);
     
   ЛевоеЗначениеОтбора = ЭлементыФормы.Отбор.ТекущиеДанные.ЛевоеЗначение;

         ПравоеЗначениеОтбора = ЭлементыФормы.Отбор.ТекущиеДанные.ПравоеЗначение;
         
ПолеКомпоновкиКонтрагент = Новый ПолеКомпоновкиДанных("Контрагент");        
         

         ФормаРедактированияСписка = ПолучитьОбщуюФорму("ФормаРедактированияСписка", Элемент);
         
ФормаРедактированияСписка.Список = ПравоеЗначениеОтбора.Скопировать();
         Если
ЛевоеЗначениеОтбора = ПолеКомпоновкиКонтрагент Тогда
             
ОбработчикиСобытий = Новый Структура;
             
ОбработчикиСобытий.Вставить("НачалоВыбора", "ЮрлицоВыбор(Элемент, СтандартнаяОбработка)");
             
ОбработчикиСобытий.Вставить("АвтоПодборТекста", "ЮрлицоАвтоПодборТекста(Элемент, Текст, ТекстАвтоПодбора, СтандартнаяОбработка)");
             
ОбработчикиСобытий.Вставить("ОкончаниеВводаТекста", "ЮрлицоОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)");
             
ФормаРедактированияСписка.ОбработчикиСобытий = ОбработчикиСобытий;
         ИначеЕсли
Найти(ПредставлениеОтбора, "(свойство)") > 0 Тогда
             
СоответствиеСвойств = УстановитьСоответствиеСвойств(ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Контрагенты, "Контрагент.[", " (свойство)]");
             
ФормаРедактированияСписка.ВыборПоВладельцу = СоответствиеСвойств.Получить(ПредставлениеОтбора);
         КонецЕсли;
         
ФормаРедактированияСписка.ОткрытьМодально();
     КонецЕсли;
КонецПроцедуры

 

Форма редактирования списка значений добавлена в общие формы. Функция УстановитьСоответствиеСвойств возвращает соответствие вида (<Наименование поля компоновки данных>, <Элемент плана видов характеристик "СвойстваОбъектов">), процедуры ЮрлицоВыбор, ЮрлицоАвтоПодборТекста, ЮрлицоОкончаниеВводаТекста описывают поведение формы выбора таким образом, чтобы в предлагаемый список попадали только юрлица. Процедуры определены как экспортные и размещены в общем модуле.

 

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

Наименование Файл Версия Размер Кол. Скачив.
Форма редактирования списка
.epf 11,79Kb
29.06.10
359
.epf 11,79Kb 359 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Андрей C (an77) 24.06.10 09:10
Прошу прощения, можно ли одним движением заменить стандартную форму редактирования списка на предложенную?
2. Иван (Spartan) 24.06.10 09:20
(1) Одним движением, к сожалению нет... :) Стандартная "зашита" в платформе. Эту можно лишь вызывать в нужных местах конфигурации вместо стандартной. Выше есть пример, как это сделать.
3. Эстер Коган (e.kogan) 25.06.10 11:38
Автор, совершенно необязательно весь приведённый вами код писать в форме каждого конкретного отчёта. Проще вынести процедуру обработки в общий модуль, передать ей всё, что нужно, и обрабатывать исключительно там. В таком случае изменение сводится к одной строке (если собственно НачалоВыбора в модуле уже есть) или к трём (если не было).
ОбработкаВыбора и вовсе не нужна - у вас же есть Элемент, Значение которого вы и обрабатываете.
imbio; Spartan; +2 Ответить 3
4. Иван (Spartan) 25.06.10 12:14
(3) Я и не предлагал писать приведенный код в форме каждого отчета. Это просто пример использования моей формы, для того чтобы было понятно как заполнять ее параметры и как вообще можно использовать. Суть публикации не в коде, а в самой форме - а дальше дело каждого программиста, как и где ее вызывать.
Насчет ОбработкиВыбора - дело вкуса. Я передаю в форму не само значение, а его копию, чтобы список не менялся динамически по ссылке во время редактирования, потом оповещаю о выборе. Можно конечно передавать само значение, в форме его копировать и заменять по нажатию ОК. Это принципиально, Вы считаете?
5. Эстер Коган (e.kogan) 25.06.10 12:29
(4) Чем меньше кода меняется в каждом конкретном случае - тем лучше, я считаю.
8. Иван (Spartan) 29.06.10 19:03
(3) Голова была забита и что-то сразу не сообразил, что можно задать владельцем формы не форму настройки а сам элемент и тогда действительно никакая обработка выбора не нужна. Спасибо за толчок в нужном направлении...
9. Алекс (Alef) 15.09.10 10:25
Отлично, спасибо, работает!!!
10. Анатолий (Aloger) 20.01.11 14:07
Вопросы по примеру.
Где должны быть обработчики? Только в форме настройки отчета или в другом месте?
Как правильно написать подключаемый обработчик?
11. Иван (Spartan) 20.01.11 14:43
(10) Все зависит от контекста. Если форма является общей (как в примере), то обработчик должен быть "виден" в глобальном контексте (например, экспортная процедура в общем модуле), если форма редактирования является формой объекта, то обработчик должен быть доступен в рамках объекта (например, экспортная процедура в модуле объекта). Работа обработчиков реализована с помощью оператора Выполнить(<Строка>), соответственно строка с кодом должна быть доступна в контексте модуля формы редактирования списка значений.
Правила написания обработчика просты: имена и количество параметров должны совпадать с аналогичными в стандартных обработчиках.
12. megatrend - (megatrend) 24.07.11 00:07
Обработка весьма полезная. Пригодилась мне, когда стандартная форма редактирования списка значений почему-то открывалась в режиме "только просмотр". Почему это произошло - так и не смог разобраться.
13. Юрий Александрович (jirafff) 25.12.11 15:51
14. Александр Ф (leon111) 13.01.12 11:52
15. Рита Подскробко (ritapodskr) 12.03.12 17:34
Спасибо огромное! Попробую прикрутить!
16. Кирилл Грачев (_df_) 22.02.13 16:35
17. Валентин Елфимов (ratinc) 04.08.13 19:48
Чтото я не разобрался с более простым примером использования вашей формы.
Например хочу использовать её для создания списка значений в котором только группы номенклатуры.
Подскажите - куда копать?
18. Иван (Spartan) 05.08.13 19:58
(17) Что конкретно не получается? Схема та же, что и в моем примере: владельцем задаете элемент формы ПолеВвода, передаете список значений, пишете свой(и) обработчик(и) для ограничения элементов в форме выбора только группами и также передаете их в форму через структуру. Подробнее не могу сейчас посмотреть/подсказать - я в отпуске, и под рукой нет компа с 1С.
19. Валентин Елфимов (ratinc) 06.08.13 00:43
Я разобрался. Извиняюсь что не отписался о неактуальности вопроса.
Всё заработало отлично. Спасибо за помощь
20. 1С Доктор (OlegAl) 01.11.13 12:39
Списибо за разработку... Разобрался, весьма полезная штука. Почему разработчики 1С не включили данную форму в общие формы?! Значительно облегчили бы работу со списками значений.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа