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

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

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

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

Метод 1: Использование механизма «Печать комплекта»

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

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


Команда = Команды.Добавить();
Команда.Представление = НСтр("ru = 'УПД и Расходная накладная (комплект)'");
Команда.Идентификатор = "КомплектУПД_РН";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипВызоваКомандыПечатьФормы();
Команда.Порядок = 1;
// Указываем, что команда работает с комплектом
Команда.ДополнительныеПараметры.Вставить("ВКомплекте", Истина);

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

Метод 2: Программный вызов двух окон через клиентский метод БСП

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

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

Рассмотрим пример кода на стороне клиента:


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

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


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

Метод 3: Разделение страниц в одном окне (Альтернатива)

Часто пользователи просят «два окна», подразумевая, что они хотят видеть документы отдельно. Посмотрим на ситуацию с точки зрения юзабилити: управление множеством окон в 1С может быть утомительным. Мы можем предложить компромисс — вывести оба документа в одну форму предварительного просмотра, но жестко разделить их страницами.

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


ТабличныйДокумент = Новый ТабличныйДокумент;
// Выводим УПД
ВывестиУПД(ТабличныйДокумент, ДанныеУПД);

// Добавляем разделитель, чтобы документы не слипались
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();

// Выводим накладную
ВывестиРасходнуюНакладную(ТабличныйДокумент, ДанныеРН);

В этом случае при печати на принтер УПД и накладная гарантированно попадут на разные листы, а в режиме просмотра пользователь сможет просто прокрутить документ вниз, что зачастую быстрее, чем переключение между окнами через панель задач.

Особенности работы в Веб-клиенте

Нужно учитывать, что при реализации Метода 2 (два независимых вызова формы печати) в веб-интерфейсе браузер может посчитать второе окно «агрессивной рекламой» или нежелательным всплывающим окном. Если ваша организация планирует работать через браузер, строго рекомендуется использовать Метод 1 (Комплект документов). Это гарантирует, что все печатные формы будут сформированы в рамках одного сеанса взаимодействия с сервером и корректно отображены пользователю.

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

Выбор способа реализации зависит от конкретных задач автоматизации:

  1. Если нужно соответствовать стандартам 1С и обеспечить стабильность — выбираем комплект документов.
  2. Если требуется максимальное удобство при работе с двумя мониторами и используется тонкий клиент — реализуем программный вызов двух окон на клиенте.
  3. Если задача стоит в экономии времени при печати на бумагу — используем горизонтальный разделитель страниц.

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

← На главную