Как программно добавить кнопку со стандартной командой табличной части в 1С

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

При разработке управляемых форм в 1С:Предприятие часто возникает необходимость программно вынести на командную панель кнопку для выполнения встроенных (стандартных) действий табличной части — таких как «Скопировать», «Добавить» или «Удалить». Однако при попытке программного создания новой кнопки разработчики сталкиваются с ошибками доступа к именам стандартных команд.

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

Ограничения платформы и причины возникновения ошибки

Проанализируем, почему нельзя просто так создать новую кнопку формы и присвоить ей имя стандартной команды табличной части в коде. Работа командного интерфейса 1С имеет следующие особенности:

  1. Коллекция команд формы: Свойство кнопки ИмяКоманды принимает только имена команд из коллекции Команды самой формы, либо глобальные/параметризуемые команды. Вызывать стандартные действия таблицы напрямую через произвольное имя невозможно, если они не сгенерированы платформой.
  2. Инициализация встроенных команд: Состав стандартных команд генерируется платформой при вызове формы. Если команда не вынесена на панель в конфигураторе, отключена в свойстве «Состав команд» или отключено автозаполнение командной панели, платформа просто не создает системную команду для элемента.
  3. Отсутствие клиентского API для системных команд: В платформе 1С отсутствует программный метод, позволяющий принудительно зарегистрировать встроенную команду таблицы на клиенте во время выполнения кода.

Разберем три проверенных способа решения задачи в зависимости от условий разработки.

Способ 1. Вывод скрытой стандартной кнопки (если команда включена)

Если автозаполнение командной панели включено, платформа автоматически создает кнопки для всех стандартных действий табличной части, но часто прячет их внутри подменю «Еще». В этом случае добавлять новую кнопку через метод Элементы.Добавить() не нужно — достаточно найти существующий элемент и настроить его отображение.

Рассмотрим пример кода, который выносит встроенную кнопку «Скопировать» или «Добавить» из подменю «Еще» непосредственно на командную панель табличной части:


// Получаем существующую кнопку стандартной команды из панели таблицы
КнопкаСкопировать = Элементы.Товары.КоманднаяПанель.ПодчиненныеЭлементы["ТоварыСкопировать"];

// Настраиваем режим отображения и выносим ее из меню "Еще"
КнопкаСкопировать.Отображение = ОтображениеКнопки.КартинкаИТекст;
КнопкаСкопировать.ТолькоВоВсехДействиях = Ложь;

В данном примере имя элемента панели формируется платформой по шаблону [ИмяТаблицы][ИмяКоманды] (например, ТоварыСкопировать или ТоварыДобавить).

Способ 2. Включение команды через Расширение конфигурации

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

Выполним следующие шаги по настройке:

  1. Добавляем нужную управляемую форму и табличную часть в расширение конфигурации.
  2. В редакторе формы расширения переходим к свойству табличной части или открываем диалог «Состав команд».
  3. Включаем видимость стандартной команды (например, Скопировать) или перетаскиваем её мышью из дерева команд на командную панель таблицы.

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

Способ 3. Создание пользовательской команды и реализации логики в коде

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

Посмотрим на пример реализации логики копирования строки табличной части:


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

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

В этом случае мы программно добавляем команду в коллекцию ЭтаФорма.Команды, связываем ее с клиентским обработчиком и с помощью метода ЗаполнитьЗначенияСвойств() переносе данные текущей строки в новую.

← На главную