Вопрос Обход запроса по группировкам, как собираются данные в запросе с конструкцией ИТОГИ ПО. Предположим, требуется организовать цикл, в котором должен формироваться массив заказов, в разрезе Контрагентов и Адреса доставки. Как это сделать?
Ответ Пишем запрос:
(Права на эту статью принадлежат сайту http://www.1c-h.ru) Контрагент 1
- заказ 1, заказ 2, заказ 3
- заказ 4, заказ 5
- заказ 6
Для получения этих массивов требуется организовать обход приведенного выше запроса «По группировкам с иерархией»:
Ответ Пишем запрос:
Запрос.Текст = "ВЫБРАТЬ | усЗаказНаОтгрузку.Ссылка КАК Ссылка, | усСтатусДокументов.Статус КАК Статус, | усЗаказНаОтгрузку.Контрагент КАК Контрагент, // Адрес доставки заключаем в "ВЫРАЗИТЬ", т.к. в метаданных Адрес Доставки - строка неограниченной длины и если ее не преобразовать в строку ограниченной длины, //то ее будет невозможно использовать в конструкции "ИТОГИ ПО" // и мы получим сообщение об ошибке вида "Недопустимое поле для группировки" | ВЫРАЗИТЬ(усЗаказНаОтгрузку.АдресДоставки КАК СТРОКА(350)) КАК АдресДоставки |ИЗ | РегистрСведений.усСтатусДокументов КАК усСтатусДокументов | ЛЕВОЕ СОЕДИНЕНИЕ Документ.усЗаказНаОтгрузку КАК усЗаказНаОтгрузку | ПО усСтатусДокументов.Документ = усЗаказНаОтгрузку.Ссылка |ГДЕ | усЗаказНаОтгрузку.Проведен | |УПОРЯДОЧИТЬ ПО | усСтатусДокументов.Статус.Порядок |ИТОГИ ПО | Контрагент, | АдресДоставки";Результатом этого запроса будет набор данных примерно такого вида:
(Права на эту статью принадлежат сайту http://www.1c-h.ru) Контрагент 1
- АдресДоставки1
Контрагент 1
- заказ 1
- заказ 2
- заказ 3
- АдресДоставки2
Контрагент2
- заказ 4
- заказ 5
- АдресДоставки3
Теперь нам нужно получить три массива:
- заказ 6
- заказ 1, заказ 2, заказ 3
- заказ 4, заказ 5
- заказ 6
Для получения этих массивов требуется организовать обход приведенного выше запроса «По группировкам с иерархией»:
СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией; Результат = Запрос.Выполнить(); ВыборкаПервогоУровня = Результат.Выбрать(СпособВыборки); Пока ВыборкаПервогоУровня.Следующий() Цикл // внутри каждого уровня иерархии заказы упорядочены: "Создан", "В работу", "Ведутся работы", "Готов к отгрузке" (именно в таком порядке, порядок установлен в перечислении) ВыборкаВторогоУровня = ВыборкаПервогоУровня.Выбрать(СпособВыборки); мсвЗаказов.Очистить(); // очистили перед добавлением первого в список Пока ВыборкаВторогоУровня.Следующий() Цикл // внутри каждого уровня иерархии заказы упорядочены: "Создан", "В работу", "Ведутся работы", "Готов к отгрузке" (именно в таком порядке, порядок установлен в перечислении) ВыборкаТретьегоУровня = ВыборкаВторогоУровня.Выбрать(ОбходРезультатаЗапроса.Прямой); // параметр можно не передавать, по умолчанию способ выборки прямой Пока ВыборкаТретьегоУровня.Следующий() Цикл // внутри каждого уровня иерархии заказы упорядочены: "Создан", "В работу", "Ведутся работы", "Готов к отгрузке" (именно в таком порядке, порядок установлен в перечислении) мсвЗаказов.Добавить(ВыборкаТретьегоУровня.Ссылка); КонецЦикла; СформироватьОтборПоЗаказу(мсвЗаказов); // тут мы по очереди получим в цикле требуемые массивы: [заказ 1, заказ 2, заказ 3], затем [заказ 4, заказ 5] и [заказ 6] КонецЦикла; КонецЦикла;Примечание. Конструкция «УПОРЯДОЧИТЬ ПО усСтатусДокументов.Статус.Порядок» будет срабатывать внутри каждого массива, т.е. заказы будут упорядочены по статусу в каждом из полученных массивов.
Комментариев нет:
Отправить комментарий