Как получить ссылку на документ во внешней печатной форме при открытии формы?

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

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

Разберем причину возникновения ошибки

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

Выясним причину этого поведения. В управляемых формах 1С реквизит Объект в модуле формы обработки ссылается на саму обработку, а не на документ-основание. Поскольку внешняя обработка — это объект метаданных типа «Обработка», у нее нет ссылки в базе данных (пока она не записана как элемент справочника), и уж тем более она ничего не знает о документе «Прием на работу» или «Реализация товаров», из которого была вызвана. Чтобы получить данные документа, нам нужно обратиться к механизму параметров, которые БСП передает при открытии.

Шаг 1. Правильная регистрация внешней печатной формы

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


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

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

Шаг 2. Получение ссылки в модуле формы

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

Рассмотрим, как правильно извлечь эту ссылку в обработчике ПриСозданииНаСервере модуля формы:


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

Важный момент: Если вам нужно, чтобы ссылка была доступна и в других процедурах формы (например, при нажатии кнопок), создайте реквизит формы с именем ДокументСсылка и запишите значение туда: ЭтаФорма.ДокументСсылка = МассивСсылок[0];.

Шаг 3. Использование данных документа

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


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

Как передать данные из модуля объекта в модуль формы?

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

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

Пример кода в модуле объекта:


Функция СформироватьТаблицуДанных(СсылкаНаДокумент) Экспорт
    // Здесь может быть сложный запрос к базе данных
    Результат = "Данные для документа " + СсылкаНаДокумент;
    Возврат Результат;
КонецФункции

Пример вызова из модуля формы:


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

Резюме и рекомендации

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

Используя этот подход, вы сможете легко создавать интерактивные печатные формы, которые позволяют пользователю уточнять параметры перед выводом на печать, сохраняя при этом полную связь с документом-основанием.

← На главную