При разработке или добавлении новых отчетов в конфигурации, использующие Библиотеку стандартных подсистем (БСП), программисты часто сталкиваются с ситуацией, когда при попытке сохранить измененный вариант отчета система выдает критическую ошибку: «Поле объекта не обнаружено (КонтекстВарианта)». Эта проблема кажется загадочной, так как она возникает в типовом коде БСП, который обычно не подлежит изменению. В данной статье мы детально разберем природу этого сбоя и выясним, какие настройки необходимо выполнить, чтобы отчет корректно взаимодействовал с механизмами 1С.
Давайте проанализируем ситуацию. Ошибка происходит в форме СохранениеВариантаОтчета, которая входит в состав подсистемы «Варианты отчетов» БСП. Программный код пытается обратиться к владельцу формы (то есть к форме самого отчета) и прочитать значение реквизита КонтекстВарианта. Рассмотрим строку кода, вызывающую исключение:
ЭтоКонтекстныйВариантОтчета = ЗначениеЗаполнено(ВладелецФормы.КонтекстВарианта)
Проблема заключается в том, что если в свойствах объекта Отчет не указана Основная форма отчета, платформа 1С генерирует форму автоматически «на лету». Такая автоматически созданная форма является «пустой» с точки зрения БСП: в ней нет необходимых реквизитов, программных обработчиков и интерфейсных элементов, которые ожидает подсистема вариантов отчетов. Поскольку в генерируемой платформой форме отсутствует реквизит КонтекстВарианта, выполнение программного кода прерывается с ошибкой.
Самый правильный и надежный способ решения проблемы — это следование методике разработки на БСП. Для того чтобы механизмы сохранения вариантов работали штатно, необходимо явно указать форму отчета в метаданных. Разберем этот процесс по шагам:
ОбщаяФорма.ФормаОтчета.После этого, когда пользователь откроет отчет, платформа будет использовать не «самоделку», а полнофункциональную форму БСП. В этой форме уже определен реквизит КонтекстВарианта, а также реализована вся необходимая логика для работы с хранилищем настроек, рассылками отчетов и пользовательскими фильтрами.
Рассмотрим ситуацию, когда нам по каким-то причинам необходимо использовать собственную, уникальную форму отчета, а не общую форму БСП. В этом случае мы должны вручную обеспечить совместимость нашей формы с программным интерфейсом библиотеки. Для этого выполним следующие действия:
КонтекстВарианта.Строка или Произвольный.ПриСозданииНаСервере, ПередЗагрузкойВариантаНаСервере и других, согласно документации к вашей версии библиотеки.Таким образом, когда форма сохранения варианта обратится к ВладелецФормы.КонтекстВарианта, она успешно найдет это поле, и ошибка исчезнет.
Даже после назначения правильной формы ошибка может сохраняться, если подсистема «Варианты отчетов» не знает о существовании вашего нового объекта. Выясним, что нужно сделать для полноценной регистрации отчета в системе:
Во-первых, отчет обязательно должен быть включен хотя бы в одну Подсистему, которая отображается в интерфейсе (командном интерфейсе). Если отчет не привязан к подсистемам, механизмы БСП могут игнорировать его при формировании дерева вариантов.
Во-вторых, необходимо обновить справочник Идентификаторы объектов метаданных. В БСП работа со многими объектами идет не напрямую через метаданные, а через этот справочник. Для обновления запустите информационную базу под пользователем с полными правами с параметром командной строки:
/С ЗапуститьОбновлениеИнформационнойБазы
Или воспользуйтесь типовой обработкой «Обновление вспомогательных данных» в составе БСП.
Для того чтобы отчет полностью поддерживал функционал вариантов (включая предопределенные варианты и настройки доступа), рекомендуется добавить в модуль менеджера отчета процедуру настройки. Проанализируем пример кода:
Процедура ПриОпределенииНастроекВариантовОтчетов(Настройки) Экспорт
Настройки.Размещение.Вставить(Метаданные.Подсистемы.Продажи);
Настройки.ВыводитьВ ПанелиОтчетов = Истина;
КонецПроцедуры
Эта процедура позволяет системе автоматически подхватить настройки отчета при первом запуске или обновлении конфигурации. Если в вашей конфигурации используется подсистема «Варианты отчетов», наличие этой процедуры является признаком хорошего тона и гарантией стабильной работы.
Рассмотрим подробнее назначение этого реквизита, чтобы понимать логику работы программы. КонтекстВарианта используется для так называемых контекстных отчетов. Это отчеты, которые открываются из форм справочников или документов и автоматически фильтруются по текущему объекту (например, «Отчет по взаиморасчетам», открытый из карточки конкретного контрагента).
В обычном отчете этот реквизит пуст, но форма сохранения настроек всегда проверяет его наличие, чтобы решить: сохранять ли данный вариант как «общий» или как «привязанный к контексту». Именно поэтому отсутствие этого поля в самописных или автогенерируемых формах приводит к фатальному завершению работы кода ХранилищеВариантовОтчетов.
Подводя итог, можно сказать, что ошибка «Поле объекта не обнаружено (КонтекстВарианта)» — это сигнал о том, что отчет не полностью интегрирован в экосистему БСП. Для устранения проблемы:
ОбщаяФорма.ФормаОтчета в качестве основной формы для новых отчетов.ХранилищеВариантовОтчетов.Соблюдение этих несложных правил позволит избежать трудностей при разработке и обеспечит пользователям стабильную работу с мощным функционалом вариантов отчетов 1С.