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