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

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

В практике разработки на платформе 1С часто возникает задача визуализации связанных данных. Одним из наиболее распространенных сценариев является вывод записей регистра сведений непосредственно в карточку справочника (например, «Номенклатура»). Это позволяет пользователю видеть историю цен, дополнительные свойства или специфические настройки объекта, не открывая дополнительные окна.

В данной статье мы подробно разберем, как реализовать этот функционал для конфигураций на обычных формах (например, «Управление производственным предприятием» или «Управление торговлей 10.3»), а также решим сопутствующие задачи: автоматическое заполнение автора записи и ограничение возможности редактирования регистра вне формы справочника.

Шаг 1. Вывод регистра сведений на форму справочника

Для начала рассмотрим техническую сторону добавления регистра на форму. В обычных формах работа с данными регистра в контексте другого объекта требует ручной настройки отборов.

Разберем последовательность действий:

  1. Откроем форму справочника Номенклатура в конфигураторе.
  2. Добавим новый элемент управления — Табличное поле.
  3. В свойствах табличного поля в поле Тип значения выберем РегистрСведенийСписок.НазваниеВашегоРегистра.
  4. Для того чтобы данные фильтровались по текущей номенклатуре, нам необходимо программно установить отбор при открытии формы.

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


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

Важный нюанс: Если пользователь только что создал карточку номенклатуры и еще не записал её, ссылка будет пустой. Записи регистра невозможно привязать к «пустоте», поэтому мы устанавливаем свойство ТолькоПросмотр. После записи справочника в обработчике ПослеЗаписи этот флаг следует снять.

Шаг 2. Автоматическое заполнение реквизита «Пользователь»

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

Рассмотрим, почему это лучше делать в модуле набора записей, а не в форме. Это гарантирует заполнение данных вне зависимости от того, откуда пришла запись — из формы справочника, через обработку или через консоль запросов.

Перейдем в Модуль набора записей регистра сведений и создадим обработчик события ПередЗаписью:


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

Шаг 3. Ограничение доступа: запрет прямого редактирования

Часто бизнес-процесс требует, чтобы данные в регистр вносились только через интерфейс конкретного справочника. Если у пользователя есть роль на редактирование регистра, он по умолчанию сможет открыть его через меню «Операции» и внести правки напрямую. Выясним, как это предотвратить.

Рассмотрим два способа реализации этой защиты.

Способ А. Блокировка формы списка

Самый простой метод — запретить открытие основной формы списка регистра. В модуле формы списка регистра напишем:


Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    // Если форма открывается стандартно (не программно с особыми параметрами)
    // можно выдать предупреждение и прервать открытие
    Если Не РольДоступна("ПолныеПрава") Тогда
        Сообщить("Редактирование данного регистра возможно только из карточки Номенклатуры!");
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

Способ Б. Проверка параметров вызова (более гибкий)

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

1. В форме справочника Номенклатура перехватываем событие начала изменения или добавления в табличном поле:


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

2. В форме записи регистра сведений обрабатываем проверку:


Процедура ПриОткрытии()
    // Проверяем наличие нашего секретного параметра
    Если Не ЭтаФорма.Параметры.Свойство("ВызовИзСправочника") Тогда
        Предупреждение("Прямое редактирование регистра запрещено!");
        ЭтаФорма.Закрыть();
    КонецЕсли;
КонецПроцедуры

Оптимизация производительности (Критически важно для УПП)

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

Проанализируем причины замедления: При установке отбора Отбор.Номенклатура.Установить(Ссылка) система выполняет SQL-запрос. Если измерение Номенклатура в регистре не индексировано, СУБД придется сканировать всю таблицу регистра целиком.

Решение: В свойствах измерения Номенклатура в конфигураторе обязательно установите флаг Индексировать (или «Индексировать с доп. упорядочиванием»). Это обеспечит мгновенное получение данных при открытии формы справочника.

Дополнительные рекомендации

Рассмотрим еще несколько полезных советов для работы с обычными формами:

Таким образом, мы успешно решили задачу интеграции данных регистра в форму справочника, обеспечив при этом контроль целостности данных и соблюдение прав доступа. Этот подход является классическим для систем на базе 1С:Предприятие 8.2 и 8.3 при использовании обычного интерфейса.

← На главную