Как решать типовые задачи при разработке управляемых форм в 1С

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

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

1. Отображение связанных данных и автоматическое заполнение при создании

Рассмотрим задачу, когда в форме объекта (например, справочника Контрагенты) необходимо вывести связанные данные из регистра сведений или подчиненного справочника. Выделим два основных подхода к реализации:

  1. Использование стандартного механизма связей: если в регистре сведений у измерения (например, Контрагент) установлен признак Ведущее, платформа автоматически формирует команду перехода в панели навигации формы объекта и накладывает отбор по текущему объекту без написания программного кода.
  2. Встраивание динамического списка в форму: если требуется видеть таблицу прямо в теле формы, добавляется реквизит формы с типом ДинамическийСписок, для которого указывается основная таблица регистра сведений или произвольный запрос.

При использовании динамического списка важно настроить фильтрацию по текущему объекту и автозаполнение при вводе новых строк. Проанализируем, как передать контекст текущего объекта при добавлении новой записи через обработчик таблицы ПередНачаломДобавления:


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

2. Программная установка отборов и группировок в Динамическом списке

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


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

Посмотрим на пример установки отбора и добавления программной группировки в обработчиках формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Установка простого отбора по владельцу
    Элемент = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Владелец");
    Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    Элемент.ПравоеЗначение = ПараметрыСеанса.ТекущийПользователь;
    Элемент.Использование = Истина;
    
    // Для выноса отбора в шапку формы в быстрый доступ:
    Элемент.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;
КонецПроцедуры

&НаКлиенте
Процедура КомандаГруппировкаПоГоду(Команда)
    Список.Группировка.Элементы.Очистить();
    Элемент = Список.Группировка.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
    Элемент.Поле = Новый ПолеКомпоновкиДанных("Ссылка.Дата");
    Элемент.Использование = Истина;
КонецПроцедуры

3. Настройка командной панели и вынос кнопок из меню «Все действия»

В управляемой форме стандартные команды объекта или формы по умолчанию могут группироваться в выпадающем меню Все действия (или Еще). Чтобы вынести важную кнопку (например, ОтменаПроведения) непосредственно на командную панель, выполним следующие шаги:

  1. В редакторе формы перейдем к командной панели и снимем флаг Автозаполнение, если требуется полный контроль над составом кнопок, либо добавим новую кнопку в состав панели вручную.
  2. В свойствах добавляемой кнопки укажем соответствующую стандартную команду.
  3. Убедимся, что для команды свойство ТолькоВоВсехДействиях установлено в значение Ложь.

4. Корректное отображение крупного шрифта и управление размерами полей

Если на форме размещается декорация или поле с большим размером шрифта (например, 72 pt), управляемый интерфейс может некорректно рассчитать размеры, если у контейнера включены автоматические ограничения. Разберем правила настройки компоновки:

  1. Для родительской группы элементов установим свойство Группировка в значение Вертикальная.
  2. У самого элемента поля надписи отключим свойство АвтоМаксимальнаяВысота и при необходимости укажем явное значение свойства Высота либо включим РастягиватьПоВертикали.

5. Организация каталогов для плоских списков документов

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

  1. Группировка в динамическом списке: добавление в документ реквизита с типом ПеречислениеСсылка или Строка и настройка стандартной группировки списка по этому полю. Документы будут визуально свернуты по узлам значений.
  2. Интерфейс с закладками (страницами): создание на форме панели страниц со статусами. При переключении страницы в динамическом списке программно переопределяется условие отбора.
  3. Паттерн «Мастер–Деталь»: размещение слева статического дерева категорий, а справа — динамического списка, фильтруемого в событии ПриАктивизацииСтроки левой таблицы.

6. Ограничения динамического списка: интерактивные флажки и открытие строк

Выясним причину, почему поле-флажок, добавленное в запрос динамического списка выражением ВЫБРАТЬ ИСТИНА КАК Обрабатывать, блокируется для изменения пользователем:

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

  1. Альтернатива 1: Использовать реквизит формы типа ТаблицаЗначений, куда данные считываются сервером, интерактивно отмечаются пользователем и затем обрабатываются.
  2. Альтернатива 2: Включить у таблицы динамического списка свойство МножественныйВыбор и считывать массив выделенных строк через Элементы.ИмяТаблицы.ВыделенныеСтроки.

Для открытия формы объекта из строки динамического списка достаточно назначить в свойствах динамического списка Основную таблицу. Если требуется переопределить стандартное действие при двойном клике, используется событие таблицы Выбор:


&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    ТекущиеДанные = Элемент.ДанныеСтроки(ВыбраннаяСтрока);
    Если ТекущиеДанные <> Неопределено Тогда
        ОткрытьЗначение(ТекущиеДанные.Ссылка);
    КонецЕсли;
КонецПроцедуры
← На главную