Как программно управлять печатью факсимиле в документах 1С без использования формы?

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

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

Почему обращение к реквизитам формы — это тупиковый путь?

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

Правильный подход к решению задачи

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

Шаг 1: Модификация процедуры печати

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

Изменим функцию в модуле объекта так, чтобы она принимала логический параметр Факсимиле:


Функция ПечатьСчетаЗаказа(Тип, Факсимиле = Ложь) ЭКСПОРТ
    Возврат СоздатьТабличныйДокументПечатиСчетаЗаказа(Тип, ПолучитьПараметрыПечатиСчетаЗаказа(Тип), Факсимиле);
КонецФункции

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

Шаг 2: Вызов печати из внешней обработки

Теперь, когда мы изменили логику функции, вызов из внешней обработки становится простым и надежным. Нам больше не нужно обращаться к ЭлементыФормы или искать фПечатьФаксимиле. Мы просто передаем нужный параметр при вызове функции объекта.

Пример кода вызова из обработки:


// Получаем объект документа
Док = РезультатЗапроса.Ссылка.ПолучитьОбъект();

// Формируем документ с факсимиле
Факсимиле = ИСТИНА;
ТабДок = Док.ПечатьСчетаЗаказа("СчетСС", Факсимиле);

// Выводим на печать или сохраняем
ТабДок.Напечатать();

Анализ текущей архитектуры печати

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


Если ИмяМакета = "Счет" Тогда
    ТабДокумент = ПечатьСчетаЗаказа(ИмяМакета);
ИначеЕсли ИмяМакета = "СчетСС" ИЛИ ИмяМакета = "СчетСБиС" Тогда
    ТабДокумент = ПечатьСчета(ИмяМакета, фПечатьФаксимиле);
КонецЕсли;

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

Заключение и рекомендации

  1. Не используйте ПолучитьФорму() для автоматизированных задач. Это ведет к нестабильности кода.
  2. Используйте параметры функций. Передача значений через параметры процедуры — это стандарт индустрии при разработке на 1С.
  3. Храните настройки в базе. Если необходимо, чтобы факсимиле включалось не только в обработке, но и в обычном режиме, добавьте соответствующий реквизит в сам СчетНаОплатуПокупателю или используйте РегистрСведений с настройками текущего пользователя.
  4. Делайте методы экспортными. Предоставляйте возможность внешним обработкам вызывать функции формирования печатных форм с нужными вам параметрами.

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

← На главную