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