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