Почему внешняя обработка заполнения табличной части работает в списке, но не активна в форме документа и как это исправить

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

При разработке в современных конфигурациях на базе Библиотеки стандартных подсистем (БСП), таких как 1С:Бухгалтерия 3.0, ЗУП 3.1 или ERP, программисты часто сталкиваются с ситуацией: внешняя обработка заполнения объекта зарегистрирована, кнопка «Заполнить» видна в форме списка, но в самой форме документа она либо отсутствует, либо не реагирует на нажатие. Рассмотрим подробно, как правильно интегрировать самописный документ в механизм дополнительных отчетов и обработок и какие программные «якоря» необходимо расставить в коде.

Шаг 1. Настройка метаданных в конфигураторе

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

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

Шаг 2. Регистрация обработки в модуле объекта

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

Рассмотрим пример правильного заполнения таблицы команд:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
    ПараметрыРегистрации.Назначение.Добавить("Документ.ВашСамописныйДокумент");
    ПараметрыРегистрации.Наименование = "Заполнение ТЧ: Пример";
    
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Заполнить данными...";
    НоваяКоманда.Идентификатор = "ОсновнаяКоманда";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    
    Возврат ПараметрыРегистрации;
КонецФункции

Шаг 3. Внедрение кода в модуль формы документа

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

В процедуре ПриСозданииНаСервере формы документа обязательно должен присутствовать вызов инициализации подсистемы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки
    ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере(ЭтаФорма);
    // Конец СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки
КонецПроцедуры

Важный нюанс: Обратите внимание на аргумент ЭтаФорма. В некоторых старых примерах встречается ЭтотОбъект, что в контексте управляемой формы является ошибкой и может привести к некорректной работе команд.

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


&НаКлиенте
Процедура Подключаемый_ВыполнитьНазначаемуюКоманду(Команда)
    Если НЕ ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьНазначаемуюКомандуНаКлиенте(ЭтаФорма, Команда.Имя) Тогда
        РезультатВыполнения = Неопределено;
        ДополнительныеОтчетыИОбработкиВыполнитьНазначаемуюКомандуНаСервере(Команда.Имя, РезультатВыполнения);
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ДополнительныеОтчетыИОбработкиВыполнитьНазначаемуюКомандуНаСервере(ИмяКоманды, РезультатВыполнения)
    ДополнительныеОтчетыИОбработки.ВыполнитьНазначаемуюКомандуНаСервере(ЭтаФорма, ИмяКоманды, РезультатВыполнения);
КонецПроцедуры

Без этих процедур нажатие на кнопку в форме документа просто не будет перехвачено системой.

Шаг 4. Обработка незаписанных объектов

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

Если вы используете ВызовКлиентскогоМетода, то в модуле формы вашей обработки процедура должна выглядеть так:


&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    // Параметр ОбъектыНазначенияМассив[0] содержит ссылку или данные формы
    // Для новых документов изменения нужно возвращать через Владельца формы (ЭтаФорма.Владелец)
    // Или через структуру РезультатВыполнения, если используется серверный метод
КонецПроцедуры

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

Шаг 5. Тонкости отладки и безопасного режима

Рассмотрим ситуацию, когда код внедрен, но ничего не происходит. Выясним возможные причины:

  1. Безопасный режим: По умолчанию внешние обработки в 1С запускаются в безопасном режиме. Если ваша обработка использует COM-соединения, работу с файловой системой или внешние HTTP-запросы, она может «тихо» завершаться с ошибкой прав доступа. При регистрации обработки в справочнике «Дополнительные отчеты и обработки» попробуйте временно отключить безопасный режим для проверки.
  2. Имена командных панелей: БСП ищет на форме стандартные группы команд, такие как ГруппаГлобальныеКоманды. Если на вашей форме командная панель называется иначе или создана программно с особыми настройками, кнопки могут просто не отобразиться. Проверьте свойство Состав команд у основной командной панели формы.
  3. Кэширование: При внесении изменений в состав типов общей команды или определяемых типов часто требуется очистка серверного кэша или перезапуск сеанса, чтобы изменения вступили в силу для подсистемы формирования интерфейса.

Подведем итог: для успешной работы заполнения ТЧ в форме самописного документа необходимо не только зарегистрировать обработку, но и «подключить» форму документа к БСП через вызов ПриСозданииНаСервере и добавление подключаемых процедур выполнения команд. Соблюдение этой структуры гарантирует стабильную работу ваших доработок в любых типовых конфигурациях.

← На главную