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