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