Как связать справочник с регистром сведений в 1С?

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

При проектировании прикладных решений на платформе «1С:Предприятие 8» разработчики часто сталкиваются с важным архитектурным вопросом: где хранить подчиненные данные, которые привязаны к конкретному элементу справочника? Классический пример — справочник Пользователи и история их доступа к различным информационным системам.

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

В этой статье мы подробно разберем, как связать справочник с регистром сведений, рассмотрим различные варианты реализации (от no-code настроек до программного управления) и выясним, как сделать интерфейс работы с регистром максимально удобным для пользователей.

---

Почему регистр сведений лучше табличной части?

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

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

---

Способ 1. Связь через Динамический список с программным отбором

Это классический способ, который позволяет вывести записи регистра сведений прямо на форму элемента справочника в виде удобной таблицы. Данные будут считываться динамически, не нагружая основную форму объекта.

Разберем по шагам, как это реализовать:

  1. Откройте форму элемента вашего справочника в конфигураторе.
  2. В панели Реквизиты добавьте новый реквизит формы. Назовите его, например, ДС_Доступ.
  3. Установите тип этого реквизита как ДинамическийСписок.
  4. В свойствах созданного динамического списка установите флаг Произвольный запрос и откройте конструктор запроса. Напишите простой запрос к вашему регистру сведений:
    
    ВЫБРАТЬ
        РегистрДоступы.Период КАК Период,
        РегистрДоступы.Пользователь КАК Пользователь,
        РегистрДоступы.Система КАК Система,
        РегистрДоступы.УровеньДоступа КАК УровеньДоступа
    ИЗ
        РегистрСведений.ДоступыПользователей КАК РегистрДоступы
    
  5. Перетащите реквизит ДС_Доступ на форму справочника. Платформа предложит создать таблицу — соглашайтесь.

Теперь нам необходимо отфильтровать этот список, чтобы при открытии карточки пользователя показывались только его записи. Для этого перейдем в модуль формы и настроим событие ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверим, что элемент справочника уже записан в базу данных
    Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
        
        // Добавляем программный отбор по текущему пользователю
        ЭлементОтбора = ДС_Доступ.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Пользователь");
        ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
        ЭлементОтбора.Использование  = Истина;
        ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
        ЭлементОтбора.ПравоеЗначение = Объект.Ссылка;
        
    КонецЕсли;
    
КонецПроцедуры

Важная деталь: Чтобы при добавлении новой записи в регистр из этой таблицы поле Пользователь заполнялось автоматически, убедитесь, что в свойствах измерения Пользователь в самом регистре сведений стоит галочка «Заполнять из данных заполнения». Благодаря настроенному отбору на форме, платформа 1С автоматически передаст ссылку на текущего пользователя в форму создания новой записи регистра.

---

Способ 2. Использование свойства «Ведущее» (No-code интеграция)

Если перед вами стоит задача связать объекты быстро и без написания программного кода, платформа 1С предоставляет мощный встроенный механизм связи через свойство измерения регистра.

Выясним, как работает свойство «Ведущее»:

  1. Откройте свойства измерения Пользователь в вашем регистре сведений.
  2. Установите флаг Ведущее.
  3. Перейдите в конфигураторе к форме элемента справочника Пользователи.
  4. В левом верхнем углу окна редактора формы перейдите на вкладку Командный интерфейс.
  5. В разделе «Панель навигации» найдите команду перехода к вашему регистру сведений и установите для нее видимость (перетащите в видимую область панели навигации формы).

Что это дает на практике?

---

Способ 3. Эмуляция табличной части через Набор записей (Интерактивное редактирование)

По умолчанию динамический список (Способ 1) работает в режиме «только для чтения». Чтобы добавить или изменить запись, пользователю приходится открывать отдельное всплывающее окно записи регистра. Если вы хотите, чтобы работа с регистром выглядела точно так же, как работа с обычной табличной частью (то есть редактирование происходило прямо в ячейках таблицы на форме), вам необходимо использовать объект типа РегистрСведенийНаборЗаписей.

Рассмотрим по шагам, как настроить интерактивное редактирование:

  1. В реквизитах формы справочника создайте новый реквизит и назовите его ТаблицаДоступов.
  2. В поле Тип выберите: РегистрСведенийНаборЗаписей.[ИмяВашегоРегистра].
  3. Перетащите этот реквизит на форму в виде таблицы. Теперь строки можно будет редактировать прямо «на месте».

Поскольку набор записей не умеет считываться автоматически, нам потребуется написать код для чтения данных при открытии формы и для их сохранения при записи справочника.

В модуле формы реализуем следующие обработчики событий:


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

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

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

---

Резюме и рекомендации

Выбор конкретного метода связывания зависит от бизнес-требований вашего приложения:

← На главную