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