В процессе сопровождения и разработки систем на платформе 1С:Предприятие часто возникает ситуация, когда пользователь или аналитик выполняет детальную настройку формы документа, справочника или динамического списка на тестовой копии базы данных. После успешного тестирования встает задача перенести эти настройки в рабочую информационную базу. Повторять все действия вручную долго и неэффективно, особенно если конфигурация форм сложная и включает в себя множество пользовательских реквизитов, группировок и элементов условного оформления.
В этой статье мы подробно разберем, где именно платформа 1С хранит настройки интерфейса, как работает механизм копирования настроек внутри одной базы и как реализовать надежный перенос этих данных между двумя независимыми (но идентичными по конфигурации) информационными базами.
Для начала проанализируем архитектуру платформы в части хранения персональных настроек. Все изменения, которые пользователь вносит в интерфейс через меню «Изменить форму» или настройки динамических списков, сохраняются не в файлах конфигурации, а непосредственно в таблицах базы данных (СУБД). Доступ к этим данным на программном уровне предоставляется через специализированные системные хранилища настроек платформы:
ХранилищеНастроекДанныхФорм — основной системный объект, отвечающий за хранение персональных настроек внешнего вида форм (видимость элементов, их взаимное расположение, ширина колонок, добавленные пользователем реквизиты).ХранилищеПользовательскихНастроекДинамическихСписков — хранит структуру пользовательских настроек для списков (установленные отборы, сортировки, группировки и правила условного оформления).ХранилищеСистемныхНастроек — используется для хранения общих параметров интерфейса, таких как размеры и положение открываемых окон.ХранилищеОбщихНастроек — применяется для хранения общих настроек, не привязанных жестко к конкретным формам.Каждая запись в этих хранилищах однозначно идентифицируется комбинацией ключа объекта (например, имя формы), ключа настройки и имени конкретного пользователя информационной базы.
Прежде чем переходить к переносу между базами, рассмотрим ситуацию, когда настройки уже находятся в целевой базе, но их нужно быстро растиражировать по другим пользователям. В конфигурациях, использующих Библиотеку стандартных подсистем (БСП) — таких как ERP, УТ, КА, УНФ или Бухгалтерия предприятия, — предусмотрен готовый интерактивный инструмент.
Разберем по шагам, как им воспользоваться:
Этот способ незаменим внутри одной базы. Однако он не позволяет напрямую выгрузить настройки во внешний файл для импорта в другую базу данных. Для решения этой проблемы нам потребуется программный код или внешняя обработка.
Выясним, как написать собственный скрипт или внешнюю обработку для экспорта настроек из базы-источника в файл и их последующего импорта в базу-приемник. Весь процесс сводится к чтению данных из системного хранилища, их сериализации во внешний формат (например, XML или внутреннюю строку 1С) и последующей записи в аналогичное хранилище в целевой базе.
Для уникальной идентификации формы документа используется строковый ключ следующего вида: "Документ.ИмяДокумента.Форма.ФормаДокумента".
Рассмотрим пример кода, который выполняется на стороне базы-источника (например, тестовой копии). Задача кода — получить настройки конкретной формы для определенного пользователя и сериализовать их в XML-файл:
// Определяем параметры выгрузки
КлючОбъекта = "Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента";
ИмяПользователяИсточника = "ИвановИИ";
ПутьКФайлу = "C:\Temp\form_settings.xml";
// Читаем список всех сохраненных настроек для данной формы
СписокНастроек = ХранилищеНастроекДанныхФорм.ПолучитьСписок(КлючОбъекта, ИмяПользователяИсточника);
Если СписокНастроек.Количество() > 0 Тогда
// Создаем структуру для хранения экспортируемых данных
ДанныеЭкспорта = Новый Структура;
Для Каждого ЭлементСписка Из СписокНастроек Цикл
ИмяНастройки = ЭлементСписка.Значение;
// Извлекаем непосредственно сам объект настройки
Настройка = ХранилищеНастроекДанныхФорм.Получить(КлючОбъекта, ИмяНастройки, , ИмяПользователяИсточника);
Если Настройка <> Неопределено Тогда
ДанныеЭкспорта.Вставить(ИмяНастройки, Настройка);
КонецЕсли;
КонецЦикла;
// Сериализуем полученную структуру в XML-файл
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлу);
ЗаписатьXML(ЗаписьXML, ДанныеЭкспорта);
ЗаписьXML.Закрыть();
Сообщить("Настройки формы успешно выгружены в файл: " + ПутьКФайлу);
Иначе
Сообщить("Настройки для указанной формы и пользователя не найдены!");
EndIf;
Теперь проанализируем код, который необходимо запустить в рабочей базе данных для загрузки сохраненного XML-файла и применения настроек к целевому пользователю:
// Определяем параметры загрузки
КлючОбъекта = "Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента";
ИмяПользователяПриемника = "ПетровПП";
ПутьКФайлу = "C:\Temp\form_settings.xml";
ФайлНаДиске = Новый Файл(ПутьКФайлу);
Если Не ФайлНаДиске.Существует() Тогда
ВызватьИсключение "Файл с настройками не найден на диске!";
КонецЕсли;
// Читаем сериализованные данные из XML
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьКФайлу);
ДанныеИмпорта = ПрочитатьXML(ЧтениеXML);
ЧтениеXML.Закрыть();
Если ТипЗнч(ДанныеИмпорта) = Тип("Структура") Тогда
// Записываем настройки в системное хранилище базы-приемника
Для Каждого КлючИЗначение Из ДанныеИмпорта Цикл
ИмяНастройки = КлючИЗначение.Ключ;
Настройка = КлючИЗначение.Значение;
// Сохраняем настройку для целевого пользователя
ХранилищеНастроекДанныхФорм.Сохранить(
КлючОбъекта,
ИмяНастройки,
Настройка,
,
ИмяПользователяПриемника
);
КонецЦикла;
Сообщить("Настройки формы успешно применены для пользователя: " + ИмяПользователяПриемника);
Иначе
Сообщить("Некорректный формат файла настроек!");
КонецЕсли;
Важно упомянуть еще один аспект хранения настроек в платформе 1С. Некоторые параметры (например, точные геометрические размеры окон, их положение на экране монитора, история последних введенных значений) сохраняются не в базе данных, а на компьютере пользователя локально — в каталоге %USERPROFILE%\AppData\Local\1C\1Cv8\... в файлах с расширением .pfl.
Важный момент: Мы настоятельно не рекомендуем пытаться переносить настройки интерфейса путем простого копирования этих файлов кэша. Во-первых, структура кэша привязана к уникальному идентификатору (UID) конкретной информационной базы. Во-вторых, ручное копирование служебных файлов платформы может привести к нестабильной работе интерфейса. Для надежного переноса конфигурации форм (измененных через визуальный редактор) всегда следует использовать описанный выше программный метод работы с СУБД-хранилищами.
Мы рассмотрели устройство механизмов сохранения интерфейса и разработали универсальный способ переноса настроек форм. При решении этой задачи на практике рекомендуем придерживаться следующих правил:
ХранилищеНастроекДанныхФорм.