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