Как добавить вычисляемое поле в группировки Универсального отчета на Построителе отчета в 1С

Программист 1С v8.3 (Обычные формы) 1С:Комплексная автоматизация Управленческий учет Торговля и дистрибуция
← На главную

В процессе сопровождения и доработки старых типовых конфигураций 1С (таких как «Комплексная автоматизация 1.1», «Управление производственным предприятием 1.3» или «Управление торговлей 10.3») программисты часто сталкиваются с механизмами построения отчетов предыдущего поколения. Одним из таких механизмов является Универсальный отчет, функционирующий на базе объекта ПостроительОтчета.

При попытке модифицировать такие отчеты стандартными методами (например, простым добавлением нового поля в текст SQL-запроса макета) разработчики часто сталкиваются с проблемой: новое поле успешно рассчитывается в запросе, но его невозможно выбрать в настройках отчета — оно попросту отсутствует в списке доступных группировок строк или колонок. Ниже мы подробно разберем, почему возникает эта сложность и как правильно решить её программным путем.

Выясняем причину: почему поле не появляется в настройках

Рассмотрим стандартную ситуацию. Разработчик открывает макет запроса типового отчета (например, «Ведомость по товарам на складах») и добавляет в него вычисляемую конструкцию ВЫБОР КОГДА...:


ВЫБОР
    КОГДА ТоварыНаСкладахОстаткиИОбороты.ТоварВПути
        ТОГДА &МестонахождениеТоваровВПути
    ИНАЧЕ &МестонахождениеТоваровНаСкладе
КОНЕЦ КАК Местонахождение

Параметры успешно передаются в модуле отчета через свойства построителя. Однако в интерфейсе пользователя на форме настройки отчета поле Местонахождение не появляется. Попытка принудительно добавить поле в группировки через код:

УниверсальныйОтчет.ДобавитьИзмерениеСтроки("Местонахождение");

вызывает системное исключение. Проанализируем ситуацию. Объект УниверсальныйОтчет является надстройкой над стандартным построителем. При инициализации он жестко контролирует состав доступных полей, опираясь на внутренние коллекции метаданных и свои предопределенные структуры. Поскольку наше новое поле Местонахождение не было должным образом зарегистрировано в самом объекте универсального отчета, система блокирует попытку его использования, считая его некорректным.

Решение 1: Программная регистрация поля группировки (Рекомендуемый способ)

Наиболее красивым, лаконичным и правильным решением является использование штатного метода универсального отчета ДобавитьПолеГруппировка. Этот метод берет на себя всю работу по интеграции поля в структуру построителя и автоматическому добавлению вычислений в текст запроса.

Перейдем в модуль отчета (обычно это процедура УстановитьНачальныеНастройки) и пропишем следующий код:


УниверсальныйОтчет.ДобавитьПолеГруппировка(
    "Местонахождение",
    "ТоварВПути",
    "Местонахождение",
    "Местонахождение",
    ,
    "ВЫБОР КОГДА ТоварВПути ТОГДА &МестонахождениеТоваровВПути ИНАЧЕ &МестонахождениеТоваровНаСкладе КОНЕЦ"
);

Разберем по шагам назначение ключевых параметров этого метода:

  1. Имя поля ("Местонахождение") — уникальный внутренний идентификатор нового поля в рамках отчета.
  2. Имя родительского поля ("ТоварВПути") — поле, к которому логически привязывается новая группировка для построения иерархии в настройках.
  3. Путь к данным ("Местонахождение") — имя, под которым поле будет фигурировать во внутренних структурах Построителя отчета.
  4. Представление ("Местонахождение") — понятный синоним поля, который пользователь увидит на вкладках настроек отчета.
  5. Тип размещения (в нашем примере пропущен) — определяет способ визуального отображения поля.
  6. Текст выражения (SQL-выражение "ВЫБОР КОГДА...") — это важнейший параметр. Передавая сюда выражение, мы избавляем себя от необходимости вручную дописывать этот кусок кода в текст запроса макета. Универсальный отчет самостоятельно внедрит это выражение в итоговый текст запроса при генерации отчета.

Решение 2: Настройка секций построителя в самом запросе

Если по каким-то причинам вы не хотите передавать SQL-выражение строкой в коде 1С, вы можете объявить вычисляемое поле непосредственно в тексте запроса макета. Но для того чтобы Построитель отчета "увидел" его, необходимо задействовать расширение языка запросов для построителя (использование фигурных скобок {}).

Рассмотрим подробнее, как должен выглядеть фрагмент запроса в таком случае:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ТоварыНаСкладахОстаткиИОбороты.Склад КАК Склад,
    ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
    ВЫБОР
        КОГДА ТоварыНаСкладахОстаткиИОбороты.ТоварВПути
            ТОГДА &МестонахождениеТоваровВПути
        ИНАЧЕ &МестонахождениеТоваровНаСкладе
    КОНЕЦ КАК Местонахождение
    
    // Секция описания доступных полей для выбора построителем
    {ВЫБРАТЬ
        Местонахождение КАК Местонахождение}
ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , Авто, , ) КАК ТоварыНаСкладахОстаткиИОбороты
    
    // Секция описания доступных отборов для построителя
    {ГДЕ
        (ВЫБОР
            КОГДА ТоварыНаСкладахОстаткиИОбороты.ТоварВПути
                ТОГДА &МестонахождениеТоваровВПути
            ИНАЧЕ &МестонахождениеТоваровНаСкладе
        КОНЕЦ) КАК Местонахождение}

Чтобы не прописывать фигурные скобки вручную, вы можете воспользоваться встроенным в 1С Конструктором запросов:

  1. Откройте текст запроса в Конструкторе запросов.
  2. Перейдите на самую последнюю вкладку, которая называется «Построитель».
  3. Нажмите на подвкладку «Поля» и добавьте ваше новое вычисляемое поле Местонахождение в список разрешенных полей.
  4. При необходимости перейдите на подвкладку «Условия» и добавьте это же поле туда, чтобы пользователь мог накладывать на него быстрые отборы.

Важный нюанс: Кэширование настроек пользователя

Выясним причину одной из самых частых проблем, возникающих при тестировании подобных доработок. Вы написали верный код, зарегистрировали поле через УниверсальныйОтчет.ДобавитьПолеГруппировка(), но при запуске отчета в режиме «1С:Предприятие» поле все равно не появилось в списке группировок.

Причина кроется в механизме кэширования настроек. Платформа 1С сохраняет последние пользовательские настройки отчета (состав колонок, отборов и группировок) в системном хранилище настроек или в специальном справочнике. При повторном открытии отчета старая структура настроек восстанавливается из кэша поверх ваших новых изменений в коде.

Чтобы применить изменения структуры данных и увидеть новое поле, выполните следующие действия:

  1. Откройте отчет в пользовательском режиме.
  2. Перейдите в форму настроек отчета.
  3. Нажмите кнопку «Восстановить стандартные настройки» (или выберите соответствующий пункт в меню настроек). Это заставит отчет полностью сбросить кэш настроек и инициализировать структуру полей заново, используя ваш обновленный программный код.

Как вывести новое поле в детальные записи (дополнительные поля)

Иногда новое вычисляемое поле требуется не для группировки строк, а просто для вывода в качестве справочной информации в отдельной колонке (например, рядом с номенклатурой). Для решения этой задачи в модуле отчета следует использовать другой метод:

УниверсальныйОтчет.ДобавитьДополнительноеПоле("Местонахождение");

После вызова этого метода поле появится на вкладке «Дополнительные поля» в настройках универсального отчета, и пользователь сможет самостоятельно включить его отображение в результирующей таблице.

← На главную