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