В процессе эксплуатации и регулярного обновления информационных баз 1С:Предприятие часто возникает неприятная ситуация: разработчики удаляют из метаданных какой-либо объект (например, документ или справочник), но ссылки на него остаются в ранее сохраненных настройках пользователей. При попытке открыть стандартный отчет или обработку система пытается инициализировать этот объект, спотыкается о «битую» ссылку (объект типа НеизвестныйОбъект) и завершает работу с ошибкой. Ситуация усложняется, если конфигурация находится на поддержке без возможности изменений, а у администратора нет прямого доступа к конфигуратору. Для исправления таких повреждённых связей можно использовать инструмент для поиска и восстановления битых ссылок.
В этой статье мы подробно разберем, как устроена система хранения настроек в платформе 1С 8.3, изучим оригинальный обходной маневр для закрытых баз и рассмотрим штатные административные инструменты для очистки и переноса настроек между базами данных.
Прежде чем приступать к решению проблемы, давайте разберемся с архитектурой хранения параметров. Многие ошибочно полагают, что все настройки пользователя лежат в локальном кэше на компьютере (в папке AppData) или в специализированных регистрах сведений (таких как Сохраненные настройки). Это верно лишь частично и в основном для старых конфигураций на обычных формах.
В современных конфигурациях на управляемых формах (особенно разработанных на базе БСП — Библиотеки стандартных подсистем) настройки сохраняются непосредственно внутри самой базы данных в специальных системных таблицах. Платформа оперирует механизмами под общим названием Хранилища настроек. Рассмотрим ключевые из них:
ХранилищеНастроекДанныхФорм — здесь хранятся состояния полей, списков документов, отборов и флажков управляемых форм стандартных обработок и отчетов.ХранилищеПользовательскихНастроекОтчетов — отвечает за персональные пользовательские отборы, группировки и условное оформление отчетов.ХранилищеВариантовОтчетов — сохраняет новые пользовательские варианты отчетов, созданные на основе стандартных схем компоновки данных (СКД).СистемноеХранилищеНастроек — хранит размеры окон, положение панелей, настройки печати, историю выбора и избранное.Именно поэтому стандартная очистка локального кэша пользователя силами системного администратора не дает никаких результатов при возникновении ошибок инициализации форм. Проблемные настройки со ссылками на удаленные объекты конфигурации лежат внутри базы данных. Для их обнаружения и безопасного удаления во всех таблицах ИБ подойдёт универсальный комплекс для диагностики и очистки битых ссылок.
Проанализируем ситуацию, когда конфигурация закрыта для изменений (находится на полной поддержке без возможности редактирования), а у вас нет доступа к интерактивным инструментам очистки настроек. В этом случае мы можем использовать изящный обходной путь.
Идея заключается в том, чтобы «открепить» обработку от конфигурации, временно подменить ее контекст выполнения и заставить платформу обнулить кэшированные настройки для текущего пользователя. Выполним этот процесс по шагам:
.epf (или .erf для отчетов) через внешнюю обработку в режиме конфигуратора (даже в закрытой конфигурации вы можете открывать и редактировать внешние файлы).ПриСозданииНаСервере или ПередЗагрузкойДанныхФормыВНастройкиСохранения).Если вы работаете в современной типовой конфигурации (например, 1С:Бухгалтерия 3.0 или 1С:Управление торговлей 11) и у вас есть права администратора, вам не потребуется прибегать к техническим ухищрениям. В составе Библиотеки стандартных подсистем уже присутствует удобный визуальный интерфейс для управления настройками.
Рассмотрим детально, как выполнить очистку точечно:
Рассмотрим вторую практическую задачу: пользователь детально настроил сложную обработку (например, установил сложные отборы по подразделениям для каждого документа в обработке «Перенос данных в идентичную конфигурацию»), и теперь эти настройки необходимо перенести в другую аналогичную базу данных.
Методология переноса зависит от типа объекта.
А. Перенос для отчетов на базе СКД
Для отчетов в платформе предусмотрен штатный механизм выгрузки структуры настроек в XML-файл. Выполним следующие действия:
Б. Перенос настроек для обычных обработок
Поскольку обычные обработки не используют схему компоновки данных (СКД), стандартной кнопки экспорта параметров в файл у них нет. Но мы можем решить эту задачу двумя путями:
Вариант 1 (В рамках одной базы): Если настройки нужно передать от одного коллеги другому внутри одной базы данных, используем стандартный инструмент: Администрирование — Настройки пользователей и прав — Копирование настроек. Выбираем донора, отмечаем нужную обработку и копируем настройки получателям.
Вариант 2 (Программный перенос через консоль кода): Если базы абсолютно разные, мы можем прибегнуть к программному чтению и записи данных напрямую в системное хранилище. Для этого воспользуемся обработкой «Групповое изменение реквизитов» (с возможностью выполнения произвольного кода) или внешней консолью разработчика.
Рассмотрим пример кода для выгрузки и последующей загрузки параметров формы:
// Шаг 1: Экспорт настройки в исходной базе данных
ИмяОбработки = "Обработка.ПереносДанныхВИдентичнуюКонфигурацию";
ИмяФормы = "Форма";
ИмяНастройки = "НастройкиОтбораПоПодразделениям"; // Имя сохраненного ключа
ИмяПользователя = "Администратор";
// Получаем структуру данных из системного хранилища формы
Настройка = ХранилищеНастроекДанныхФорм.Загрузить(ИмяОбработки + "/" + ИмяФормы, ИмяНастройки, , ИмяПользователя);
// Сериализуем объект настройки в XML-строку для переноса
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Настройка);
СтрокаXMLДанных = ЗаписьXML.Закрыть();
// Эту строку XML переносите в целевую базу данных
// Шаг 2: Импорт настройки в целевой базе данных
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаXMLДанных);
ВосстановленнаяНастройка = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
// Записываем структуру обратно в системную таблицу целевой базы
ХранилищеНастроекДанныхФорм.Сохранить(ИмяОбработки + "/" + ИмяФормы, ИмяНастройки, ВосстановленнаяНастройка, , ИмяПользователя);
Используя эти методы, мы сможем гибко управлять пользовательским окружением, оперативно устранять последствия некорректных обновлений метаданных и тиражировать сложные рабочие настройки между информационными базами без лишних трудозатрат.