Как открыть нетиповую форму элемента из дополнительной формы списка в обычных формах 1С

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

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

Причины трудностей и особенности работы обычных форм

Выясним, с какими подводными камнями можно столкнуться при реализации этой задачи:

  1. Настройки основных форм в метаданных действуют глобально. В конфигураторе 1С нельзя привязать конкретную форму элемента к отдельной форме списка без написания кода. Настройка основных форм действует на весь объект метаданных.
  2. Событие ОбработкаВыбора не подходить для кликов по списку. В обычных формах событие ОбработкаВыбора табличного поля или формы срабатывает только при получении значения из другой формы (например, при выборе из формы выбора в поле ввода). Для перехвата редактирования или открытия строки списка оно не применяется.
  3. Различие между обычными и управляемыми формами. В управляемом приложении открытие форм выполняется через глобальную функцию ОткрытьФорму() с передачей пути к форме строкой. В обычных формах базовым механизмом является вызов метода ПолучитьФорму() у объекта справочника или менеджера справочника.

Перехват открытия и редактирования существующего элемента

Для того чтобы при двойном клике по строке или нажатии клавиши Enter (или кнопки «Изменить») открывалась дополнительная форма элемента, перехватим событие табличного поля ПередНачаломИзменения.

Разберем алгоритм действий:

  1. Отменяем стандартное открытие формы по умолчанию, устанавливая Отказ = Истина;.
  2. Получаем ссылку на текущую строку табличного поля через свойство ТекущаяСтрока.
  3. Получаем объект базы данных методом ПолучитьОбъект().
  4. Вызываем метод ПолучитьФорму("ФормаЭлемента1") у полученного объекта и открываем форму.

Рассмотрим пример программного кода:


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

КонецПроцедуры

Перехват создания и копирования нового элемента

При нажатии кнопки «Добавить» или «Добавить копированием» платформа по умолчанию также попытается открыть основную форму элемента. Чтобы перенаправить пользователя на дополнительную форму, обработаем событие табличного поля ПередНачаломДобавления.

Проанализируем необходимые действия:

  1. Устанавливаем Отказ = Истина; для отключения штатной обработки добавления.
  2. Проверяем флаг Копирование. Если он равен Истина, создаем новый объект путем копирования текущей строки: Элемент.ТекущаяСтрока.Скопировать().
  3. Если происходит создание нового элемента с нуля (Копирование = Ложь), создаем объект через менеджер справочника: Справочники.ФизическиеЛица.СоздатьЭлемент().
  4. При наличии иерархии в справочнике устанавливаем родителя для нового объекта из параметра события Родитель.
  5. Получаем и открываем созданную форму для нового объекта.

Посмотрим на пример реализации данного обработчика:


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

КонецПроцедуры

Важные нюансы и ограничения

При использовании данного подхода важно учитывать следующие моменты:

  1. Проверка прав доступа. Метод ПолучитьОбъект() считывает данные объекта из базы для редактирования. Если у текущего пользователя нет прав на изменение справочника, платформой будет вызвана ошибка прав доступа еще до момента открытия формы.
  2. Ручное заполнение значений отбора. Поскольку установка Отказ = Истина полностью отключает встроенную логику платформы, автозаполнение реквизитов из текущих отборов списка (если они установлены в форме) при создании нового элемента потребуется прописать программно перед открытием формы.
← На главную