При организации работы в 1С часто возникает задача разграничения или структурирования данных по подразделениям, цехам или конкретным сотрудникам. Например, требуется, чтобы при создании нового элемента справочника ВидыРабот система автоматически определяла текущего пользователя (или его подразделение) и помещала новый элемент в соответствующую группу справочника без необходимости вручную выбирать папку.
В этой статье мы подробно разберем, как реализовать автоматическое заполнение реквизита Родитель, какие способы привязки пользователя к группе существуют, а также проанализируем важные технические нюансы и платформенные ограничения.
Для инициализации реквизитов нового объекта в платформе 1С предусмотрен специальный обработчик ОбработкаЗаполнения, расположенный в модуле объекта справочника. Этот обработчик выполняется на сервере в момент создания нового элемента (как интерактивно из формы, так и программно).
Рассмотрим базовую логику работы данного события. Реквизит Родитель представляет собой не текстовое название папки, а ссылку на элемент того же справочника с признаком группы.
Если наименование группы в справочнике строго совпадает с именем пользователя или подразделения, можно воспользоваться поиском группы по имени. Рассмотрим пример кода в модуле объекта справочника:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
// Проверяем, не заполнен ли родитель ранее (например, при создании из папки)
Если ЗначениеЗаполнено(Родитель) Тогда
Возврат;
КонецЕсли;
// Получаем имя текущего пользователя сеанса
ИмяТекущегоПользователя = ИмяПользователя();
// Ищем группу справочника по наименованию
ГруппаРодитель = Справочники.ВидыРабот.НайтиПоНаименованию(ИмяТекущегоПользователя);
// Проверяем, найдена ли ссылка и является ли она именно группой
Если ЗначениеЗаполнено(ГруппаРодитель) И ГруппаРодитель.ЭтоГруппа Тогда
Родитель = ГруппаРодитель;
КонецЕсли;
КонецПроцедуры
Важное предупреждение: Использование метода НайтиПоНаименованию() подходит для быстрого старта или простых конфигураций, однако в реальной эксплуатации этот метод несет риски. Если бухгалтерия или администратор переименуют группу (например, изменят опечатку в названии), поиск перестанет работать.
Разберем более архитектурно правильный подход. Чтобы не зависеть от текстовых наименований, создают персональную привязку пользователя к группе справочника. Это можно сделать двумя способами:
Пользователь и ресурсом ГруппаВидовРабот.Проанализируем пример кода с получением родителя из регистра сведений:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ЗначениеЗаполнено(Родитель) Тогда
Возврат;
КонецЕсли;
// Получаем ссылку на текущего пользователя (для типовых конфигураций на БСП)
ТекущийПользователь Ссылка = Пользователи.ТекущийПользователь();
// Запросом или через менеджер регистра получаем настройку группы
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ Первые 1
| Настройки.ГруппаВидовРабот КАК ГруппаВидовРабот
|ИЗ
| РегистрСведений.НастройкиПользователей КАК Настройки
|ГДЕ
| Настройки.Пользователь = &Пользователь";
Запрос.УстановитьПараметр("Пользователь", ТекущийПользователь);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Если ЗначениеЗаполнено(Выборка.ГруппаВидовРабот) И Выборка.ГруппаВидовРабот.ЭтоГруппа Тогда
Родитель = Выборка.ГруппаВидовРабот;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
При реализации автозаполнения родителя обязательно учитывайте следующие технические аспекты платформы 1С:
ЭтоГруппа): В реквизит Родитель разрешено записывать только ссылки на группы. Если поиск вернет обычный элемент (у которого ЭтоГруппа = Ложь), при попытке записи нового элемента платформа вызовет критическую ошибку.ДанныеЗаполнения. Обязательно проверяйте условие ЗначениеЗаполнено(Родитель), чтобы не переопределять выбор пользователя, сделанный вручную.ДанныеЗаполнения передается ссылка на копируемый объект. Выясните требования бизнес-логики: должен ли скопированный элемент оставаться в папки-источнике или переноситься в личную папку текущего пользователя.УстановитьПривилегированныйРежим(Истина).Применяя указанные методы, вы обеспечите корректное и отказоустойчивое автозаполнение структуры справочников в системе.