Как вывести маршрутный лист в отдельное окно при печати комплекта документов в УТ 11.5?

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

При работе в 1С:Управление торговлей 11.5 часто возникает ситуация, когда пользователю необходимо распечатать сразу несколько документов: например, УПД, ТТН и Маршрутный лист. Однако Маршрутный лист из-за своей специфики (большой объем данных, альбомная ориентация или особый масштаб) часто «портит картину», если его объединять в одну «простыню» (один ТабличныйДокумент) с остальными печатными формами. Рассмотрим подробнее, как реализовать вывод Маршрутного листа в отдельное окно, сохранив при этом удобство массовой печати.

В чем заключается проблема объединения документов?

Разберем техническую сторону вопроса. Когда мы используем метод Вывести() объекта ТабличныйДокумент, мы фактически добавляем содержимое одной печатной формы в конец другой. При этом 1С применяет единые настройки для всего итогового документа. Если УПД требует книжной ориентации и масштаба «по ширине страницы», а Маршрутный лист — альбомной ориентации, то после объединения один из документов неизбежно будет отображаться некорректно. Кроме того, пользователю бывает удобнее видеть общую ведомость в одном окне, а детализацию по доставке — в другом.

Решение №1: Двойной вызов формы печати на клиенте

Проанализируем самый прямой и эффективный способ — разделение формирования документов на сервере и последующий вызов двух независимых окон на клиенте. Для этого нам нужно изменить логику серверной функции так, чтобы она возвращала не один объект, а структуру с несколькими документами.

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


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

Теперь выясним, как правильно обработать эти данные на стороне клиента. Чтобы открыть два разных окна, нам необходимо дважды вызвать форму ОбщаяФорма.ПечатьДокументов, передавая в каждом случае соответствующий табличный документ. Важно использовать разные ключи уникальности, иначе 1С просто обновит содержимое первого открытого окна вместо открытия второго.


&НаКлиенте
Процедура ВыполнитьПечать(Команда)
    ДанныеПечати = СформироватьДокументыДляПечати();
    
    // 1. Выводим общий комплект документов
    Если ДанныеПечати.Свойство("ОбщийКомплект") Тогда
        ОткрытьОкноПечати(ДанныеПечати.ОбщийКомплект, "Комплект документов", "ОбщийКлюч");
    КонецЕсли;
    
    // 2. Выводим Маршрутный лист в отдельное окно
    Если ДанныеПечати.Свойство("МаршрутныйЛист") Тогда
        ОткрытьОкноПечати(ДанныеПечати.МаршрутныйЛист, "Маршрутный лист", "КлючМЛ");
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьОкноПечати(ТабДок, Заголовок, УникальныйID)
    КоллекцияПечатныхФорм = Новый Массив;
    
    ЭлементКоллекции = Новый Структура;
    ЭлементКоллекции.Вставить("ИмяВКоллекции", "ПечатнаяФорма");
    ЭлементКоллекции.Вставить("Заголовок", Заголовок);
    ЭлементКоллекции.Вставить("ТабличныйДокумент", ТабДок);
    ЭлементКоллекции.Вставить("Экземпляров", 1);
    
    КоллекцияПечатныхФорм.Добавить(ЭлементКоллекции);
    
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("КоллекцияПечатныхФорм", КоллекцияПечатныхФорм);
    ПараметрыОткрытия.Вставить("ИсточникДанных", Неопределено);
    
    ПараметрыПечати = Новый Структура;
    ПараметрыПечати.Вставить("ЗаголовокФормы", Заголовок);
    ПараметрыОткрытия.Вставить("ПараметрыПечати", ПараметрыПечати);
    
    // Важно: Строка(Новый УникальныйИдентификатор) гарантирует открытие нового окна
    ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия, ЭтаФорма, УникальныйID + "_" + Строка(Новый УникальныйИдентификатор));
КонецПроцедуры

Решение №2: Использование стандартного механизма «Печать комплекта»

Посмотрим на альтернативный вариант. В типовых конфигурациях на базе БСП (Библиотеки стандартных подсистем), таких как УТ 11.5, существует встроенный механизм печати комплектов. Он позволяет гибко настраивать состав документов. Даже если ваш документ «самописный», вы можете интегрировать его в этот механизм. Для готовой пакетной печати набора форм без изменения конфигурации можно использовать расширение для печати связанных документов в УТ 11.5.

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

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

Важные нюансы при работе с табличными документами

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

  1. Автомасштаб: Всегда устанавливайте ТабДокумент.АвтоМасштаб = Истина. Это позволяет системе автоматически подстроить ширину колонок под лист бумаги.
  2. Разрыв страницы: Если вы все же решили выводить Маршрутный лист в одном документе с другими, используйте метод ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц() перед выводом Маршрутного листа. Это гарантирует, что он начнется с нового листа.
  3. Имя параметров печати: Используйте свойство КлючПараметровПечати. Если задать разным документам разные ключи, 1С запомнит настройки печати (принтер, поля, ориентацию) для каждого из них отдельно. Например: ТабДокМЛ.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_МАРШРУТНЫЙ_ЛИСТ";.

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

← На главную