v8: Использование регистратора в запросах Ключевые слова: Регистратор, запрос, периодичность
Регистратор - это документ, сделавший движение по регистру накопления или регистру сведений с режимом записи "Подчинение регистратору".
Отклонясь от темы, замечу, что есть один нюанс.
Движения могут быть сделаны в любом программном модуле, а не обязательно в обработке проведения документа.
То есть, можно написать, к примеру, обработку, которая будет создавать движения по регистру накопления и в качестве регистратора указывать какой-либо документ, для которого в конфигураторе выбрана возможность быть регистратором движений по этому регистру.
ПриходнаяНакладная = Документы.ПриходнаяНакладная.СоздатьДокумент();
ПриходнаяНакладная.Записать();
Товар = Справочники.Товары.СоздатьЭлемент();
Товар.Записать();
НаборЗаписей = РегистрыНакопления.Товары.СоздатьНаборЗаписей();
НоваяЗапись = НаборЗаписей.ДобавитьПриход();
НоваяЗапись.Период = РабочаяДата;
НоваяЗапись.Регистратор = ПриходнаяНакладная.Ссылка;
НоваяЗапись.Товар = Товар.Ссылка;
НоваяЗапись.Количество = 1;
НаборЗаписей.Записать();
Теперь вернемся к теме статье.
Регистратор не является ни измерением, ни ресурсом, по сути это служебный реквизит, уточняющий, то есть дополняющий другой служебный реквизит, период.
Это накладывает особенности на использование этого поля в запросах.
Первой особенностью является то, что в виртуальных таблицах регистров накопления "Остатки и обороты" это поле недоступно до тех пор, пока в параметре виртуальной таблицы "Периодичность" не будет выбрано одно из значений: "Запись", "Регистратор" или "Авто".
Последнее значение можно выбрать только в 1С версии 8.1.
Второй особенностью является то, что, если вы используете построитель отчета и указали параметр виртуальной таблицы "Периодичность", то в отборе построителя появится новый элемент отбора, по периодичности.
Не пугайтесь и не удивляйтесь, так и должно быть.
И, наконец, последней особенностью является то, что регистратор нельзя использовать в запросе в разделе ИТОГИ без предварительно идущего периода.
То есть, если, к примеру, в запросе хочется сделать группировку по регистратору, то требуется сделать группировку по периоду, а только уже после нее группировку по регистратору.
В противном случае не гарантируется правильность расчета итоговых значений.
То есть, вместо
ВЫБРАТЬ
ТоварыОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
ТоварыОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход,
ТоварыОстаткиИОбороты.КоличествоРасход КАК КоличествоРасход,
ТоварыОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток
ИЗ
РегистрНакопления.Товары.ОстаткиИОбороты(, , Регистратор, , ) КАК ТоварыОстаткиИОбороты
ИТОГИ
СУММА(КоличествоНачальныйОстаток),
СУММА(КоличествоПриход),
СУММА(КоличествоРасход),
СУММА(КоличествоКонечныйОстаток)
ПО
ТоварыОстаткиИОбороты.Товар,
ТоварыОстаткиИОбороты.Регистратор
будет корректно написать
ВЫБРАТЬ
ТоварыОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
ТоварыОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход,
ТоварыОстаткиИОбороты.КоличествоРасход КАК КоличествоРасход,
ТоварыОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток
ИЗ
РегистрНакопления.Товары.ОстаткиИОбороты(, , Регистратор, , ) КАК ТоварыОстаткиИОбороты
ИТОГИ
СУММА(КоличествоНачальныйОстаток),
СУММА(КоличествоПриход),
СУММА(КоличествоРасход),
СУММА(КоличествоКонечныйОстаток)
ПО
ТоварыОстаткиИОбороты.Товар,
ТоварыОстаткиИОбороты.Период,
ТоварыОстаткиИОбороты.Регистратор
И напоследок совет, как при использовании построителя отчета сделать перед группировкой по регистратору предварительную группировку по периоду, но не выводить ее в таблицу.
Нужно прочитать автоматически сгенерированный макет построителя в переменную, добавить измерение период перед измерением регистратор, загрузить макет из переменной обратно в построитель, после чего можно смело выполнять и выводить результат построителя.
Программный код всей этой цепочки действий не укладывается в рамки этой статьи, поэтому будет рассмотрен отдельно, в другой статье. |