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

23.09.13

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

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

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

 

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

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

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

 

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

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

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

 

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

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

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

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

 

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

 

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

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

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

 

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

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

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

 

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

 

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

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

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

 

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

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

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

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

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

 

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

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

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

Замечания

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

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

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4443    dsdred    53    

70

Как готовить и есть массивы

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

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

24.01.2024    5275    YA_418728146    25    

63

Планы обмена VS История данных

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

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6394    dsdred    36    

111

1С-ная магия

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

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18464    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

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

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12074    human_new    27    

74

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

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

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

28.08.2023    8799    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

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

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6271    sebekerga    54    

94

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

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

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15965    SeiOkami    31    

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

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

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