Отчет по регистру с точностью до строки документа
Далее приведен пример использования запроса для просмотра регистра с выборкой документов, производивших движение данного регистра, с доступом к каждой строке этих документов. Цель данной процедуры — сформировать отчет, чтобы по каждому из видов топлива, отпущенных за заданный период покупателям, показать перечень номеров автомашин, которыми производилась отгрузка. Особенностью данного отчета является то, что номера автомашин не являются измерениями регистра, а зафиксированы в каждой строке отпускного документа.
Использование в описании внутренней переменной для регистра атрибута НомерСтроки, означает выборку связанных номеров строк тех документов, которые произвели движение по регистру (предполагается, что в конфигурации в Модулях документов перед движением данного регистра использовали метод ПривязыватьСтроку).
Процедура Сформировать()
Перем Запрос, ТекстЗапроса, Таб;
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = "//{{ЗАПРОС(Сформировать)
|Период с НачДата по КонДата;
|ВидТоплива = Регистр.ПокупателиКолво.ВидыТоплива;
|Вес = Регистр.ПокупателиКолво.Кг;
|Покуп = Регистр.ПокупателиКолво.Покупатели;
|Док = Регистр.ПокупателиКолво.ТекущийДокумент;
|Ном = Регистр.ПокупателиКолво.НомерСтроки;
|Группировка ВидТоплива; //по измерению Регистра
|Группировка Док; // по документам, двигавшим Регистр
|Группировка Ном; //по номерам строк документов
|Функция ВсегоКолво = КонОст(Вес);
|Функция ПриходКолво = Приход(Вес);
|Условие(Покуп = ВыбПокупатель);
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
// Заполнение выходных форм данными Запроса
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица1");
Таб.ВывестиСекцию("Шапка");
Пока Запрос.Группировка(1) = 1 Цикл
// Отображаем значение измерения — ВидТоплива
Таб.ВывестиСекцию("ВидТоплива");
// запускаем вложенную группировку по документам,
// которые производили движения Регистра
Пока Запрос.Группировка(2) = 1 Цикл
Док1 = Запрос.Док;
// отфильтруем нужные нам документы
Если НЕ(Док1.Вид() = "Продажа") Тогда
Продолжить;
КонецЕсли;
// запускаем вложенную группировку по строкам
// документа, связанным с движениями регистра
Пока Запрос.Группировка(3) = 1 Цикл
// Получаем в документе строку по найденному номеру
Док1.ПолучитьСтрокуПоНомеру(Запрос.Ном);
Таб.ВывестиСекцию("Строка");
КонецЦикла;
КонецЦикла;
КонецЦикла;
// Вывод заполненной формы
Таб.Опции(О, О, 0, 0);
Таб.ТолькоПросмотр(1);
Таб.Показать("", "");
КонецПроцедуры