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

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

Мы часто сталкиваемся с задачами, когда на управляемой форме 1С необходимо динамически создавать элементы, включая таблицы. Одной из распространённых трудностей является программное добавление кнопок со стандартными действиями (такими как "Вывести список", "Скопировать", "Удалить") для этих динамически созданных таблиц. В этом руководстве мы подробно разберем, как эффективно решить эту проблему, используя штатные механизмы платформы.

В чем суть проблемы?

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

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

Решение 1: Использование предопределенных команд формы и свойства "ИсточникДействия"

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

Давайте разберем по шагам, как это реализовать:

  1. Получаем ссылку на динамически созданную таблицу, для которой требуется добавить кнопку.
  2. Создаем новую кнопку на командной панели этой таблицы или на другой панели, которую мы свяжем с таблицей.
  3. Устанавливаем свойство ИмяКоманды для созданной кнопки, используя системное имя стандартной команды (например, "ВывестиСписок").
  4. Указываем свойство ИсточникДействия кнопки, ссылаясь на имя динамической таблицы, для которой эта команда предназначена. Это позволяет платформе определить контекст выполнения команды.

Посмотрим на пример кода для добавления кнопки "Вывести список":


// Предположим, что ТаблицаФормы уже создана динамически
// и ее имя, например, "ДинамическаяТаблица1"
ТаблицаФормы = Элементы.Получить("ДинамическаяТаблица1");

// Определим или создадим командную панель для нашей таблицы.
// Если командная панель таблицы уже создана, можем использовать ее.
// Или создадим отдельную группу-командную панель.
КоманднаяПанельТаблицы = Элементы.Получить("ДинамическаяТаблица1КоманднаяПанель");

Если КоманднаяПанельТаблицы = Неопределено Тогда
    // Создаем командную панель, если ее нет
    КоманднаяПанельТаблицы = Элементы.Добавить("ДинамическаяТаблица1КоманднаяПанель", Тип("ГруппаФормы"), ТаблицаФормы);
    КоманднаяПанельТаблицы.Вид = ВидГруппыФормы.КоманднаяПанель;
    КоманднаяПанельТаблицы.АвтоЗаполнение = Ложь; // Важно отключить автозаполнение, если хотим добавлять кнопки вручную
КонецЕсли;

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

В этом примере мы сначала получаем или создаем командную панель для нашей динамической таблицы, затем создаем на ней новую кнопку. Самые важные строки здесь: НоваяКнопка.ИмяКоманды = "ВывестиСписок"; и НоваяКнопка.ИсточникДействия = ТаблицаФормы.Имя;. Именно эти свойства позволяют платформе корректно интерпретировать и выполнить стандартное действие для нужной таблицы.

Вот список некоторых распространенных системных имен стандартных команд, которые вы можете использовать:

  1. Для таблиц: ВывестиСписок, Скопировать, Добавить, Удалить, Изменить, СортироватьСписокПоВозрастанию, СортироватьСписокПоУбыванию, Найти, ОтменитьПоиск, НастройкаСписка, Обновить.
  2. Общие команды (для форм/объектов): ОК, Записать, ЗаписатьИЗакрыть, Провести, ПровестиИЗакрыть, Отмена.

Решение 2: Использование автозаполнения командной панели для динамической таблицы

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

Разберем, как это сделать:


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

// Создаем командную панель для этой таблицы
ИмяКоманднойПанели = "КомПанельТаблицы" + Индекс;
НоваяКоманднаяПанель = Элементы.Добавить(ИмяКоманднойПанели, Тип("КоманднаяПанель"), Элементы.ИмяКонтейнера);
НоваяКоманднаяПанель.ИсточникДействий = НоваяТаблица; // Связываем панель с нашей таблицей
НоваяКоманднаяПанель.АвтоЗаполнение = Истина; // Включаем автозаполнение стандартными кнопками

В этом подходе мы создаем новую командную панель и связываем ее с динамически созданной таблицей через свойство ИсточникДействий. Затем, устанавливая НоваяКоманднаяПанель.АвтоЗаполнение = Истина;, мы даем указание платформе автоматически разместить на этой панели все стандартные кнопки, применимые к источнику действий (нашей таблице). Это значительно упрощает код, если вам нужны все или почти все стандартные команды.

Решение 3: Перемещение существующих кнопок и управление их видимостью (вариант для ограниченного числа таблиц)

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

Суть подхода заключается в следующем:

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

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


// Предположим, что у нас есть заранее созданная таблица на форме с именем "Таблица0",
// и для нее в конфигураторе уже создана кнопка "Таблица0ВывестиСписок"
// Создаем динамическую группу, которая будет выполнять роль командной панели
Группа0 = Элементы.Вставить("Таблица0КомПанель", Тип("ГруппаФормы"), ЭтотОбъект, Элементы.Таблица0);
Группа0.Вид = ВидГруппыФормы.КоманднаяПанель;
Группа0.АвтоЗаполнение = Ложь; // Отключаем автозаполнение, если кнопки добавляются вручную

// Перемещаем существующую кнопку "Таблица0ВывестиСписок" в нашу новую командную панель
Элементы.Переместить(Элементы.Таблица0ВывестиСписок, Элементы.Таблица0КомПанель);

// Настраиваем свойства перемещенной кнопки
Элементы.Таблица0ВывестиСписок.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВКоманднойПанели;
Элементы.Таблица0ВывестиСписок.Отображение = ОтображениеКнопки.Картинка; // Или ТекстИКартинка
        
// Управляем видимостью исходной командной панели, если она есть
// Элементы.Таблица0КоманднаяПанель.Видимость = Ложь; // Если хотим скрыть исходную панель

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

Дополнительные советы и рекомендации

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

Анализ контекста выполнения команды: Если вы создаете собственную (нестандартную) команду и привязываете ее к кнопке, то в обработчике этой команды на клиенте вы всегда можете получить текущий активный элемент формы:


&НаКлиенте
Процедура МояПользовательскаяКоманда(Команда)
    АктивныйЭлемент = ЭтаФорма.ТекущийЭлемент;
    Если ТипЗнч(АктивныйЭлемент) = Тип("ТаблицаФормы") Тогда
        Сообщить("МояПользовательскаяКоманда вызвана для таблицы: " + АктивныйЭлемент.Имя);
        // Здесь реализуем логику для конкретной таблицы
    Иначе
        Сообщить("МояПользовательскаяКоманда вызвана не для таблицы.");
    КонецЕсли;
КонецПроцедуры

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

Заключение

Мы выяснили, что, несмотря на первоначальные трудности, платформа 1С предоставляет достаточно мощные и гибкие инструменты для программного управления элементами формы. Используя системные имена стандартных команд и правильно связывая их с источниками действий, мы можем эффективно создавать динамические интерфейсы, полностью отвечающие требованиям задачи. Независимо от того, выбираем ли мы ручное добавление кнопок или автоматическое заполнение командных панелей, ключевым является понимание свойств ИмяКоманды и ИсточникДействия.

← На главную