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