База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как в УТ 11.5 составить запрос по иерархии складов с типом РозничныйМагазин? › Ответ в теме: Как в УТ 11.5 составить запрос по иерархии складов с типом РозничныйМагазин?
В УТ 11.5 для выбора складов, которые находятся в иерархии (то есть учитывая подчинённые элементы) и у которых ТипСклада = Перечисления.ТипыСкладов.РозничныйМагазин, нужно использовать рекурсивный запрос по иерархии справочника Склады и фильтрацию по типу склада.
Пример запроса на языке 1С с использованием рекурсивного подзапроса:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Склады.Ссылка КАК Склад, | Склады.Наименование |ИЗ | Справочник.Склады КАК Склады |ГДЕ | Склады.ТипСклада = &ТипРозничныйМагазин | И Склады.Ссылка В | (ВЫБРАТЬ РАЗРЕШЕННЫЕ | | Иерархия.Ссылка | |ИЗ | | Рекурсивный( | | ВЫБРАТЬ | | | Ссылка, | | | Родитель | | ИЗ | | | Справочник.Склады | | ) КАК Иерархия | |ГДЕ | | Иерархия.Родитель = &КорневойСклад | | ИЛИ Иерархия.Ссылка = &КорневойСклад | ) |"; Запрос.УстановитьПараметр("ТипРозничныйМагазин", Перечисления.ТипыСкладов.РозничныйМагазин); КорневойСклад = Справочники.Склады.Найти(Имя = "ИмяКорневогоСклада"); Запрос.УстановитьПараметр("КорневойСклад", КорневойСклад); Возврат Запрос.Выполнить().Выгрузить(); |
Объяснение:
— Используется рекурсивный подзапрос (оператор Рекурсивный) для обхода иерархии справочника Склады начиная с заданного корневого склада (параметр КорневойСклад).
— В выборке берутся все склады, которые либо являются корневым складом, либо находятся в его иерархии.
— Фильтрация по ТипСклада = РозничныйМагазин.
— Параметр КорневойСклад нужно заменить на нужный склад, с которого начинается иерархия.
Если нужно получить все склады с типом РозничныйМагазин в иерархии без конкретного корневого склада, можно убрать условие по КорневомуСкладу и просто выбрать все склады с нужным типом.
Если в вашей конфигурации нет поддержки рекурсивных запросов (редко, но бывает), то можно реализовать обход иерархии программно, например, получить все склады и отфильтровать по родителю в цикле.
—
Если нужно просто проверить, что склад находится в иерархии под определённым складом и тип склада равен РозничныйМагазин, то можно использовать такой запрос:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Запрос.Текст = "ВЫБРАТЬ | Склады.Ссылка КАК Склад, | Склады.Наименование |ИЗ | Справочник.Склады КАК Склады |ГДЕ | Склады.ТипСклада = &ТипРозничныйМагазин | И Склады.Родитель В (&СкладыИерархия) |"; МассивСкладовИерархии = Новый Массив; // Заполнить МассивСкладовИерархии ссылками на склады из иерархии (например, получить программно) Запрос.УстановитьПараметр("ТипРозничныйМагазин", Перечисления.ТипыСкладов.РозничныйМагазин); Запрос.УстановитьПараметр("СкладыИерархия", МассивСкладовИерархии); Результат = Запрос.Выполнить().Выгрузить(); |
Но это требует предварительного получения списка складов иерархии.
—
https://infostart.ru/public/104345/
https://its.1c.ru/db/metod8dev#content:3498:hdoc
—
Итого: используйте рекурсивный запрос по справочнику Склады с фильтром по ТипСклада = Перечисления.ТипыСкладов.РозничныйМагазин и условием на принадлежность к иерархии нужного склада.