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

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

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

Разберем ситуацию: почему элемент попадает в корень?

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

Решение для обычных форм (ОФ)

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

Способ 1: Использование события ПередНачаломДобавления

Это наиболее гибкий метод. Мы перехватываем нажатие кнопки «Добавить», определяем текущую группу и передаем её в параметры новой формы. Разберем пример кода:


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

Способ 2: Использование свойства ОсновнойОтбор

Если ваша форма списка всегда должна отображать элементы конкретной папки, можно настроить СправочникСписок.Отбор.Родитель. В этом случае платформа 1С автоматически подставит значение этого отбора в поле Родитель нового объекта.

Решение для управляемых форм (УФ)

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

Использование параметра ЗначенияЗаполнения

Когда мы вызываем команду создания программно, мы можем передать структуру ЗначенияЗаполнения. Платформа автоматически отработает её при инициализации нового объекта. Посмотрим на алгоритм в обработчике команды:


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

Свойство ТекущийРодитель динамического списка

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

Универсальный метод: Модуль объекта (ОбработкаЗаполнения)

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

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


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

Важные нюансы и типичные ошибки

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

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

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

← На главную