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