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