Как заставить внешнюю обработку заполнения ТЧ работать в нетиповом документе 1С?

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

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

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

Шаг 1. Регистрация типа объекта в метаданных

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

Рассмотрим, какие объекты метаданных нужно отредактировать:

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

Шаг 2. Подготовка функции СведенияОВнешнейОбработке

Для того чтобы система поняла, что наша обработка предназначена именно для заполнения табличной части, мы должны правильно описать её в модуле объекта внешней обработки. Проанализируем стандартный пример реализации этой функции:


Функция СведенияОВнешнейОбработке() Экспорт
    
    Назначения = Новый Массив;
    // Указываем именно ваш нетиповой документ
    Назначения.Добавить("Документ.экзАктСверкиКоличество"); 
    
    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "ЗаполнениеОбъекта"); // Ключевой параметр для ТЧ
    ПараметрыРегистрации.Вставить("Назначение", Назначения);
    ПараметрыРегистрации.Вставить("Наименование", "Заполнение акта сверки по количеству");
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
    
    Команды = ПолучитьТаблицуКоманд();
    // Обратите внимание на тип вызова: ВызовКлиентскогоМетода или ВызовСерверногоМетода
    ДобавитьКоманду(Команды, "Заполнить акт", "ЗаполнитьПоКоличеству", "ВызовКлиентскогоМетода", Ложь);
    
    ПараметрыРегистрации.Вставить("Команды", Команды);
    
    Возврат ПараметрыРегистрации;
    
КонецФункции

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

Шаг 3. Внедрение программного интерфейса в форму документа

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

Разберем по шагам, что нужно добавить в модуль формы вашего нетипового документа:

1. Инициализация при создании формы. В процедуре ПриСозданииНаСервере мы должны вызвать инициализацию подключаемых команд:


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

2. Обновление команд при открытии. Это необходимо для актуализации видимости и доступности кнопок:


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

3. Обновление при чтении данных. Чтобы команды корректно работали после записи или перечитывания документа, добавим вызов в ПриЧтенииНаСервере:


&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    // СтандартныеПодсистемы.ПодключаемыеКоманды
    ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, ТекущийОбъект);
    // Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры

Шаг 4. Добавление служебных процедур-обработчиков

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

Скопируйте следующие стандартные процедуры в модуль формы вашего документа:


// СтандартныеПодсистемы.ПодключаемыеКоманды

&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
    ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры

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

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
    ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры

// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

Шаг 5. Создание групп на форме (интерфейсная часть)

Для того чтобы БСП знала, куда именно «рисовать» кнопку заполнения, на форме документа должны существовать группы с определенными именами. Обычно это:

Если вы хотите, чтобы кнопка была внутри подменю «Заполнить», создайте группу с этим именем в командной панели формы или в командной панели конкретной табличной части.

Особенности отладки внешних обработок заполнения

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

Советы по отладке:

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

← На главную