Как получить объект или ссылку на объект-владелец ВПФ в 1С (УТ 11, ERP, КА)

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

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

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

Понимание вариантов запуска команд в БСП

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

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

Способ 1. Использование варианта «ОткрытиеФормы»

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

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

Выполним предварительную настройку управляемой формы нашей внешней обработки:

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

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


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

Способ 2. Использование варианта «ВызовКлиентскогоМетода»

Этот способ предоставляет разработчику максимальный контроль. Вместо автоматического открытия основной формы БСП вызывает предопределенную процедуру в модуле этой формы. Это позволяет выполнить предварительные проверки на клиенте и при необходимости открыть вообще любую другую форму вашей обработки.

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

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


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

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

Возврат управления стандартному механизму печати БСП

Очень частая ошибка среди начинающих программистов 1С заключается в том, что после интерактивного выбора параметров в форме они выводят результирующий табличный документ методом ТабличныйДокумент.Показать(). Это лишает пользователей стандартных и крайне удобных функций БСП: отправки печатной формы по электронной почте, сохранения в PDF/Excel, печати комплектов и автоматического логирования отправки.

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


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

Особенности работы в безопасном режиме БСП

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

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

Например, вместо небезопасного обращения к реквизитам через точку (которое может вызывать избыточные запросы к базе данных или блокироваться правами доступа):


// Не рекомендуется в управляемом приложении
КонтрагентНаименование = СсылкаНаДокумент.Контрагент.Наименование;

Используйте стандартизированный метод БСП:


// Рекомендуемый безопасный вариант
Наименование = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаДокумент, "Контрагент.Наименование");

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

← На главную