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

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

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

Попытки решить эту задачу «в лоб» через стандартные процедуры модуля объекта приводят к ошибкам вроде «Интерактивные операции недоступны» или «Процедура ОткрытьФорму не определена». В этой статье мы подробно разберем, почему возникают эти ошибки, проанализируем контекст выполнения кода и пошагово реализуем правильную схему работы.

Выясняем причины ошибок: почему не работает простой код?

Рассмотрим типичные ошибки, которые допускают начинающие разработчики при решении этой задачи:

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

Чтобы обойти эти ограничения, нам потребуется перенести логику запуска на клиентскую сторону. Сделать это можно двумя основными способами.

---

Способ №1. Использование клиентского метода БСП (Рекомендуемый)

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

Разберем этот вариант подробно по шагам.

Шаг 1. Настройка регистрации в модуле объекта

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


Функция СведенияОВнешнейОбработке() Экспорт

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

КонецФункции

Шаг 2. Подготовка форм во внешней обработке

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

Шаг 3. Реализация диспетчера в основной форме обработки

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


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

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

Шаг 4. Возврат выбранных данных из формы параметров

В модуле формы ФормаВыбораКомиссии после того, как пользователь выбрал необходимые элементы (например, в табличной части или списке) и нажал кнопку «ОК» (или «Продолжить печать»), мы должны закрыть эту форму и передать выбранные данные обратно на клиент:


&НаКлиенте
Процедура КомандаОК(Команда)
    
    // Собираем выбранные пользователем данные
    СтруктураРезультата = Новый Структура;
    
    // Пример получения массива выбранных физлиц из реквизитов формы выбора
    ВыбранныеЛица = ПолучитьМассивВыбранныхЧленовКомиссии(); 
    СтруктураРезультата.Вставить("ЧленыКомиссии", ВыбранныеЛица);
    
    // Закрываем форму параметров, передавая результат обратно в ОписаниеОповещения
    Закрыть(СтруктураРезультата);
    
КонецПроцедуры

Шаг 5. Получение параметров и вывод печатной формы на экран

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


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

&НаСервере
Функция ПолучитьНавигационнуюСсылкаОбработки()
    // Возвращаем временную ссылку на внешнюю обработку в справочнике БСП
    Возврат ПолучитьНавигационнуюСсылка(РеквизитФормыВЗначение("Объект"));
КонецФункции

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

---

Способ №2. Перенаправление через проверку параметров при открытии

Рассмотрим альтернативный способ, который часто применяется в простых обработках (не обязательно печатных формах). Идея заключается в следующем: при открытии основной формы обработки мы проверяем, переданы ли нам заполненные параметры комиссии. Если параметров нет, мы открываем форму выбора параметров, отменяя при этом открытие основной формы. После выбора параметров мы повторно открываем основную форму, но уже с переданными значениями.

Проанализируем программную реализацию этого сценария в модуле основной формы обработки:


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

КонецПроцедуры

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

Чтобы этот способ работал корректно, в параметрах вашей основной формы обязательно должен быть создан параметр с именем ЧленыКомиссии (тип значения должен соответствовать передаваемому типу данных, например, Массив или СписокЗначений).

---

Резюме

Мы подробно разобрали, как реализовать интерактивный выбор параметров перед открытием внешних печатных форм и обработок в 1С 8.3. Использование клиентского метода БСП (Способ №1) является наиболее надежным, стабильным и гибким вариантом, так как полностью соответствует стандартам разработки фирмы «1С» для современных конфигураций.

← На главную