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

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

В процессе разработки на платформе 1С:Предприятие 8.3 (Управляемые формы) программисты часто сталкиваются с необходимостью динамического создания элементов интерфейса, для чего нередко применяют готовые инструменты для программного изменения форм — есть инструмент для программного изменения управляемых форм. Если добавление реквизитов и элементов на форму обычно не вызывает затруднений, то работа со стандартными командами (такими как «Вывести список», «Настройка списка», «Поиск») таит в себе несколько неочевидных нюансов. В этой статье мы подробно разберем, почему нельзя просто вызвать стандартную команду из кода и как правильно «привязать» её к программно созданным кнопкам.

Анализ проблемы: почему стандартные команды особенные

Давайте проанализируем ситуацию. Когда мы создаем таблицу в конфигураторе, платформа автоматически предлагает набор стандартных команд. Однако при программном создании объекта ТаблицаФормы эти команды не всегда появляются автоматически в контекстном меню или командной панели. Основная сложность заключается в том, что в объектной модели 1С не существует метода вроде ЭтаФорма.ВыполнитьСтандартнуюКоманду("ВывестиСписок"). Стандартные команды — это декларативные механизмы платформы, предназначенные для интерактивного взаимодействия.

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

Способ 1. Программная привязка к стандартной команде

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

Для команд, относящихся к конкретному элементу (например, таблице), используется следующий шаблон:
ЭлементСтандартнаяКоманда.<ИмяЭлемента>.<ИмяКоманды>

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

  1. Найдем объект контекстного меню нашей таблицы.
  2. Создадим новый элемент типа КнопкаФормы.
  3. Укажем путь к стандартной команде.

Посмотрим на пример кода:


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

Важно помнить: если вы ошибетесь в написании ТаблицаНоменклатуры или ВывестиСписок, кнопка просто не отобразится на форме без каких-либо предупреждений. Проанализируем также команды всей формы. Если нам нужна общая команда формы, путь будет выглядеть так: СтандартнаяКомандаФормы.ИмяКоманды.

Способ 2. Использование свойства Автозаполнение

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

Рассмотрим пример создания командной панели:


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

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

Способ 3. Эмуляция команды «Вывести список» через встроенный язык

Бывают ситуации, когда нам нужно не просто добавить кнопку, а выполнить действие «Вывести список» в рамках какого-то сложного алгоритма (например, после выполнения расчетов). Как мы уже выяснили, «нажать» стандартную кнопку из кода нельзя. Но мы можем использовать методы самого элемента формы, применяя проверенные приемы построения эффективных интерфейсов.

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


// Программный вывод содержимого таблицы в табличный документ
ТабДок = Новый ТабличныйДокумент;
// Метод ВывестиСписок позволяет вывести данные с учетом текущих отборов и сортировок
Элементы.ТаблицаНоменклатуры.ВывестиСписок(ТабДок);
ТабДок.Показать("Результат вывода списка");

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

Особенности для Динамических списков

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

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

Для программного добавления специфических команд поиска используйте такие имена:

Резюме для разработчика

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

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

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

← На главную