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

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

В современных конфигурациях 1С, построенных на базе Библиотеки стандартных подсистем (БСП), таких как УТ 11, ERP 2.5, КА 2 или современные отраслевые решения, интерфейс формируется динамически. Одной из часто возникающих задач является вынос конкретной кнопки из выпадающего списка "Создать на основании" непосредственно на командную панель формы для ускорения работы пользователей. Однако простая попытка добавить кнопку с тем же именем часто приводит к тому, что документ создается пустым или система выдает ошибку дублирования имен. Рассмотрим подробно, почему это происходит и как правильно решить задачу несколькими способами.

Почему стандартный подход не работает

Прежде чем переходить к решениям, разберем механизм работы БСП. В управляемых формах меню "Создать на основании" заполняется программно в событии ПриСозданииНаСервере. Система сканирует метаданные, проверяет права доступа и функциональные опции, а затем генерирует команды и элементы формы. Имена этих элементов обычно содержат уникальные идентификаторы (хеши), например, ПодменюСоздатьНаОснованииОбычное_Авто_083A859F....

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

Способ 1. Интерактивное изменение формы (пользовательский метод)

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

Проанализируем шаги:

  1. Откроем форму документа (например, Заказ покупателя).
  2. Нажмем кнопку "Еще" в правой части командной панели и выберем пункт "Изменить форму".
  3. В появившемся дереве элементов найдем группу "Командная панель", а внутри нее — подменю "Создать на основании".
  4. Найдем в списке нужную нам команду (например, "Заказ на производство").
  5. С помощью мыши перетащим этот элемент из папки подменю непосредственно в корень "Командной панели" или в другую удобную группу.
  6. Нажмем "ОК".

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

Способ 2. Программный перенос элемента через расширение

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

Рассмотрим алгоритм реализации в коде расширения формы документа:


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

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

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

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

Способ 3. Использование механизма Важности в БСП

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

Выясним, как это сделать:

  1. Создадим расширение и заимствуем в него модуль менеджера документа-источника (например, ЗаказПокупателя).
  2. Найдем или добавим процедуру ПриОпределенииКомандСозданияНаОсновании.
  3. В структуре описания команды найдем нужную и установим свойство Важность в значение "Важное".

Проанализируем пример кода в модуле менеджера:


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

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

Почему создается пустой документ и как это исправить

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

Рассмотрим правильный код вызова формы "на основании" вручную:


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

Обратите внимание: Чтобы этот код сработал, в документе-приемнике (в нашем случае Заказ на производство) в модуле объекта должна быть корректно определена процедура ОбработкаЗаполнения. Именно она отвечает за то, как данные из Заказа покупателя распределятся по реквизитам нового документа.

Рекомендации по отладке

Если кнопка все равно не появляется или ведет себя непредсказуемо, проанализируем следующие моменты:

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

← На главную