Почему не работает внешняя обработка заполнения формы в 1С и как это исправить?

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

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

Разберем детально, почему возникает такое поведение, как правильно формировать методы внешней обработки для варианта ЗаполнениеФормы и какие требования предъявляются к самой форме целевого документа.

Причина 1. Отсутствие вызовов подсистемы подключаемых команд в форме документа

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

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

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

  1. В серверной процедуре ПриСозданииНаСервере:
    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        
        // Инициализация механизма подключаемых команд БСП
        ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
        
    КонецПроцедуры
    
  2. В обработчике чтения или определения команд (например, ПриЧтенииНаСервере) — актуализация доступности команд.
  3. Экспортные клиентские и серверные процедуры перехвата подключаемых команд:
    
    &НаКлиенте
    Процедура Подключаемый_ВыполнитьКоманду(Команда)
        ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
    КонецПроцедуры
    
    &НаСервере
    Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, РезультатВыполнения)
        ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Объект, РезультатВыполнения);
    КонецПроцедуры
    
    &НаКлиенте
    Процедура Подключаемый_ОбновитьКоманды()
        ПодключаемыеКомандыКлиент.ОбновитьКоманды(ЭтотОбъект, Объект);
    КонецПроцедуры
    

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

Причина 2. Ошибки в структуре модуля внешней обработки

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

Посмотрим на корректный пример кода модуля объекта внешней обработки:


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

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

Особенности работы с типом команды «ЗаполнениеФормы»

Выделим ключевые нюансы, на которые необходимо обратить внимание при разработке:

  1. Контекст исполнения: Процедура ВыполнитьКоманду вызывается на стороне сервера, но в контексте переданной формы документа. Объект документа в базе данных при этом не перезаписывается автоматически, что позволяет пользователю интерактивно проверить заполненные данные перед сохранением.
  2. Доступ к данным формы: Ссылка на управляемую форму передается внутри структуры ПараметрыВыполнения.ЭтаФорма. Доступ к реквизитам шапки и строкам табличных частей выполняется через свойство ЭтаФорма.Объект.
  3. Флаг модифицированности: При изменении реквизитов через серверный контекст формы платформа не всегда автоматически взводит признак изменения. Рекомендуется явно указывать ЭтаФорма.Модифицированность = Истина;, чтобы при закрытии формы система предупредила пользователя о наличии несохраненных данных.
  4. Безопасный режим: Если в параметрах регистрации установлено БезопасныйРежим = Истина, обработка не сможет выполнять операции, требующие привилегированных прав (например, обращение к файловой системе сервера за пределами временных папок или работу с внешними COM-соединениями). Если эти операции необходимы для заполнения, безопасный режим следует отключить при регистрации.

Альтернативные варианты реализации

Если изменить модуль формы документа невозможно (конфигурация закрыта для редактирования, а расширения не используются), разберем альтернативные подходы:

  1. Тип команды «ВызовСерверногоМетода» (ЗаполнениеОбъекта): В данном режиме обработка получает массив ссылок ОбъектыНазначения и производит чтение, заполнение и непосредственную запись объекта через ДокументОбъект.Записать(). Этот способ подходит только для уже созданных и сохраненных в информационной базе документов.
  2. Тип команды «ОткрытиеФормы»: В состав обработки добавляется собственная управляемая форма. При открытии через свойство ВладелецФормы обработка получает ссылку на открытую форму документа, модифицирует необходимые реквизиты на клиенте или сервере и закрывает свою вспомогательную форму.
← На главную