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