Как организовать пакетную запись нескольких строк в регистр сведений из формы в 1С 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке механизмов разграничения прав доступа (например, видимости документов или контрагентов) часто возникает задача: связать одного пользователя со списком других пользователей и сохранить эти пары в независимый регистр сведений. Разберем, как правильно реализовать интерфейс и программную логику для пакетного сохранения строк в регистр сведений.

Почему стандартная форма записи регистра не подходит

Проанализируем частую ошибку: попытку добавить реквизит типа ТаблицаЗначений на стандартную форму записи регистра сведений. В типовой форме записи основным реквизитом выступает ЭтотОбъект с типом РегистрСведенийМенеджерЗаписи.

Объект РегистрСведенийМенеджерЗаписи платформенно предназначен для работы строго с одной записью (одной комбинацией ключевых измерений). При попытке записать данные через стандартные команды формы платформа сохранит только одну строку, проигнорировав содержимое таблицы, либо выдаст ошибку блокировки. Поэтому для решения задачи множественного ввода необходимо использовать произвольную форму.

Пошаговый алгоритм: Создание произвольной формы и запись через НаборЗаписей

Разберем по шагам создание правильного механизма ввода и сохранения данных.

  1. Создание формы: Добавим новую произвольную форму (например, в самом регистре сведений или в составе служебной обработки).
  2. Реквизиты формы: Создадим реквизит РеквизитФормыПользователь (тип СправочникСсылка.Пользователи) и реквизит ТаблицаПользователей (тип ТаблицаЗначений с колонкой Пользователь).
  3. Интерфейс: Разместим поле выбора пользователя и таблицу формы на клиенте.
  4. Программная запись: Для сохранения списка строк в базу используем объект РегистрСведенийНаборЗаписей с обязательной установкой отбора по ведущему пользователю.

Программный код записи данных на сервере

Рассмотрим процедуру сохранения данных. Установка отбора гарантирует, что старые связи выбранного пользователя будут удалены и заменены новым актуальным списком из таблицы формы:


&НаСервере
Процедура ЗаписатьСвязиНаСервере()
    
    Набор = РегистрыСведений.ПраваВидимостиКонтрагентов.СоздатьНаборЗаписей();
    Набор.Отбор.Пользователь.Установить(РеквизитФормыПользователь);
    
    Для Каждого Стр Из ТаблицаПользователей Цикл
        НоваяЗапись = Набор.Добавить();
        НоваяЗапись.Пользователь = РеквизитФормыПользователь;
        НоваяЗапись.ВидитКонтрагентовПользователя = Стр.Пользователь;
    КонецЦикла;
    
    // Запись с параметром Истина замещает существующие записи по установленному отбору
    Набор.Записать(Истина);
    
КонецПроцедуры

Чтение существующих записей при выборе пользователя

Чтобы при выборе пользователя форма автоматически подтягивала уже назначенные ему связи, используем считывание набора записей с установленным фильтром:


&НаСервере
Процедура ЗаполнитьТаблицуПриВыбореПользователя()
    
    ТаблицаПользователей.Очистить();
    
    Если Не ЗначениеЗаполнено(РеквизитФормыПользователь) Тогда
        Возврат;
    КонецЕсли;
    
    Набор = РегистрыСведений.ПраваВидимостиКонтрагентов.СоздатьНаборЗаписей();
    Набор.Отбор.Пользователь.Установить(РеквизитФормыПользователь);
    Набор.Прочитать();
    
    Для Каждого Запись Из Набор Цикл
        Стр = ТаблицаПользователей.Добавить();
        Стр.Пользователь = Запись.ВидитКонтрагентовПользователя;
    КонецЦикла;
    
КонецПроцедуры

Интеграция произвольной формы с формой списка регистра

Чтобы пользователю было удобно работать со списком регистра, настроим открытие нашей произвольной формы при редактировании и создании записей:

  1. В форме списка регистра найдем событие таблицы Выбор.
  2. Установим СтандартнаяОбработка = Ложь и откроем нашу произвольную форму, передав в нее значение текущего пользователя в качестве параметра.
  3. Переопределим команду добавления: создадим свою кнопку на командной панели списка, которая открывает произвольную форму без параметров для создания новой связки.
  4. В обработчике ПриСозданииНаСервере произвольной формы проверим переданные параметры: если параметр пользователя заполнен, выполним процедуру чтения существующих записей.

Альтернативные архитектурные решения

Если задача управления правами шире, чем просто заполнение регистра, рассмотрим альтернативные подходы:

  1. Регистр сведений с подчинением регистратору: Если требуется вести строгую историю (кто, когда и на каком основании назначил видимость), создается документ НазначениеПравВидимости с табличной частью. Регистр сведений делается подчиненным регистратору. Это решает проблему с правами: администратору доступа выдаются права на проведение документа, а справочник пользователей остается доступным только на чтение.
  2. Служебный справочник настроек: Создается справочник (например, ПрофилиВидимостиПользователей) с табличной частью. Запросы RLS обращаются к табличной части справочника, что полностью исключает необходимость программной синхронизации наборов записей регистра.
  3. Использование типовых механизмов БСП: Если в конфигурации подключена Библиотека стандартных подсистем (БСП), рекомендуется использовать типовые механизмы групп доступа и профилей пользователей вместо разработки собственных регистров.
← На главную