Как вывести кнопку внешней обработки табличной части на командную панель в обычных формах 1С?

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

При разработке и сопровождении конфигураций на платформе 1С:Предприятие 8 в режиме обычного приложения (например, УПП 1.3, УТ 10.3, КА 1.1) программисты часто сталкиваются с необходимостью кастомизации интерфейса под нужды пользователей. Одним из наиболее удобных инструментов расширения функционала без изменения конфигурации (и, соответственно, без необходимости выгонять пользователей из базы для обновления динамически измененных метаданных) являются внешние обработки заполнения табличных частей.

Однако стандартный механизм интеграции таких обработок через общие модули (например, подсистему УниверсальныеМеханизмы) автоматически помещает зарегистрированные обработки в выпадающее меню кнопки «Заполнить». Это решение эргономично, если обработок много, но крайне неудобно для пользователей, если им ежедневно требуется нажимать одну и ту же кнопку сотни раз. В этой статье мы подробно разберем, почему стандартный механизм накладывает такие ограничения, и рассмотрим три практических способа решения проблемы: от программной модификации командной панели до ручного вызова файла обработки из справочника.

Выясним причину проблемы и детально проанализируем возможные варианты реализации.

---

Почему стандартное свойство «ТолькоВоВсехДействиях» не работает?

В управляемом интерфейсе платформы 1С:Предприятие 8.3 для вывода команды из подменю «Еще» на командную панель достаточно установить свойство элемента формы ТолькоВоВсехДействиях в значение Ложь (или перетащить команду мышкой в редакторе формы). В обычных формах (на которые указывает обращение автора темы через коллекцию ЭлементыФормы) такого свойства попросту нет. Элемент управления КоманднаяПанель в обычном приложении устроен иначе.

Стандартный вызов автозаполнения в модуле обычной формы чаще всего выглядит так:


СоответствиеТЧ = Новый Соответствие;
СоответствиеТЧ.Вставить(ЭлементыФормы.Товары, ЭлементыФормы.КоманднаяПанельТовары.Кнопки.Заполнить);
УниверсальныеМеханизмы.СформироватьПодменюЗаполненияТЧ(Ссылка, СоответствиеТЧ, ЭтаФорма);

Метод СформироватьПодменюЗаполненияТЧ считывает из справочника зарегистрированные внешние обработки для данного документа и программно создает дерево кнопок внутри кнопки типа «Подменю» (в нашем случае — «Заполнить»). Платформа не предоставляет штатного интерактивного переключателя, позволяющего одной галочкой «вытащить» конкретную ветку этого подменю наружу. Поэтому нам придется прибегнуть к программным механизмам.

---

Вариант 1. Программный перенос кнопки из дерева подсистемы (оптимальный путь)

Рассмотрим элегантный способ, который позволяет сохранить все преимущества регистрации обработок в справочнике «Внешние обработки» (автоматическая проверка прав доступа, хранение двоичных данных в базе данных), но при этом выводит кнопку запуска конкретной обработки непосредственно на командную панель табличной части.

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

В модуле формы документа в процедуре ПриОткрытии (или ПередОткрытием) пропишем следующий программный код:


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

// Шаг 2. Ищем в дереве нужную нам обработку по ее наименованию в справочнике
// Замените "Расчет товарного веса" на точное наименование вашей обработки из справочника
СтрокаКнопки = ДеревоКнопок.Строки.Найти("Расчет товарного веса", "Текст", Истина);

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

КонецЕсли;

Преимущества данного метода:

---

Вариант 2. Ручной вызов внешней обработки из кода формы (автономный путь)

Проанализируем альтернативную ситуацию. Что делать, если по каким-то причинам подсистема УниверсальныеМеханизмы в вашей конфигурации сильно изменена, нетипична или вообще отсутствует? В этом случае мы можем пойти по пути полной автономии.

Мы добавим обычную кнопку на форму (или командную панель) в конфигураторе, а при ее нажатии будем программно обращаться к справочнику внешних обработок, извлекать двоичные данные файла .epf во временный каталог на компьютере пользователя, запускать обработку и передавать ей параметры.

Рассмотрим детальный алгоритм реализации этого метода:

