четверг, 8 сентября 2011 г.

Обход запроса по группировкам, как собираются данные в запросе с конструкцией ИТОГИ ПО – 1С

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

Комментариев нет:

Отправить комментарий