В процессе работы с типовыми и специализированными конфигурациями 1С на базе обычных форм (такими как УПП 1.3 или УТ 10.3) часто возникает задача автоматизации вывода данных. Одной из самых популярных потребностей является автоматическое добавление реквизитов (например, артикула) в группировки отчетов, построенных на механизме Универсального отчета. Вместо того чтобы заставлять пользователя каждый раз заходить в расширенные настройки и добавлять поля вручную, мы можем зафиксировать эти параметры непосредственно в программном коде.
Разберем подробно, как это реализовать, проанализируем структуру методов и выясним технические нюансы работы с объектом УниверсальныйОтчет.
Для модификации поведения отчета нам необходимо найти место, где инициализируются его параметры. В большинстве конфигураций, использующих механизм "Универсальный отчет" на базе ПостроителяОтчета, основной логический блок сосредоточен в модуле объекта самого отчета. Нас интересует экспортная процедура УстановитьНачальныеНастройки.
Проанализируем типовую структуру этой процедуры. Обычно в ней происходит инициализация метаданных, установка заголовка и первичных фильтров. Именно здесь следует размещать команды для добавления дополнительных полей вывода.
Для того чтобы артикул выводился вместе с номенклатурой, воспользуемся методом ДобавитьДополнительноеПоле. Рассмотрим пример кода, который позволяет вывести артикул в одной колонке с наименованием номенклатуры:
// Процедура установки начальных настроек отчета
Процедура УстановитьНачальныеНастройки(ДополнительныеПараметры = Неопределено) Экспорт
// Инициализация стандартных настроек
УниверсальныйОтчет.УстановитьНачальныеНастройки(Истина);
// Добавление дополнительного поля "Артикул"
// Синтаксис: ДобавитьДополнительноеПоле(<ПутьКДанным>, <Размещение>, <Тип>)
УниверсальныйОтчет.ДобавитьДополнительноеПоле("Номенклатура.Артикул", , 1);
КонецПроцедуры
Разберем параметры метода ДобавитьДополнительноеПоле подробнее, чтобы понимать, как управлять внешним видом отчета:
"Номенклатура.Артикул". Построитель отчета автоматически выполнит соединение с таблицей справочника номенклатуры.0, поле будет выведено в отдельной колонке. Значение 1 (как в нашем примере) заставляет систему выводить артикул в той же колонке, где находится основное измерение.Часто добавления поля недостаточно — требуется, чтобы данные сразу выстраивались в определенном порядке (например, по возрастанию артикула). Для этого используем метод ДобавитьПорядок. Посмотрим, как дополнить нашу процедуру:
УниверсальныйОтчет.ДобавитьДополнительноеПоле("Номенклатура.Артикул", , 1);
// Установка сортировки по артикулу номенклатуры
УниверсальныйОтчет.ДобавитьПорядок("Номенклатура.Артикул");
Важно: Метод ДобавитьПорядок следует вызывать после того, как поле стало доступным в схеме отчета. Если поле не включено в состав доступных полей запроса, сортировка может не примениться или вызвать ошибку выполнения.
При внесении изменений в код УстановитьНачальныеНастройки программисты часто сталкиваются с тем, что у пользователей отчет продолжает открываться по-старому. Это происходит из-за механизма сохранения настроек. Система 1С запоминает последний вариант отчета, который использовал человек, и при повторном открытии восстанавливает его из кэша, игнорируя новые программные установки.
Чтобы принудительно применить новые настройки для всех, обратите внимание на параметр метода УстановитьНачальныеНастройки(Истина). Флаг Истина указывает системе, что текущие настройки должны быть перезаписаны программными значениями по умолчанию. Однако помните, что это сбросит и пользовательские фильтры, если они были установлены ранее.
Универсальный отчет в 1С 8.x примечателен тем, что позволяет обращаться не только к жестко заданным реквизитам справочников, но и к дополнительным сведениям (характеристикам). Если "Артикул" в вашей базе реализован как дополнительное свойство, обращение к нему в коде будет выглядеть иначе, часто через квадратные скобки или специализированные функции получения свойств, встроенные в механизм УниверсальногоОтчета.
Однако для стандартного реквизита Артикул подход через "точку" от основного измерения является оптимальным. Это минимизирует нагрузку на базу данных, так как ПостроительОтчета добавит простой LEFT JOIN в итоговый SQL-запрос.
Проанализируем ситуацию: стоит ли добавлять слишком много дополнительных полей таким способом? Каждое обращение "через точку" заставляет систему подтягивать дополнительные таблицы. Если вы добавите, например, Номенклатура.ОсновнойПоставщик.ОсновнойДоговор.ВалютаРасчетов, это приведет к цепочке соединений. Для простых реквизитов вроде Артикул или Код влияние на скорость формирования отчета практически нулевое, что делает данный метод идеальным для повседневных задач доработки интерфейса под нужды бизнеса.
Таким образом, используя всего две команды — ДобавитьДополнительноеПоле и ДобавитьПорядок — мы можем существенно повысить удобство работы пользователей, избавляя их от рутинной настройки отчетов вручную.