Как передать в форму создания элемента справочника значение группы, в которую должен попасть элемент

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

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

Постановка задачи и анализ ограничений

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

Разберем по шагам наиболее эффективные способы реализации этой задачи.

Способ 1. Использование параметра формы «ЗначенияЗаполнения»

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

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


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

Почему это работает? Когда форма открывается с параметром ЗначенияЗаполнения, платформа автоматически выполняет инициализацию нового объекта и вызывает процедуру ОбработкаЗаполнения в модуле объекта, передавая туда эту структуру. Даже если форма «пустая» и не содержит кода, механизм отрабатывает на уровне ядра платформы.

Способ 2. Настройка динамического списка в правой части

Если ваша правая часть формы (список элементов) — это динамический список, мы можем заставить его работать на нас автоматически. У динамического списка есть свойство ЗначенияЗаполнения. Рассмотрим, как программно устанавливать родителя для всех новых элементов, создаваемых из этого списка.

Когда пользователь меняет группу в левой части (дереве), мы можем выполнить следующий код:


&НаКлиенте
Процедура ДеревоГруппПриАктивизацииСтроки(Элемент)
    
    ТекущиеДанные = Элемент.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        
        // Устанавливаем значения заполнения для связанного динамического списка
        СтруктураЗаполнения = Новый Структура("Родитель", ТекущиеДанные.Ссылка);
        Элементы.СписокЭлементов.ЗначенияЗаполнения = СтруктураЗаполнения;
        
        // Также можно обновить отбор в списке, чтобы видеть только элементы этой группы
        // ... (код настройки отбора)
        
    КонецЕсли;
    
КонецПроцедуры

При таком подходе, когда пользователь нажмет стандартную кнопку «Создать» в командной панели списка СписокЭлементов, платформа сама возьмет структуру из свойства ЗначенияЗаполнения и передаст её в новую форму. Вам даже не придется перехватывать событие начала добавления!

Способ 3. Использование фиксированных настроек и отборов

Выясним еще одну интересную особенность платформы. Если в динамическом списке установлен отбор по полю Родитель с видом сравнения Равно, и этот отбор включен, то при создании нового элемента платформа зачастую автоматически подставляет значение из этого отбора в поле Родитель нового объекта.

Рассмотрим, как установить такой отбор программно:


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

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

Способ 4. Модуль объекта и ОбработкаЗаполнения

Если вы можете вносить изменения в конфигурацию, но не хотите трогать формы (например, чтобы сохранить их типовой вид или обеспечить работу логики при создании элементов из разных мест системы), лучшее решение — использование модуля объекта справочника. Выясним, как это реализовать.

В модуле справочника найдем (или создадим) процедуру ОбработкаЗаполнения. Она вызывается всегда при создании нового объекта программно или интерактивно.


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

Важный нюанс: если вы используете ОткрытьФорму с параметром ЗначенияЗаполнения, платформа автоматически выполнит сопоставление полей, даже если процедура ОбработкаЗаполнения в модуле пуста. Однако явное прописание логики в модуле объекта делает систему более надежной и предсказуемой.

Резюме

Подведем итоги. Чтобы передать группу в форму создания элемента, не меняя саму форму, мы проанализировали следующие варианты:

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

Выбор метода зависит от того, насколько глубоко вы готовы интегрироваться в программный код формы выбора. Для большинства задач оптимальным является сочетание Способа 1 (перехват события добавления) и Способа 4 (контроль заполнения в объекте).

← На главную