Почему внешняя обработка не отображается в формах списков и элементов и как это исправить?

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

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

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

Анализируем причину: почему «Вид» обработки имеет решающее значение

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

  1. ДополнительнаяОбработка: Предназначена для запуска из общих разделов (например, «Продажи» -> «Сервис» -> «Дополнительные обработки»). Даже если вы укажете объекты назначения, кнопка в форме самого документа или справочника автоматически не появится.
  2. ЗаполнениеОбъекта: Этот вид предназначен для работы непосредственно внутри форм. Команды такого типа БСП автоматически помещает в подменю «Заполнение» или «Изменить» на командной панели.
  3. ПечатнаяФорма: Команды отображаются в подменю «Печать».
  4. СозданиеСвязанныхОбъектов: Команды попадают в меню «Создать на основании».

Если ваша задача — добавить кнопку в форму списка документа РеализацияТоваровУслуг, то использование вида Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка будет ошибкой. Система просто не поймет, что команду нужно вывести на панель конкретной формы.

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

Рассмотрим пример кода, в котором программист пытается зарегистрировать обработку для загрузки данных из 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.

Проверка настроек видимости в интерфейсе

Если код написан верно, вид указан правильно, но кнопки все равно нет, проанализируем настройки самой конфигурации:

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

← На главную