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