1С Предприятие 8.2. Пример получения в запросе всех подразделений с учётом иерархии

.

// получает все запрещенные к премированию подразделения с учетом иерархии

Функция ПолучитьВсеЗапрещенныеПодразделения() Экспорт

МВТ = Новый МенеджерВременныхТаблиц;

Запрос = Новый Запрос();

Запрос.МенеджерВременныхТаблиц = МВТ;

// сначала получим сырые данные

Запрос.Текст = «ВЫБРАТЬ

|   опЗапретПремированияПодразделенийСрезПоследних.СУчетомИерархии,

|   опЗапретПремированияПодразделенийСрезПоследних.ПодразделениеОрганизации

|ПОМЕСТИТЬ ЗапрещенныеПодразделения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);

Результат = Запрос.Выполнить();

Возврат Результат.Выгрузить().ВыгрузитьКолонку(«ПодразделениеОрганизации»);

КонецФункции // ПолучитьВсеЗапрещенныеПодразделения()

.

Запись опубликована в рубрике Программное обеспечение. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.