Как на форму документа добавить кнопку для запуска внешней обработки и передать в неё ссылку

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

При разработке расширений или внешних обработок для систем на базе 1С:Предприятие 8.3 часто возникает задача: добавить кнопку в меню «Отчеты» или «Заполнить», которая не просто печатает форму, а выполняет сложные действия, например, создает связанные документы или открывает дополнительное окно для уточнения данных. Чтобы упростить этот процесс, можно использовать шаблон дополнительной обработки с сохранением параметров в качестве основы. В этой статье мы разберем, как правильно настроить механизм БСП (Библиотеки стандартных подсистем), чтобы кнопка появилась в нужном месте, и как корректно передать ссылку на текущий документ в форму обработки.

Разбор первой ошибки: выбор вида обработки

Рассмотрим ситуацию, когда разработчик пытается использовать вид ПечатнаяФорма для действий, не связанных напрямую с выводом табличного документа. В модуле объекта внешней обработки функция СведенияОВнешнейОбработке определяет, как 1С будет взаимодействовать с этим файлом. Если указать Вид = "ПечатнаяФорма", система будет ожидать, что на выходе она обязательно получит заполненный ТабличныйДокумент.

Если ваша обработка должна просто создавать документы или открывать форму, использование этого вида приведет к ошибке: «Метод объекта не обнаружен» или жалобам на отсутствие табличного документа при возврате Неопределено. Проанализируем правильные варианты видов обработки:

  1. СозданиеСвязанныхОбъектов: используется, если основная цель — создать новый документ на основании текущего.
  2. ЗаполнениеОбъекта: подходит для изменения реквизитов текущего документа «на лету».
  3. ДополнительнаяОбработка: универсальный вариант для запуска произвольного кода.

Для нашей задачи, когда нужно открыть форму обработки из документа, лучше всего подходит ДополнительнаяОбработка или СозданиеСвязанныхОбъектов с типом вызова ВызовКлиентскогоМетода.

Шаг 1. Правильная регистрация команды

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


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

    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    // Обратите внимание на тип вызова: ВызовКлиентскогоМетода
    ДобавитьКоманду(ТаблицаКоманд, "ОткрытьФормуСоздания", "Создать документы КМ", "ВызовКлиентскогоМетода", Истина);
    
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
    Возврат ПараметрыРегистрации;
КонецФункции

Здесь крайне важно использование строки ВызовКлиентскогоМетода. Это заставляет систему искать экспортную процедуру Печать (или процедуру с именем команды) в модуле формы обработки, а не в модуле объекта.

Шаг 2. Обработка вызова в модуле формы

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

Разберем, как должна выглядеть клиентская процедура запуска:


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

Важный момент: При вызове ОткрытьФорму данные попадают в свойство Параметры открываемой формы, но они не записываются автоматически в реквизиты. Если вы хотите изменить интерфейс программно, полезно изучить модификатор управляемых форм, который позволяет описывать изменения текстом.

Шаг 3. Сохранение ссылки в реквизитах формы

Для того чтобы ссылка на документ была доступна во всех процедурах (например, при нажатии на кнопку «Сформировать» уже внутри обработки), мы должны выполнить следующие действия:

  1. Создать Реквизит формы с именем ДокументСсылка и типом, соответствующим вашему документу.
  2. В модуле формы реализовать обработчик ПриСозданииНаСервере.

Проанализируем серверный код инициализации:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Проверяем, переданы ли объекты назначения из БСП
    Если Параметры.Свойство("ОбъектыНазначения") И ТипЗнч(Параметры.ОбъектыНазначения) = Тип("Массив") Тогда
        Если Параметры.ОбъектыНазначения.Количество() > 0 Тогда
            // Записываем первую ссылку в реквизит формы
            ЭтаФорма.ДокументСсылка = Параметры.ОбъектыНазначения[0];
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Теперь, когда ссылка сохранена в ЭтаФорма.ДокументСсылка, она будет доступна в любой другой процедуре &НаКлиенте или &НаСервере в рамках этой формы. Например, в обработчике нажатия кнопки формирования отчета:


&НаКлиенте
Процедура СформироватьОтчет(Команда)
    Если ЗначениеЗаполнено(ДокументСсылка) Тогда
        // Теперь Ссылка на документ всегда под рукой
        Сообщить("Работаем с документом: " + Строка(ДокументСсылка));
        СформироватьНаСервере(ДокументСсылка);
    Иначе
        Сообщить("Ошибка: Ссылка на документ не найдена!");
    КонецЕсли;
КонецПроцедуры

Рекомендация по оптимизации архитектуры

Рассмотрим ситуацию: нужно ли нам вообще открывать форму обработки? Если пользователю не требуется вводить дополнительные параметры, лучше использовать ВызовСерверногоМетода. В этом случае логика переносится в модуль объекта в процедуру ВыполнитьКоманду. Это работает быстрее, так как не тратится время на отрисовку интерфейса формы. Если же форма все-таки нужна, хорошим тоном будет реализация сохранения настроек формы для всех пользователей, чтобы введенные данные не терялись при следующем запуске.

Однако, если ваша задача — показать пользователю промежуточные результаты или дать выбор (как в случае с заказом кодов маркировки), то текущий подход с ВызовКлиентскогоМетода и сохранением ссылки в ПриСозданииНаСервере является эталонным для управляемых форм 1С 8.3.

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

← На главную