Как вызвать свою процедуру вместо стандартного создания элемента в справочнике 1С?

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

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

Способ 1. Использование обработчика «ПередНачаломДобавления»

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

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

  1. Установить параметр Отказ в значение Истина. Это отменит стандартное открытие формы нового элемента.
  2. Вызвать собственную процедуру или открыть нужную нам форму.

Проанализируем пример реализации кода в модуле формы списка:


&НаКлиенте
Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметры)
    
    // Блокируем стандартное действие
    Отказ = Истина;
    
    // Вызываем свою логику
    МояПроцедураСоздания(Копирование, Родитель);
    
КонецПроцедуры

&НаКлиенте
Процедура МояПроцедураСоздания(Копирование, Родитель)
    // Здесь описываем логику: открытие другой формы, 
    // программное создание объекта или запуск помощника
    Сообщить("Запущена пользовательская процедура создания элемента!");
КонецПроцедуры

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

Способ 2. Программная подмена кнопок в командной панели

Иногда разработчику требуется не просто изменить логику, а визуально заменить кнопку «Создать» на свою собственную. Это актуально, если стандартная командная панель формируется автоматически и вы не хотите отключать её свойство Автозаполнение.

Рассмотрим вариант реализации через процедуру ПриСозданииНаСервере. Мы найдем стандартную кнопку, скроем её и программно добавим свою команду.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // 1. Скрываем стандартную кнопку "Создать"
    // Путь к кнопке может зависеть от структуры формы
    КнопкаСоздать = Элементы.Найти("ФормаСоздать");
    Если КнопкаСоздать <> Неопределено Тогда
        КнопкаСоздать.Видимость = Ложь;
    КонецЕсли;

    // 2. Создаем свою команду программно
    ИмяКоманды = "СоздатьНовыйСвоимМетодом";
    НоваяКоманда = ЭтаФорма.Команды.Добавить(ИмяКоманды);
    НоваяКоманда.Действие = "ОбработкаМоейКомандыСоздания";
    НоваяКоманда.Заголовок = "Создать";
    НоваяКоманда.Подсказка = "Создать новый элемент по особому алгоритму";

    // 3. Добавляем кнопку на командную панель
    // Размещаем её перед кнопкой копирования, чтобы сохранить привычный порядок
    ЭлементКопировать = Элементы.ФормаСкопировать;
    НоваяКнопка = Элементы.Вставить("КнопкаСоздатьСпец", Тип("КнопкаФормы"), ЭтаФорма.КоманднаяПанель, ЭлементКопировать);
    НоваяКнопка.ИмяКоманды = ИмяКоманды;
    
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаМоейКомандыСоздания(Команда)
    // Вызов вашей процедуры
    ОткрытьСвоюФормуИлиВыполнитьКод();
КонецПроцедуры

Внимание: при использовании этого метода помните про замечание о горячих клавишах. Скрытие кнопки не отключает действие клавиши Insert. Поэтому данный способ рекомендуется комбинировать с первым способом (установкой Отказ = Истина в событии таблицы), либо полностью отключать стандартные команды в свойствах динамического списка.

Способ 3. Переопределение через модуль менеджера справочника

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

Рассмотрим, как это работает. Когда платформа пытается открыть форму, она обращается к менеджеру объекта. Мы можем вмешаться в этот процесс и подменить форму или параметры.


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

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

Способ 4. Использование расширений конфигурации

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

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

Способ 5. Блокировка на уровне свойств интерфейса

Если ваша задача — полностью исключить стандартное создание и оставить только запуск вашей процедуры через отдельную кнопку, проанализируем настройки самой таблицы формы. У элемента формы (таблицы) есть свойство «ИзменятьСоставСтрок».

Если установить это свойство в значение Ложь:

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

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

Выбор конкретного метода зависит от ваших целей:

  1. Для быстрого перехвата всех действий пользователя (кнопка + горячие клавиши) идеально подходит событие ПередНачаломДобавления в модуле формы.
  2. Для глобальной подмены формы создания во всей системе используйте ОбработкаПолученияФормы в модуле менеджера.
  3. Для корректной инициализации данных в новом объекте (независимо от того, как он создается) всегда используйте ОбработкаЗаполнения в модуле объекта справочника.
  4. Для чистоты интерфейса при полном запрете стандартного ввода используйте свойство таблицы ИзменятьСоставСтрок = Ложь.

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

← На главную