Шаг 1. Создаем кнопку на командной панели в конфигураторе. Назовем ее ДействиеЗаполнитьВес и назначим ей процедуру-обработчик нажатия.

Шаг 2. Пропишем следующий код в модуле формы документа:


Процедура КоманднаяПанель1ЗаполнитьВес(Кнопка)
    
    // 1. Ищем внешнюю обработку в справочнике по точному наименованию
    НаименованиеОбработки = "Заполнение товарного веса";
    СсылкаНаОбработку = Справочники.ВнешниеОбработки.НайтиПоНаименованию(НаименованиеОбработки);
    
    Если СсылкаНаОбработку.Пустая() Тогда
        Предупреждение("В справочнике ""Внешние обработки"" не найдена обработка: """ + НаименованиеОбработки + """!");
        Возврат;
    КонецЕсли;
    
    // 2. Получаем двоичные данные файла обработки из хранилища значений
    ДвоичныеДанные = СсылкаНаОбработку.ХранилищеВнешнейОбработки.Получить();
    Если ДвоичныеДанные = Неопределено Тогда
        Предупреждение("Файл внешней обработки пуст или поврежден!");
        Возврат;
    КонецЕсли;
    
    // 3. Записываем временный файл на диск локального компьютера пользователя
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("epf");
    Попытка
        ДвоичныеДанные.Записать(ИмяВременногоФайла);
    Исключение
        Сообщить("Не удалось записать временный файл на диск! Ошибка: " + ОписаниеОшибки(), СтатусСообщения.Важное);
        Возврат;
    КонецПопытки;
    
    // 4. Подключаем обработку и выполняем ее логику
    Попытка
        // Создаем объект внешней обработки во временном каталоге
        ВнешняяОбр = ВнешниеОбработки.Создать(ИмяВременногоФайла);
        
        // Большинство типовых внешних обработок ТЧ имеют экспортный метод Инициализировать().
        // Передаем туда ссылку на текущий документ, имя ТЧ и сам элемент управления табличной части.
        ВнешняяОбр.Инициализировать(ЭтотОбъект, "Товары", ЭлементыФормы.Товары);
        
        // Если форма документа должна быть модифицирована (появилась звездочка изменения)
        ЭтотОбъект.Модифицированность = Истина;
    Исключение
        ОбщегоНазначения.СообщитьОбОшибке(ОписаниеОшибки(),, "Ошибка выполнения внешней обработки!");
    КонецПопытки;
    
    // 5. Обязательно очищаем за собой временные файлы во избежание захламления диска
    Попытка
        УдалитьФайлы(ИмяВременногоФайла);
    Исключение
        // Ошибка удаления не критична для пользователя, можем проигнорировать
    КонецПопытки;

КонецПроцедуры

Преимущества данного метода:

---

Вариант 3. Особенности для Управляемых Форм (на будущее)

Если в будущем планируется перевод вашей конфигурации на управляемый интерфейс (платформа 1С:Предприятие 8.3 в режиме такси с использованием Библиотеки Стандартных Подсистем (БСП)), архитектура работы с внешними обработками претерпит изменения. Полезно знать эти особенности заранее:

  1. В управляемых формах за интеграцию отвечает подсистема «Дополнительные отчеты и обработки».
  2. Регистрация обработок происходит через функцию СведенияОВнешнейОбработке() в модуле объекта внешней обработки. В параметрах команды можно указать тип вызова (например, ВызовКлиентскогоМетода или ВызовСерверногоМетода).
  3. По умолчанию БСП помещает все команды заполнения в группу «Заполнение» командной панели формы. Чтобы вывести команду напрямую на панель, разработчики прибегают к программной модификации формы в процедуре ПриСозданииНаСервере формы документа, перенося созданную БСП кнопку из группы заполнения в корень командной панели и сбрасывая свойство ТолькоВоВсехДействиях.

---

Резюме и рекомендации

Мы проанализировали проблему вывода кнопки внешней обработки табличной части на командную панель в обычных формах и рассмотрели практические варианты ее решения.

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

Если же вам требуется быстрая реализация «здесь и сейчас», либо вы хотите иметь полный контроль над передаваемыми параметрами в обработку (например, передавать дополнительные контекстные переменные формы, которые не предусмотрены стандартным механизмом Инициализировать), смело используйте Вариант 2.

← На главную