При разработке и доработке отчетов на базе системы компоновки данных (СКД) разработчики нередко сталкиваются с ситуацией: в схему компоновки добавлен новый реквизит, поле включено в выбранные поля варианта отчета, однако при формировании в режиме «1С:Предприятие» колонка упорно не выводится. При этом переименование отчета временно решает проблему, но любая последующая правка структуры снова приводит к зависанию старого состава полей.
Разберем детально механизм возникновения этой проблемы и рассмотрим все способы ее решения — от быстрых действий в интерфейсе пользователя до тонкой программной настройки и очистки служебных хранилищ платформы.
Выясним причину, почему платформа игнорирует внесенные в конфигураторе изменения. Сама схема компоновки данных содержит текст запроса, описание доступных полей и настройки варианта по умолчанию. Когда пользователь впервые открывает отчет на управляемых формах, платформа или подсистемы БСП считывают эти настройки и сохраняют их в служебных хранилищах настроек конкретного пользователя.
В дальнейшем при каждом открытии отчета происходит восстановление сохраненного состояния объекта КомпоновщикНастроек. Если пользователь хотя бы раз менял ширину колонок, состав полей, отборы или просто сохранял вариант, платформа загружает из хранилища именно старый сохраненный состав выбранных полей. Сам текст запроса исполняется заново, но новое поле просто не попадает в сгенерированный макет компоновки, так как в сохраненных настройках пользователя его нет.
Рассмотрим самое простое действие, которое помогает вернуть настройки варианта к состоянию, заложенному разработчиком в схеме компоновки данных:
Данная команда перезаписывает текущие пользовательские настройки отчета настройками по умолчанию из схемы компоновки. Если поле было корректно добавлено в выбранные поля схемы, оно сразу отобразится в отчете.
Проанализируем структуру отчета на вкладке «Настройки» в конфигураторе. Нередко новое поле добавляется в список выбранных полей на уровне всего отчета, но отчет содержит сложную иерархию группировок или таблицу.
Выполним следующую проверку:
Разберем две неочевидные ошибки в конфигураторе, из-за которых поле блокируется на уровне генератора макета:
Если сброс настроек в интерфейсе по каким-то причинам недоступен или не срабатывает, можно заставить платформу принудительно инициализировать отчет как абсолютно новый. Для этого не обязательно переименовывать сам объект метаданных.
Посмотрим на последовательность действий:
Основной на Основной1.Если отчет находится в активной фазе доработки или часто меняется структура запроса, постоянный сброс настроек вручную отнимает много времени. Чтобы форма всегда отображала структуру схемы из конфигуратора, добавим программную инициализацию.
Откроем модуль управляемой формы отчета и в процедуре ПриСозданииНаСервере выполним принудительную загрузку настроек схемы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Принудительно загружаем настройки по умолчанию из схемы
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Отчет.СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
КонецПроцедуры
Такой подход гарантирует, что форма проигнорирует сохраненные ранее настройки пользователя и применит актуальное состояние схемы компоновки данных.
В конфигурациях, использующих Библиотеку стандартных подсистем (например, «1С:Управление торговлей», «1С:ERP», «1С:Комплексная автоматизация»), настройки отчетов регистрируются в справочнике ВариантыОтчетов и соответствующих регистрах сведений. Если отчет встроен в конфигурацию, при изменении полей СКД типовые механизмы БСП могут продолжать использовать старое описание полей из кэша справочника.
Для принудительного обновления описания отчетов в БСП выполним одно из действий:
/C ЗапуститьОбновлениеИнформационнойБазы.
ВариантыОтчетов.Обновить();
Если форма отчета использует ХранилищеПользовательскихНастроекОтчетов, ХранилищеСистемныхНастроек или ХранилищеОбщихНастроек, можно программно удалить сохраненные данные конкретного отчета:
ХранилищеПользовательскихНастроекОтчетов.Удалить("Отчет.НашОтчет", Неопределено, ИмяПользователя());
ХранилищеСистемныхНастроек.Удалить("Отчет.НашОтчет", Неопределено, ИмяПользователя());
Также не стоит забывать про локальный кэш тонкого клиента 1С. При интенсивной разработке внешних отчетов временные файлы форм могут кэшироваться в каталогах пользователя %LOCALAPPDATA%\1C\1cv8 и %APPDATA%\1C\1cv8. В случае нестандартного поведения отчета удаление файлов из этих папок позволяет исключить влияние устаревшего локального кэша.