Как передать ссылку на объект в форму внешней печатной формы на БСП

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

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

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

Настройка регистрации внешней обработки

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


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

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

Получение ссылки на объект в модуле формы

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

Разберем, как правильно перехватить эти данные в модуле формы. Для этого нам понадобится стандартный обработчик ПриСозданииНаСервере. Рекомендуется создать на форме реквизит (например, с именем СсылкаНаОбъект), чтобы хранить ссылку на документ в течение всего времени работы с формой.


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

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

Вызов функции печати из формы

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

Рассмотрим пример функции печати на форме:


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

Реализация логики в модуле объекта

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


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

Важные нюансы и рекомендации

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

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

← На главную