Работа с Универсальным отчетом в конфигурации 1С:УПП 1.3 часто вызывает вопросы, особенно когда требуется вывести нестандартные показатели, такие как количество дней в периоде или расчетные коэффициенты. Рассмотрим пошагово, как решить эти задачи и избежать типичных ошибок при работе с запросами.
При использовании Универсального отчета важно помнить, что он работает на основе Построителя отчета. Когда мы пытаемся использовать стандартные параметры &ДатаНач и &ДатаКон, мы часто сталкиваемся с тем, что поле остается пустым. Это происходит из-за того, что механизм Универсального отчета автоматически подставляет значения в параметры с определенными именами, которые ожидаются системой.
Чтобы функция РАЗНОСТЬДАТ заработала корректно, используйте следующие имена параметров: &ДатаНачала и &ДатаКонца. Давайте посмотрим на пример правильного оформления текста запроса:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстатки,
ПродажиОбороты.Номенклатура,
ПродажиОбороты.КоличествоОборот КАК Количество,
РАЗНОСТЬДАТ(&ДатаНачала, &ДатаКонца, ДЕНЬ) КАК ДнейПродажи
{ВЫБРАТЬ
КоличествоОстатки,
Количество,
Номенклатура.*,
ДнейПродажи}
ИЗ
РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаКонца, , ) КАК ПродажиОбороты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
ПО ПродажиОбороты.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
После внесения правок обязательно добавьте поле ДнейПродажи в список выбираемых полей настроек Универсального отчета, чтобы оно стало доступно для вывода.
Часто возникает необходимость добавить специфический расчет, например, СрокЗапаса. Поскольку Универсальный отчет позволяет гибко настраивать показатели, вы можете передать дополнительные параметры напрямую из модуля объекта. Рассмотрим, как это сделать:
&СрокЗапаса. Формула в запросе будет выглядеть так: КоличествоОстаток / ДнейПродажи * &СрокЗапаса.СформироватьОтчет и добавьте передачу параметра:
Процедура СформироватьОтчет(ТабличныйДокумент) Экспорт
// Перед формированием отчета устанавливаем необходимые параметры
УниверсальныйОтчет.ПостроительОтчета.Параметры.Вставить("СрокЗапаса", ЗначениеСрока);
// Вызываем стандартную процедуру формирования
УниверсальныйОтчет.СформироватьОтчет(ТабличныйДокумент);
КонецПроцедуры
При попытке вывести данные из Оборотов и Остатков одного регистра, вы можете столкнуться с «раздуванием» цифр. Это происходит из-за декартового произведения: если за период было несколько движений, система для каждой строки оборотов подтягивает одну и ту же запись остатка, тем самым умножая его на количество документов-регистраторов.
Чтобы исправить эту ситуацию, разберем следующие подходы:
СКД или Построителя отчета для агрегации данных.Период, заданы корректно. Если вы фильтруете остатки по регистратору, помните, что это ограничит остаток данными только по этому документу, что почти всегда приводит к неверному результату.Используйте консоль запросов для тестирования каждого этапа соединения таблиц. Если вы видите, что количество строк в результате запроса превышает количество номенклатурных позиций, значит, условие соединения ПО является недостаточно строгим или виртуальные таблицы возвращают избыточные данные.