Форма выбора ДО | Форма выбора ПОСЛЕ |
(видны "пустые" группы справочника, хотя выводятся только элементы с типом "Услуга") | ("пустых" групп справочника не видно) |
1. Определяем элементы справочника, которые необходимо показать пользователю.
2. При открытии формы выбора устанавливаем отбор по элементам из п.п.1
3. Определяем ГРУППЫ СПРАВОЧНИКА, которые НЕ ЯВЛЯЮТСЯ РОДИТЕЛЕМ для элементов из п.п.1
4. При открытии формы через условное оформление убираем видимость групп справочника из п.п. 3
Самым "толстым" моментов в этой схеме является п.п.3 "Определяем ГРУППЫ СПРАВОЧНИКА, которые НЕ ЯВЛЯЮТСЯ РОДИТЕЛЕМ". Но для решения этой задачи был использован способ описанный ildarovich в статье Транзитивное замыкание запросом. После небольшой доработки ф-ии из этой статьи c легкостью можно получить группы справочника, которые не имеют никакого отношения к показываемым элементам справочника:
Функция ТранзитивноеЗамыкание(ИмяСправочника, МаксимальнаяДлинаПути, СписокИспользуемыхЭлементов) Экспорт
Пролог = "ВЫБРАТЬ Родитель НачалоДуги, Ссылка КонецДуги ПОМЕСТИТЬ ЗамыканияДлины1 ИЗ Справочник.Номенклатура
| ГДЕ Родитель <> Значение(Справочник.Номенклатура.ПустаяСсылка)
| ОБЪЕДИНИТЬ ВЫБРАТЬ Ссылка, Ссылка ИЗ Справочник.Номенклатура;";
Рефрен = "ВЫБРАТЬ РАЗЛИЧНЫЕ ПерваяДуга.НачалоДуги, ВтораяДуга.КонецДуги ПОМЕСТИТЬ ЗамыканияДлины#2 ИЗ ЗамыканияДлины#1 КАК ПерваяДуга
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины#1 КАК ВтораяДуга ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги;
| УНИЧТОЖИТЬ ЗамыканияДлины#1;";
Эпилог = "ВЫБРАТЬ НачалоДуги Предок, КонецДуги Потомок ИЗ ЗамыканияДлины#2 ГДЕ НачалоДуги <> КонецДуги";
Запрос = Новый Запрос(СтрЗаменить(Пролог, "Номенклатура", ИмяСправочника));
МаксимальнаяДлинаЗамыканий = 1;
Пока МаксимальнаяДлинаЗамыканий < МаксимальнаяДлинаПути Цикл
Запрос.Текст = Запрос.Текст + СтрЗаменить(СтрЗаменить(Рефрен, "#1", Формат(МаксимальнаяДлинаЗамыканий, "ЧГ=0")), "#2", Формат(2 * МаксимальнаяДлинаЗамыканий, "ЧГ=0"));
МаксимальнаяДлинаЗамыканий = 2 * МаксимальнаяДлинаЗамыканий;
КонецЦикла;
/// НАЧАЛО ВНЕСЕННЫХ МНОЮ ИЗМЕНЕНИЙ В Ф-ИЮ КУЛЬМИНАЦИЯ
//////Запрос.Текст = Запрос.Текст + СтрЗаменить(Эпилог, "#2", Формат(МаксимальнаяДлинаЗамыканий, "ЧГ=0"));
Кульминация = "ВЫБРАТЬ НачалоДуги Предок, КонецДуги Потомок ПОМЕСТИТЬ ЗамыканияДлины#2 ИЗ ЗамыканияДлины#1 ГДЕ НачалоДуги <> КонецДуги;
|УНИЧТОЖИТЬ ЗамыканияДлины#1;
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЗамыканияДлины#2.Предок
|ПОМЕСТИТЬ СписокИспользуемыхГрупп
|ИЗ
| ЗамыканияДлины#2 КАК ЗамыканияДлины#2
|ГДЕ
| ЗамыканияДлины#2.Потомок В(&СписокИспользуемыхЭлементов)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЗамыканияДлины#2.Предок КАК Родитель
|ИЗ
| ЗамыканияДлины#2 КАК ЗамыканияДлины#2
| ЛЕВОЕ СОЕДИНЕНИЕ СписокИспользуемыхГрупп КАК СписокИспользуемыхГрупп
| ПО ЗамыканияДлины#2.Предок = СписокИспользуемыхГрупп.Предок
|ГДЕ
| СписокИспользуемыхГрупп.Предок ЕСТЬ NULL
|
|СГРУППИРОВАТЬ ПО
| ЗамыканияДлины#2.Предок";
Запрос.Текст = Запрос.Текст + СтрЗаменить(СтрЗаменить(Кульминация, "#1", Формат(МаксимальнаяДлинаЗамыканий, "ЧГ=0")), "#2", Формат(МаксимальнаяДлинаЗамыканий * 2, "ЧГ=0"));;
Запрос.УстановитьПараметр("СписокИспользуемыхЭлементов",СписокИспользуемыхЭлементов);
МассивНесипользуемыхГрупп = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Родитель");
СписокНеиспользуемыхГрупп = Новый СписокЗначений;
СписокНеиспользуемыхГрупп.ЗагрузитьЗначения(МассивНесипользуемыхГрупп);
Возврат СписокНеиспользуемыхГрупп;
КонецФункции