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