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