gifts2017

Программисту на заметку: отбор в динамическом списке формы выбора справочника по вхождению значения отбора в заданный список значений

Опубликовал Дмитрий Романовский (vdscom) в раздел Программирование - Практика программирования

В конфигурации ведется учет по нескольким организациям. Возникла задача для каждой конкретной организации при выборе элемента справочника "Классификатор статей доходов и затрат" в форме выбора отображать только допустимые именно для этой организации элементы справочника. Ниже предлагается вариант решения этой задачи.

В конфигурации ведется учет по нескольким организациям. Возникла задача для каждой конкретной организации при выборе элемента справочника "Классификатор статей доходов и затрат" в форме выбора отображать только допустимые именно для этой организации элементы справочника. Ниже предлагается вариант решения этой задачи.

 

1. В справочнике "Классификатор статей доходов и затрат" добавляем реквизит "АктуальноДляЮрлиц", тип значения - Строка(0).

2. В форме элемента справочника добавляем реквизит "РеквизитАктуальноДляЮрлиц", тип значения - СписокЗначений, тип значения списка значений - СправочникСсылка.КлассификаторОрганизацийХолдинга

3. В общем модуле "_ОбщегоНазначения" размещаем процедуры:

 

Процедура ПреобразоватьСтрокуВСписокЗначений(РеквизитОбъекта,РеквизитФормы,ЭтоФормаОбъекта) Экспорт

Если ЗначениеЗаполнено(РеквизитОбъекта) Тогда
Попытка
РеквизитФормы = ЗначениеИзСтрокиВнутр(РеквизитОбъекта);
Исключение
Если ЭтоФормаОбъекта Тогда
РеквизитОбъекта = "";
КонецЕсли;
КонецПопытки;
КонецЕсли;

КонецПроцедуры

 

Процедура ПреобразоватьСписокЗначенийВСтроку(РеквизитОбъекта,РеквизитФормы) Экспорт

КвоВСписке = РеквизитФормы.Количество();
Если КвоВСписке > 0 Тогда
// удаляем дубли и сортируем по представлению
Таб = Новый ТаблицаЗначений;
Таб.Колонки.Добавить("Значение");
Для ном = 0 По КвоВСписке-1 Цикл
Таб.Добавить();
КонецЦикла;
Таб.ЗагрузитьКолонку(РеквизитФормы.ВыгрузитьЗначения(),"Значение");
Таб.Свернуть("Значение");
Таб.Сортировать("Значение");
РеквизитФормы.Очистить();
Для каждого стр из Таб Цикл
РеквизитФормы.Добавить(стр.Значение);
КонецЦикла;

РеквизитОбъекта = ЗначениеВСтрокуВнутр(РеквизитФормы);
Иначе
РеквизитОбъекта = "";
КонецЕсли;

КонецПроцедуры

 

Модуль формы элемента справочника:

 

Процедура ПриОткрытии()

_ОбщегоНазначения.ПреобразоватьСтрокуВСписокЗначений(АктуальноДляЮрлиц,РеквизитАктуальноДляЮрлиц,Истина);

КонецПроцедуры

 

Процедура ПередЗаписью(Отказ)

_ОбщегоНазначения.ПреобразоватьСписокЗначенийВСтроку(АктуальноДляЮрлиц,РеквизитАктуальноДляЮрлиц);

КонецПроцедуры

 

Модуль формы выбора справочника:

 

Процедура ПриОткрытии()

УстановитьОтборПоТекущейОрганизации();

КонецПроцедуры

 

Процедура УстановитьОтборПоТекущейОрганизации()

ОсновнаяОрганизацияПользователя = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ПараметрыСеанса.ТекущийПользователь,"ОсновнаяОрганизация");

Если Константы.УстанавливатьОтборПоОсновнойОрганизации.Получить() и ЗначениеЗаполнено(ОсновнаяОрганизацияПользователя) Тогда
ТекущаяОрганизацияПоКлассификаторуСтрокой = ЗначениеВСтрокуВнутр(ОсновнаяОрганизацияПользователя.ОрганизацияПоКлассификатору);

СправочникДерево.Отбор["АктуальноДляЮрлиц"].Использование = Истина;
СправочникДерево.Отбор["АктуальноДляЮрлиц"].Значение = ТекущаяОрганизацияПоКлассификаторуСтрокой;
СправочникДерево.Отбор["АктуальноДляЮрлиц"].ВидСравнения = ВидСравнения.Содержит;
КонецЕсли;

КонецПроцедуры

 

Как это работает

1. В нужный нам справочник добавлен реквизит "АктуальноДляЮрлиц" с типом значения Строка(0), в котором мы сохраняем строковое представление списка значений, а в этом списке значений мы сохраняем список организаций (по классификатору), для которых этот элемент справочника должен быть доступным.

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

Замечания

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

См. также

Подписаться Добавить вознаграждение
Комментарии
1. ффф ыыы (zqzq) 25.09.13 13:16
2. Ivan Kovtun (i.kovtun) 25.09.13 18:57
Коллега vdscom, не обижайтесь, но по моему мнению, фильтровать по длинным строкам да еще и в динамических списках, это последний из вариантов, к которому стоит прибегать.
3. Дмитрий Романовский (vdscom) 25.09.13 20:30
(2) i.kovtun, не обижаюсь :)

а почему бы и нет ? какие есть противопоказания ?..
возможно, мы упремся в ограничение строки в запросе - 1024 знака... но в моем случае (30 элементов - перечень организаций холдинга) - метод работает на ура
4. Ivan Kovtun (i.kovtun) 25.09.13 21:15
Коль скоро, мы работаем с реляционными базами данных, я бы начал с реляционных подходов. Если речь о динамических списках, я бы предложил такой вариант:
1. Добавил бы в справочник статей ТЧ "Принадлежность" с полем "Организация".
2. В качестве источника динамического списка использовал "Произвольный запрос", где соединил бы статьи с ТЧ, и отфильтровал бы по Организации, которую бы получал из параметров формы.
3. При вызове формы выбора статей передавал бы параметр "Организация" из формы-владельца.
4. При вызове формы списка получал бы параметр "Организация" из настроек пользователя.
5. Дмитрий Романовский (vdscom) 25.09.13 21:38
(4) i.kovtun, ваш вариант применим для неуправляемых форм ?
6. Ivan Kovtun (i.kovtun) 25.09.13 22:00
(5) vdscom, для обычных форм, можно иначе решить.
Например, если сотрудник жестко привязан к организации, то можно вообще РЛС использовать, тогда и формы трогать нет необходимости.
Если фильтрация статей по РЛС это слишком жестко, можно вместо ТЧ добавить регистр сведений вроде "СтатьиОрганизаций". Выбор осуществлять из формы списка этого регистра, или новой формы выбора справочника где выбирать из таблицы значений или дерева значений, заполняемых запросом по регистру сведений.

Вариантов решить Вашу задачу гибко довольно много.
7. Дмитрий Романовский (vdscom) 25.09.13 22:44
(6) i.kovtun, да, много
и мой вариант - один из них. на малых объемах (около 100 элементов справочника и до 30 значений в списке) - вполне работоспособен. возникнет вопрос в быстродействии и/или работоспособности на больших объемах данных - или доработаю, или придумаю что-то другое.
8. Rom Shpakoff (Lancelot-2M) 28.09.13 01:26
+100500 к регистру сведений - не нужно менять типовой справочник, форма списка/выбора своя и при обновлении не затрагивается, достаточно после обновления указать ее назначение в настройках объекта.