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