При разработке в современных конфигурациях на базе Библиотеки стандартных подсистем (БСП), таких как 1С:Бухгалтерия 3.0, ЗУП 3.1 или ERP, программисты часто сталкиваются с ситуацией: внешняя обработка заполнения объекта зарегистрирована, кнопка «Заполнить» видна в форме списка, но в самой форме документа она либо отсутствует, либо не реагирует на нажатие. Рассмотрим подробно, как правильно интегрировать самописный документ в механизм дополнительных отчетов и обработок и какие программные «якоря» необходимо расставить в коде.
Прежде чем приступать к написанию кода, проанализируем настройки метаданных вашего документа. В БСП механизмы заполнения привязаны к определенным объектам через общие команды и определяемые типы. Выполним следующие действия:
ЗаполнениеОбъектов.ОбъектСДополнительнымиКомандами. Проверим, включен ли ваш документ в этот тип. Без этого подсистема дополнительных обработок может игнорировать объект на этапе формирования меню.Разберем структуру функции СведенияОВнешнейОбработке() в модуле объекта внешней обработки. Для того чтобы обработка корректно вызывалась из формы, важно правильно определить тип команды. Существует два основных варианта:
Рассмотрим пример правильного заполнения таблицы команд:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
ПараметрыРегистрации.Назначение.Добавить("Документ.ВашСамописныйДокумент");
ПараметрыРегистрации.Наименование = "Заполнение ТЧ: Пример";
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Заполнить данными...";
НоваяКоманда.Идентификатор = "ОсновнаяКоманда";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
НоваяКоманда.ПоказыватьОповещение = Истина;
Возврат ПараметрыРегистрации;
КонецФункции
Выясним основную причину, по которой команда может не работать в форме документа. В отличие от формы списка, форма документа требует явного вызова обработчиков БСП в своих модулях. Если документ самописный, эти процедуры в нем отсутствуют по умолчанию. Проанализируем, какие фрагменты кода необходимо добавить.
В процедуре ПриСозданииНаСервере формы документа обязательно должен присутствовать вызов инициализации подсистемы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки
ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере(ЭтаФорма);
// Конец СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки
КонецПроцедуры
Важный нюанс: Обратите внимание на аргумент ЭтаФорма. В некоторых старых примерах встречается ЭтотОбъект, что в контексте управляемой формы является ошибкой и может привести к некорректной работе команд.
Далее, для того чтобы форма могла обработать нажатие на динамически созданную кнопку, нужно добавить клиентский обработчик. Рассмотрим стандартный шаблон для БСП:
&НаКлиенте
Процедура Подключаемый_ВыполнитьНазначаемуюКоманду(Команда)
Если НЕ ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьНазначаемуюКомандуНаКлиенте(ЭтаФорма, Команда.Имя) Тогда
РезультатВыполнения = Неопределено;
ДополнительныеОтчетыИОбработкиВыполнитьНазначаемуюКомандуНаСервере(Команда.Имя, РезультатВыполнения);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ДополнительныеОтчетыИОбработкиВыполнитьНазначаемуюКомандуНаСервере(ИмяКоманды, РезультатВыполнения)
ДополнительныеОтчетыИОбработки.ВыполнитьНазначаемуюКомандуНаСервере(ЭтаФорма, ИмяКоманды, РезультатВыполнения);
КонецПроцедуры
Без этих процедур нажатие на кнопку в форме документа просто не будет перехвачено системой.
Проанализируем ситуацию, когда пользователь пытается заполнить табличную часть в новом, еще не записанном документе. В этом случае в ОбъектыНазначенияМассив, который передается во внешнюю обработку, придет не ссылка (так как её еще нет в базе), а идентификатор формы или копия данных.
Если вы используете ВызовКлиентскогоМетода, то в модуле формы вашей обработки процедура должна выглядеть так:
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
// Параметр ОбъектыНазначенияМассив[0] содержит ссылку или данные формы
// Для новых документов изменения нужно возвращать через Владельца формы (ЭтаФорма.Владелец)
// Или через структуру РезультатВыполнения, если используется серверный метод
КонецПроцедуры
Для того чтобы данные на форме обновились без перезаписи документа, рекомендуется использовать механизм Оповещений или напрямую работать с объектом формы, переданным в контексте клиентского вызова.
Рассмотрим ситуацию, когда код внедрен, но ничего не происходит. Выясним возможные причины:
COM-соединения, работу с файловой системой или внешние HTTP-запросы, она может «тихо» завершаться с ошибкой прав доступа. При регистрации обработки в справочнике «Дополнительные отчеты и обработки» попробуйте временно отключить безопасный режим для проверки.ГруппаГлобальныеКоманды. Если на вашей форме командная панель называется иначе или создана программно с особыми настройками, кнопки могут просто не отобразиться. Проверьте свойство Состав команд у основной командной панели формы.Подведем итог: для успешной работы заполнения ТЧ в форме самописного документа необходимо не только зарегистрировать обработку, но и «подключить» форму документа к БСП через вызов ПриСозданииНаСервере и добавление подключаемых процедур выполнения команд. Соблюдение этой структуры гарантирует стабильную работу ваших доработок в любых типовых конфигурациях.