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

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

При разработке и адаптации типовых конфигураций «1С:Предприятие 8.3» программисты часто сталкиваются с задачей упрощения интерфейса для конкретных групп пользователей или отделов. Типовые формы справочников (например, «Контрагенты», «Номенклатура» или «Договоры») содержат огромное количество реквизитов, вкладок и команд, необходимых для полноценного учета, но избыточных для сотрудников бэк-офиса или колл-центра.

Самое очевидное решение — создать отдельную, упрощенную форму списка и форму элемента. Однако здесь возникает техническая сложность: как сделать так, чтобы при работе в нашей новой упрощенной форме списка при двойном клике, нажатии клавиши F2, Insert или кнопок «Создать» и «Скопировать» открывалась именно наша упрощенная форма элемента, а во всех остальных разделах программы продолжала функционировать стандартная типовая форма?

В этой статье мы подробно разберем, почему стандартные механизмы платформы не всегда работают «из коробки», проанализируем возможные варианты реализации и предложим два готовых практических решения с примерами кода.

В чем заключается сложность стандартного механизма?

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

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

Рассмотрим два основных и наиболее эффективных подхода к решению этой задачи.

---

Способ 1. Переопределение интерактивных событий на уровне формы списка

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

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

  1. Выбор — срабатывает при двойном клике мыши по строке списка или при нажатии клавиши Enter.
  2. ПередНачаломДобавления — отвечает за создание нового элемента (клавиша Insert или кнопка «Создать») и копирование (клавиша F9 или кнопка «Скопировать»).
  3. ПередНачаломИзменения — срабатывает при попытке редактирования элемента (клавиша F2 или кнопка «Изменить»).

Рассмотрим по шагам, как настроить эти обработчики в модуле нашей формы списка.

Шаг 1. Перехват выбора и изменения элемента

Для обработки двойного клика и изменения элемента нам необходимо отключить стандартное действие платформы с помощью параметра СтандартнаяОбработка = Ложь и вызвать нашу форму программно через функцию ОткрытьФорму.


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

&НаКлиенте
Процедура СписокПередНачаломИзменения(Элемент, Отказ)
    
    // Отменяем стандартное поведение при изменении строки/нажатии F2
    Отказ = Истина;
    
    ПараметрыФормы = Новый Структура("Ключ", Элемент.ТекущаяСтрока);
    ОткрытьФорму("Справочник.ИмяВашегоСправочника.Форма.ВашаФормаЭлемента", ПараметрыФормы, Элемент);
    
КонецПроцедуры

Шаг 2. Обработка создания и копирования

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


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

Важный нюанс: Чтобы исключить ситуации, когда пользователь может обойти эти обработчики с помощью стандартных кнопок командной панели динамического списка, рекомендуется отключить свойство таблицы Автозаполнение для командной панели и создать кнопки «Создать», «Изменить» и «Скопировать» вручную, привязав к ним собственные команды, дублирующие вышеописанную логику программного открытия формы.

---

Способ 2. Использование события «ОбработкаПолученияФормы» в модуле менеджера (Рекомендуемый)

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

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

Разберем этот изящный алгоритм по шагам.

Шаг 1. Передаем маркер из формы списка

В нашей форме списка мы все также перехватываем события добавления и изменения, но теперь мы не вызываем конкретную кастомную форму напрямую на клиенте. Вместо этого мы инициируем открытие стандартной формы, но добавляем в структуру параметров наш уникальный ключ-маркер (например, ОткрытьМоюФорму):


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

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

Шаг 2. Перехватываем параметр в модуле менеджера справочника

Откроем модуль менеджера нашего справочника и найдем (или создадим) предопределенную процедуру ОбработкаПолученияФормы. Здесь мы анализируем входящую структуру параметров. Если в ней присутствует наш маркер ОткрытьМоюФорму, мы переопределяем возвращаемую платформой форму.


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

Почему второй способ предпочтительнее?

---

Альтернативный вариант: Использование ролей пользователей

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

В этом случае решение реализуется полностью в модуле менеджера справочника на основе проверки прав доступа или ролей текущего пользователя:


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

Этот подход максимально надежен, так как он защищает систему от «случайного» открытия стандартной формы. Даже если пользователь попытается открыть элемент по навигационной ссылке из истории или из отчета, платформа все равно подставит ему правильную упрощенную форму.

Резюме и рекомендации

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

  1. Используйте Способ №2 (ОбработкаПолученияФормы с передачей параметра), если разделение логики работы требуется исключительно в контексте конкретного рабочего места (формы списка).
  2. Используйте проверку ролей в модуле менеджера, если упрощение интерфейса привязано к должностным обязанностям сотрудников, независимо от того, из какого места программы они открывают карточку элемента.
  3. Выносите все изменения в расширение конфигурации. Это позволит безболезненно обновлять типовую конфигурацию «1С» и минимизирует риски возникновения конфликтов при обновлении метаданных.
← На главную