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