Как переопределить стандартную команду Создать и изменить порядок кнопок в форме 1С

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

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

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

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

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

Разберем пример реализации этого обработчика:


&НаКлиенте
Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
    
    // Если пользователь нажал "Копировать", возможно, стоит оставить стандартное поведение
    Если Копирование Тогда
        Возврат;
    КонецЕсли;

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

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

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

Способ 2. Управление составом команд и ручное формирование меню

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

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

  1. Откроем редактор формы и выберем элемент Командная панель или Контекстное меню.
  2. Снимем флажок Автозаполнение. Теперь панель пуста, и мы можем добавлять команды вручную.
  3. Первой добавим свою команду (например, СоздатьСпецОбъект).
  4. Чтобы не потерять системные функции (Изменить, Удалить, Найти и т.д.), добавим в панель группу кнопок.
  5. Для этой группы в свойстве Источник команд выберем наш динамический список (например, элемент Список).

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

Способ 3. Программное перемещение кнопок через Elements.Move

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

Допустим, у нас есть стандартная командная панель и мы добавили в нее свою кнопку МояКнопкаСоздать через визуальный редактор. Чтобы она оказалась в самом начале, используем следующий код:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Определяем целевую командную панель
    Панель = Элементы.СписокКоманднаяПанель;
    
    // Перемещаем нашу кнопку в самое начало списка элементов панели
    // Второй параметр - родитель, третий - элемент, ПЕРЕД которым вставляем.
    // Если передать Неопределено в качестве третьего параметра, кнопка уйдет в конец.
    
    // Чтобы поставить в начало, нужно найти самый первый элемент панели
    Если Панель.ПодчиненныеЭлементы.Количество() > 0 Тогда
        ПервыйЭлемент = Панель.ПодчиненныеЭлементы[0];
        Элементы.Переместить(Элементы.МояКнопкаСоздать, Панель, ПервыйЭлемент);
    КонецЕсли;
    
КонецПроцедуры

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

Способ 4. Переопределение через параметры заполнения (ОбработкаЗаполнения)

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

Проанализируем ситуацию: при нажатии стандартной кнопки Создать система создает новый объект и вызывает в его модуле процедуру ОбработкаЗаполнения. Если ваша цель — подставить специфические реквизиты в зависимости от условий, используйте этот метод:


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

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

Важные нюансы работы с Уникальностью Команды

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

Рекомендации по выбору метода

Подведем итог нашему анализу:

Помните, что при работе в расширениях (Modern approach) лучше всего использовать перехват событий формы или аннотацию &Вместо для существующих обработчиков, если они определены в основной конфигурации. Это обеспечит стабильность работы вашей доработки при обновлениях типового решения.

← На главную