Как при создании нового элемента справочника автоматически заполнить реквизиты на основании выделенной строки в списке?

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

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

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

Способ 1: Использование параметра «ЗначенияЗаполнения» (Рекомендуемый)

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

Разберем алгоритм реализации по шагам:

  1. Создадим на форме списка справочника новую команду, например, СоздатьСНаследованием.
  2. Вынесем эту команду на командную панель формы.
  3. В модуле формы опишем логику получения текущих данных и открытия формы.

Рассмотрим пример кода для клиентской процедуры:


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

Почему это удобно? Когда вы передаете структуру через ЗначенияЗаполнения, в модуле объекта нового элемента автоматически срабатывает событие ОбработкаЗаполнения. Это позволяет избежать написания лишнего кода в процедуре ПриСозданииНаСервере самой формы элемента.

Способ 2: Использование механизма «Ввод на основании»

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

Проанализируем преимущества этого подхода:

Пример кода в модуле объекта справочника:


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

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

Важные нюансы работы с Динамическим списком

Работая с объектом ТекущиеДанные динамического списка, важно учитывать несколько технических особенностей, чтобы решение работало стабильно:

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

Способ 3: Программное копирование (ЗначениеКопирования)

Иногда требуется создать полную копию элемента, но с очисткой некоторых полей (например, артикула или кода). В управляемых формах для этого предусмотрен параметр ЗначениеКопирования.

Рассмотрим, как это работает:

  1. Мы передаем ссылку на текущий элемент под ключом ЗначениеКопирования.
  2. Система открывает форму нового элемента, заполненную всеми данными образца.
  3. В модуле объекта или формы мы очищаем те поля, которые не должны наследоваться.

Пример вызова:


ПараметрыОткрытия = Новый Структура("ЗначениеКопирования", Элементы.Список.ТекущаяСтрока);
ОткрытьФорму("Справочник.Товары.ФормаОбъекта", ПараметрыОткрытия);

Этот метод хорош тем, что он автоматически копирует табличные части и другие сложные структуры данных, если они есть у справочника.

Резюме

Мы проанализировали три основных способа создания элемента с учетом выделенной строки. Для простой подстановки одного-двух реквизитов (как в случае с категорией) лучше всего подходит Способ №1 с использованием ЗначенияЗаполнения. Он наиболее прозрачен, не требует изменения логики модуля объекта и легко поддерживается. Если же логика заполнения сложная и зависит от множества условий, стоит перенести её в процедуру ОбработкаЗаполнения модуля объекта, используя механизм ввода на основании.

← На главную