Как добавить кнопку для вызова внешней обработки на форму документа в 1С:УТ 11

Программист 1С:Управление торговлей Торговля и дистрибуция
← На главную

При разработке расширений или внешних инструментов для современных конфигураций 1С (таких как УТ 11, ERP 2.5 или КА 2.5) программисты часто сталкиваются с необходимостью добавить кнопку на форму существующего документа. Основная задача — вызвать внешнюю обработку, например, для загрузки данных из Excel, не изменяя саму конфигурацию. Рассмотрим наиболее эффективные способы решения этой задачи, опираясь на механизмы БСП (Библиотеки стандартных подсистем).

Вариант 1. Стандартный механизм БСП через «Заполнение объекта»

Самый правильный и «чистый» способ добавить кнопку на форму документа в типовых конфигурациях — это использовать механизм дополнительных отчетов и обработок. В этом случае нам не нужно вручную рисовать кнопку в коде или расширении. Система сама добавит её в меню «Заполнение», если мы правильно опишем параметры регистрации.

Проанализируем структуру функции СведенияОВнешнейОбработке, которую необходимо разместить в модуле объекта внешней обработки. Основным моментом здесь является выбор правильного вида обработки — ВидОбработкиЗаполнениеОбъекта.

Разберем программный код регистрации по шагам:


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

    ПараметрыРегистрации = Новый Структура;
    // Используем стандартную константу БСП для вида обработки
    ПараметрыРегистрации.Вставить("Вид", ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта());
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", "Загрузка состава номенклатуры из XLS");
    ПараметрыРегистрации.Вставить("Версия", "1.1");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    ПараметрыРегистрации.Вставить("Информация", "Обработка для загрузки данных в табличную часть из Excel");

    // Создаем таблицу команд
    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    
    // Добавляем команду открытия формы
    // Идентификатор команды, Представление, Использование, ПоказыватьОповещение, Модификатор
    ДобавитьКоманду(ТаблицаКоманд, 
                   "ОткрытьЗагрузкуExcel", 
                   "Загрузить из Excel...", 
                   "ОткрытиеФормы", 
                   Ложь);

    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);

    Возврат ПараметрыРегистрации;
КонецФункции

В данном примере мы используем тип использования ОткрытиеФормы. Это означает, что при нажатии на кнопку в документе система просто откроет основную форму нашей внешней обработки. Важно понимать: чтобы кнопка появилась в интерфейсе, обработку нужно зарегистрировать в справочнике «Дополнительные отчеты и обработки» в пользовательском режиме (раздел НСИ и Администрирование).

Вариант 2. Создание кнопки через расширение и программный вызов

Иногда требования бизнеса специфичны: кнопку нужно расположить не в стандартном подменю «Заполнение», а в конкретном месте формы, например, непосредственно над табличной частью «Товары». В этом случае нам потребуется создать Расширение конфигурации.

Рассмотрим алгоритм действий в расширении:

  1. Добавляем форму документа СписаниеТоваров в расширение.
  2. В редакторе формы создаем новую Команду (например, ЗагрузитьИзExcel).
  3. Перетаскиваем эту команду на командную панель табличной части Товары, создавая тем самым кнопку.
  4. Пишем обработчик этой команды.

Проанализируем ситуацию: просто так вызвать внешнюю обработку из кода клиентского приложения нельзя, так как объект Справочники недоступен на клиенте напрямую для поиска по наименованию (как пытался сделать автор в сообщении 14). Выясним, как сделать это правильно.

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


&НаКлиенте
Процедура ЗагрузитьИзExcel(Команда)
    
    // Сначала нам нужно получить ссылку на внешнюю обработку на сервере
    СсылкаНаОбработку = ПолучитьСсылкуНаВнешнююОбработкуНаСервере("Загрузка состава номенклатуры из XLS");
    
    Если СсылкаНаОбработку.Пустая() Тогда
        Сообщить("Внешняя обработка не найдена в справочнике!");
        Возврат;
    КонецЕсли;

    // Параметры для открытия
    ПараметрыФормы = Новый Структура;
    // Передаем ссылку на текущий документ, чтобы обработка знала, куда грузить данные
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить(Объект.Ссылка);
    ПараметрыФормы.Вставить("ОбъектыНазначения", МассивНазначений);

    // Вызываем стандартный метод подключения
    ИмяОбработки = ПодключитьОбработкуНаСервере(СсылкаНаОбработку);
    
    // Открываем форму обработки
    ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма.Форма", ПараметрыФормы, ЭтаФорма);
    
КонецПроцедуры

Обратите внимание на использование параметра ОбъектыНазначения. Это стандарт БСП. В форме самой внешней обработки в процедуре ПриСозданииНаСервере мы должны прочитать этот параметр, чтобы понять, какой именно документ инициировал вызов.

Особенности передачи контекста и работы с данными

Рассмотрим подробнее, как связать форму документа и форму внешней обработки. Когда вы открываете форму обработки из документа, вам часто нужно, чтобы после завершения выбора файла в Excel данные сразу попали в таблицу документа. Для этого удобно использовать Оповещение или передавать ЭтаФорма в качестве владельца.

Если вы выбрали путь ВидОбработкиЗаполнениеОбъекта, то в модуле формы внешней обработки рекомендуется реализовать экспортную процедуру:


&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
    // Здесь код открытия диалога выбора файла Excel
    // И последующая обработка данных
КонецПроцедуры

Важный момент: если вы используете тип команды ВызовКлиентскогоМетода, БСП автоматически ищет эту процедуру в форме обработки. Это позволяет взаимодействовать с формой владельца (документа) напрямую через свойство ВладелецФормы.

Почему не стоит добавлять обработку напрямую в конфигурацию?

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

Подведем итог: если вам достаточно, чтобы кнопка была в меню «Заполнение», используйте СведенияОВнешнейОбработке с видом ЗаполнениеОбъекта. Если же дизайн интерфейса требует кнопку в конкретном месте — создавайте расширение и вызывайте внешнюю обработку программно через методы БСП ДополнительныеОтчетыИОбработки.

← На главную