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