При разработке расширений или внешних обработок для систем на базе 1С:Предприятие 8.3 часто возникает задача: добавить кнопку в меню «Отчеты» или «Заполнить», которая не просто печатает форму, а выполняет сложные действия, например, создает связанные документы или открывает дополнительное окно для уточнения данных. Чтобы упростить этот процесс, можно использовать шаблон дополнительной обработки с сохранением параметров в качестве основы. В этой статье мы разберем, как правильно настроить механизм БСП (Библиотеки стандартных подсистем), чтобы кнопка появилась в нужном месте, и как корректно передать ссылку на текущий документ в форму обработки.
Рассмотрим ситуацию, когда разработчик пытается использовать вид ПечатнаяФорма для действий, не связанных напрямую с выводом табличного документа. В модуле объекта внешней обработки функция СведенияОВнешнейОбработке определяет, как 1С будет взаимодействовать с этим файлом. Если указать Вид = "ПечатнаяФорма", система будет ожидать, что на выходе она обязательно получит заполненный ТабличныйДокумент.
Если ваша обработка должна просто создавать документы или открывать форму, использование этого вида приведет к ошибке: «Метод объекта не обнаружен» или жалобам на отсутствие табличного документа при возврате Неопределено. Проанализируем правильные варианты видов обработки:
Для нашей задачи, когда нужно открыть форму обработки из документа, лучше всего подходит ДополнительнаяОбработка или СозданиеСвязанныхОбъектов с типом вызова ВызовКлиентскогоМетода.
Отредактируем функцию СведенияОВнешнейОбработке в модуле объекта. Нам нужно указать, что команда должна вызываться на клиенте, чтобы мы могли управлять открытием форм. Посмотрим на пример кода:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.ЗаказНаЭмиссиюКодовМаркировкиСУЗ");
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "Запуск обработки создания КМ");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ПараметрыРегистрации.Вставить("Версия", "1.1");
ТаблицаКоманд = ПолучитьТаблицуКоманд();
// Обратите внимание на тип вызова: ВызовКлиентскогоМетода
ДобавитьКоманду(ТаблицаКоманд, "ОткрытьФормуСоздания", "Создать документы КМ", "ВызовКлиентскогоМетода", Истина);
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Здесь крайне важно использование строки ВызовКлиентскогоМетода. Это заставляет систему искать экспортную процедуру Печать (или процедуру с именем команды) в модуле формы обработки, а не в модуле объекта.
Теперь перейдем в модуль формы нашей внешней обработки. Нам необходимо создать процедуру, которая примет управление от БСП. Выясним причину, по которой у автора темы терялась ссылка: он пытался передать массив объектов в параметры формы, но не «поймал» их правильно при инициализации этой формы. Для анализа структуры и состава элементов на этапе отладки можно использовать редактор форм в режиме предприятия.
Разберем, как должна выглядеть клиентская процедура запуска:
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, МассивОбъектов) Экспорт
// МассивОбъектов содержит ссылку на документ, из которого нажали кнопку
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ОбъектыНазначения", МассивОбъектов);
// Открываем эту же форму обработки, передавая параметры
ОткрытьФорму("ВнешняяОбработка.ДозаказатьКМ.Форма.Форма", ПараметрыОткрытия);
КонецПроцедуры
Важный момент: При вызове ОткрытьФорму данные попадают в свойство Параметры открываемой формы, но они не записываются автоматически в реквизиты. Если вы хотите изменить интерфейс программно, полезно изучить модификатор управляемых форм, который позволяет описывать изменения текстом.
Для того чтобы ссылка на документ была доступна во всех процедурах (например, при нажатии на кнопку «Сформировать» уже внутри обработки), мы должны выполнить следующие действия:
ДокументСсылка и типом, соответствующим вашему документу.ПриСозданииНаСервере.Проанализируем серверный код инициализации:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, переданы ли объекты назначения из БСП
Если Параметры.Свойство("ОбъектыНазначения") И ТипЗнч(Параметры.ОбъектыНазначения) = Тип("Массив") Тогда
Если Параметры.ОбъектыНазначения.Количество() > 0 Тогда
// Записываем первую ссылку в реквизит формы
ЭтаФорма.ДокументСсылка = Параметры.ОбъектыНазначения[0];
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Теперь, когда ссылка сохранена в ЭтаФорма.ДокументСсылка, она будет доступна в любой другой процедуре &НаКлиенте или &НаСервере в рамках этой формы. Например, в обработчике нажатия кнопки формирования отчета:
&НаКлиенте
Процедура СформироватьОтчет(Команда)
Если ЗначениеЗаполнено(ДокументСсылка) Тогда
// Теперь Ссылка на документ всегда под рукой
Сообщить("Работаем с документом: " + Строка(ДокументСсылка));
СформироватьНаСервере(ДокументСсылка);
Иначе
Сообщить("Ошибка: Ссылка на документ не найдена!");
КонецЕсли;
КонецПроцедуры
Рассмотрим ситуацию: нужно ли нам вообще открывать форму обработки? Если пользователю не требуется вводить дополнительные параметры, лучше использовать ВызовСерверногоМетода. В этом случае логика переносится в модуль объекта в процедуру ВыполнитьКоманду. Это работает быстрее, так как не тратится время на отрисовку интерфейса формы. Если же форма все-таки нужна, хорошим тоном будет реализация сохранения настроек формы для всех пользователей, чтобы введенные данные не терялись при следующем запуске.
Однако, если ваша задача — показать пользователю промежуточные результаты или дать выбор (как в случае с заказом кодов маркировки), то текущий подход с ВызовКлиентскогоМетода и сохранением ссылки в ПриСозданииНаСервере является эталонным для управляемых форм 1С 8.3.
Резюмируем: чтобы данные не пропадали, всегда используйте связку «Параметры открытия -> Реквизит формы -> ПриСозданииНаСервере». Это гарантирует стабильную работу внешней обработки в любых сценариях использования БСП.