.
// получает все запрещенные к премированию подразделения с учетом иерархии
Функция ПолучитьВсеЗапрещенныеПодразделения() Экспорт
МВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос();
Запрос.МенеджерВременныхТаблиц = МВТ;
// сначала получим сырые данные
Запрос.Текст = «ВЫБРАТЬ
| опЗапретПремированияПодразделенийСрезПоследних.СУчетомИерархии,
| опЗапретПремированияПодразделенийСрезПоследних.ПодразделениеОрганизации
|ПОМЕСТИТЬ ЗапрещенныеПодразделения1
|ИЗ
| РегистрСведений.опЗапретПремированияПодразделений.СрезПоследних(&ДатаСреза, Организация = &Организация) КАК опЗапретПремированияПодразделенийСрезПоследних
|ГДЕ
| НЕ опЗапретПремированияПодразделенийСрезПоследних.ПремированиеРазрешено»;
Запрос.УстановитьПараметр(«Организация», Организация);
Запрос.УстановитьПараметр(«ДатаСреза», КонецДня(ДатаКонца));
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Выборка.Следующий();
// получим количество записей временной таблицы
КолВоЗаписей1 = Выборка.Количество;
КолВоЗаписей2 = 0;
НомерЦикла1 = 1;
// затем напишем циклический запрос, в котором будут меняться номера вложенных таблиц
// всё время результат будем объединять с исходной таблицей (без совпадений!)
Запрос.Текст = «ВЫБРАТЬ
| ЗапрещенныеПодразделения.СУчетомИерархии,
| ПодразделенияОрганизаций.Ссылка КАК ПодразделениеОрганизации
|ПОМЕСТИТЬ ЗапрещенныеПодразделения1
|ИЗ
| ЗапрещенныеПодразделения0 КАК ЗапрещенныеПодразделения
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
| ПО ЗапрещенныеПодразделения.ПодразделениеОрганизации = ПодразделенияОрганизаций.Родитель
| И (ЗапрещенныеПодразделения.СУчетомИерархии)
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| ЗапрещенныеПодразделения.СУчетомИерархии,
| ЗапрещенныеПодразделения.ПодразделениеОрганизации
|ИЗ
| ЗапрещенныеПодразделения0 КАК ЗапрещенныеПодразделения»;
// условие выхода из цикла — количество искомых подразделений перестанет расти
Пока КолВоЗаписей1 <> КолВоЗаписей2 Цикл
КолВоЗаписей2 = КолВоЗаписей1;
// циклически заменяем номера вложенных таблиц
Запрос.Текст = СтрЗаменить(Запрос.Текст, «ЗапрещенныеПодразделения» + НомерЦикла1, «ЗапрещенныеПодразделения» + Число(НомерЦикла1 + 1));
Запрос.Текст = СтрЗаменить(Запрос.Текст, «ЗапрещенныеПодразделения» + Число(НомерЦикла1 — 1), «ЗапрещенныеПодразделения» + НомерЦикла1);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Выборка.Следующий();
// получим количество записей временной таблицы
КолВоЗаписей1 = Выборка.Количество;
НомерЦикла1 = НомерЦикла1 + 1;
КонецЦикла;
// последняя (или предпоследняя!) таблица даст нужный результат, в колонке «ПодразделениеОрганизации»
// последняя таблица имеет номер НомерЦикла1 (он только что был увеличен на 1)
// предпоследняя таблица имеет номер (НомерЦикла1-1)
Запрос.Текст = «ВЫБРАТЬ
| ЗапрещенныеПодразделения.СУчетомИерархии,
| ЗапрещенныеПодразделения.ПодразделениеОрганизации
|ИЗ
| ЗапрещенныеПодразделения0 КАК ЗапрещенныеПодразделения»;
Запрос.Текст = СтрЗаменить(Запрос.Текст, «ЗапрещенныеПодразделения0», «ЗапрещенныеПодразделения» + НомерЦикла1);
Результат = Запрос.Выполнить();
Возврат Результат.Выгрузить().ВыгрузитьКолонку(«ПодразделениеОрганизации»);
КонецФункции // ПолучитьВсеЗапрещенныеПодразделения()
.