Как открыть форму выбора перед формированием печатной формы в 1С:Бухгалтерия 3.0?

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

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

Причина возникновения проблемы

Проанализируем ситуацию: когда в функции СведенияОВнешнейОбработке для команды печати указан тип использования ВызовСерверногоМетода, система сразу обращается к модулю объекта обработки. Платформа 1С строго разделяет клиентский и серверный код. Любая попытка вызвать метод ОткрытьФорму() или ПоказатьВыборЭлемента() внутри серверного вызова приведет к ошибке: "Интерактивные методы недоступны на сервере".

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

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

Это наиболее надежный и гибкий метод. Рассмотрим по шагам, как его реализовать.

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


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

Шаг 2. Создание основной формы обработки. Теперь при нажатии на кнопку печати система будет открывать форму нашей обработки. Создадим в обработке форму и назовем ее ФормаПараметров. На форме разместим:

  1. Реквизит СтатьяДДС (тип: СправочникСсылка.СтатьиДвиженияДенежныхСредств).
  2. Кнопку "Сформировать", которая инициирует процесс печати.

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


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

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

Способ 2: Интерактивный выбор через ОписаниеОповещения

Если мы не хотим создавать отдельную форму для обработки, а нужно просто вывести стандартное окно выбора справочника, мы можем воспользоваться методом ПоказатьВыборЭлемента. Однако это все равно должно происходить на клиенте. Выясним, как передать управление.

Рассмотрим пример кода на стороне клиента, который можно использовать, если вы переопределяете команду печати в форме документа:


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

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

Обработка параметров на стороне сервера

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

Проанализируем структуру серверной функции:


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

Работа с массовой печатью

Важный нюанс: если пользователь выделяет в списке сразу 10 документов и нажимает "Печать", программа должна понимать, нужно ли выбрать одну статью для всех документов или для каждого свою.

  1. Одна статья на весь пакет: Реализуется через «Способ 1». Выбор происходит один раз в форме обработки, затем массив ссылок передается на сервер.
  2. Разные статьи для каждого документа: В этом случае в форме обработки стоит разместить ТаблицуЗначений, заполнить ее списком выбранных документов и добавить колонку для выбора статьи ДДС напротив каждой строки.

Посмотрим на пример формирования макета с использованием полученного параметра СтатьяДДС:


Функция СформироватьПечатнуюФормуНаСервере(МассивОбъектов, СтатьяДДС)
    
    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.АвтоМасштаб = Истина;
    
    Макет = ПолучитьМакет("ПоОбъекту");
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    
    Для Каждого Ссылка Из МассивОбъектов Цикл
        
        // Заполняем параметры из документа
        ОбластьШапка.Параметры.Заполнить(Ссылка);
        
        // Используем переданный параметр статьи ДДС
        Если ЗначениеЗаполнено(СтатьяДДС) Тогда
            ОбластьШапка.Параметры.СтатьяПредставление = СтатьяДДС.Наименование;
        Иначе
            ОбластьШапка.Параметры.СтатьяПредставление = "Не указана";
        КонецЕсли;
        
        ТабДокумент.Вывести(ОбластьШапка);
        
        Если МассивОбъектов.Количество() > 1 Тогда
            ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
        КонецЕсли;
        
    КонецЦикла;
    
    Возврат ТабДокумент;
    
КонецФункции

Подведение итогов

Мы выяснили, что для решения задачи взаимодействия с пользователем при печати необходимо:

Такой подход сохраняет типовую логику конфигурации 1С:Бухгалтерия 3.0 и обеспечивает стабильную работу печатной формы как в файловом, так и в клиент-серверном вариантах работы системы.

← На главную