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