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