Открыть печать пакета с ручным подтверждением

Учебные задачи

Две собственные формы, одна копия каждого документа и обязательный диалог выбора устройства.

Где и как запускать

Полный модуль собственной управляемой формы; толстый клиент Windows. Временные документы принадлежат только этой форме.

Подготовка

  1. Собственная отдельная конфигурация УчебнаяКонфигурацияСинтаксиса, платформа 8.5.1.1343. Создайте внешнюю обработку с пустой управляемой формой, командой Выполнить и её кнопкой.

  2. Откройте обработку в толстом клиенте Windows. Вставьте полный модуль одного урока. При наличии Асинх используйте асинхронную процедуру из примера, не убирайте Ждать.

  3. Серверная функция создаёт только две собственные формы: Книга / 3 и Ручка / 1. Временное хранилище привязано к УникальныйИдентификатор этой формы, адреса сохраняются в собственном массиве.

  4. Пока выполняется запись, форму не закрывайте. После завершения очищаются только адреса, созданные этим модулем. Файл оставляется для ручной проверки и удаления пользователем.

  5. Запись выбирает новое временное имя на машине клиента. Существующий файл не перезаписывается. Для файла печати используется расширение print: это внутренний файл печати, не PDF и не текстовый отчёт.

  6. Урок печати требует строковые реквизиты УчебныйПринтер и Подтверждение. Введите точное имя собственного тестового устройства и фразу ПЕЧАТАЮ ТОЛЬКО УЧЕБНЫЕ ДАННЫЕ.

  7. При создании руководства печать, сохранение и запуск 1С не выполнялись. Для PDF вручную проверьте обе учебные формы; ненулевой размер файла сам по себе не доказывает содержимое.

Перем УчебныйПакет;
Перем УчебныеАдреса;
Перем Занято;

&НаКлиенте
Процедура Выполнить(Команда)
    Если ПустаяСтрока(УчебныйПринтер)
        ИЛИ Подтверждение <> "ПЕЧАТАЮ ТОЛЬКО УЧЕБНЫЕ ДАННЫЕ" Тогда
        ВызватьИсключение "Нужны точное имя собственного принтера и подтверждение";
    КонецЕсли;
    Подтверждение = "";
    Если Занято = Истина Тогда
        ВызватьИсключение "Дождитесь завершения собственной предыдущей операции";
    КонецЕсли;
    Если УчебныеАдреса <> Неопределено Тогда
        ВызватьИсключение "Предыдущие учебные данные ещё не освобождены; закройте только учебную форму и откройте заново";
    КонецЕсли;
    Созданные = СоздатьСобственныйПакет();
    УчебныйПакет = Созданные.Пакет;
    УчебныеАдреса = Созданные.Адреса;
    Попытка
        УчебныйПакет.ИмяПринтера = УчебныйПринтер;
        УчебныйПакет.КоличествоЭкземпляров = 1;
        Сообщить(УчебныйПакет.Состав.Количество() = 2);
        Сообщить(УчебныйПакет.КоличествоЭкземпляров = 1);
        УчебныйПакет.Напечатать(РежимИспользованияДиалогаПечати.Использовать);
    Исключение
        ОшибкаОперации = ОписаниеОшибки();
        ОсвободитьСобственныйПакет();
        ВызватьИсключение ОшибкаОперации;
    КонецПопытки;
    ОсвободитьСобственныйПакет();
КонецПроцедуры

&НаСервере
Функция СоздатьСобственныйПакет()
    Адреса = Новый Массив;
    Пакет = Новый ПакетОтображаемыхДокументов;
    Пакет.Заголовок = "guide-owned: Книга и Ручка";
    Пакет.Вывод = ИспользованиеВывода.Разрешить;
    Пакет.КоличествоЭкземпляров = 1;
    Для Номер = 1 По 2 Цикл
        Документ = Новый ТабличныйДокумент;
        Если Номер = 1 Тогда
            Название = "Книга";
            Количество = "3";
        Иначе
            Название = "Ручка";
            Количество = "1";
        КонецЕсли;
        Документ.Область(1, 1).Текст = "Только собственный учебный товар";
        Документ.Область(2, 1).Текст = Название;
        Документ.Область(2, 2).Текст = Количество;
        Документ.Область(, 1, , 1).ШиринаКолонки = 30;
        Документ.КоличествоЭкземпляров = 7;
        Адрес = ПоместитьВоВременноеХранилище(Документ, ЭтаФорма.УникальныйИдентификатор);
        Адреса.Добавить(Адрес);
        Элемент = Пакет.Состав.Добавить(Адрес);
        Элемент.Наименование = Название;
    КонецЦикла;
    Возврат Новый Структура("Пакет,Адреса", Пакет, Адреса);
КонецФункции

&НаСервере
Процедура УдалитьСобственныеАдреса(Адреса)
    Для Каждого Адрес Из Адреса Цикл
        УдалитьИзВременногоХранилища(Адрес);
    КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ОсвободитьСобственныйПакет()
    Если УчебныеАдреса <> Неопределено Тогда
        УдалитьСобственныеАдреса(УчебныеАдреса);
        УчебныеАдреса = Неопределено;
    КонецЕсли;
    УчебныйПакет = Неопределено;
КонецПроцедуры

Разбор по шагам

  1. Указать точный собственный тестовый принтер и фразу подтверждения. Она очищается до создания/печати пакета.

  2. Проверить два элемента и одну копию пакета. КоличествоЭкземпляров = 7 у исходных документов игнорируется по контракту пакета.

  3. Вызвать Напечатать с Использовать, вручную проверить устройство и диапазон.

  4. В первом тесте нажать Отмена. После возврата освободить только свои временные адреса.

Как проверить результат

  1. Две проверки дают Истина. Без фразы и имени устройства вызова печати нет.

  2. Отмена не считается успешной печатью. Для подтверждения реального результата нужно проверить очередь/выход собственного устройства вручную.

Ожидаемый результат

Полный ограниченный пример ручного запуска печати пакета.

На что обратить внимание

  1. Возврат управления от Напечатать не доказывает появление бумаги.

  2. Пользователь может изменить принтер в диалоге; обязательно проверить его перед подтверждением.

  3. Не использовать этот код с адресами рабочих печатных форм.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.