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