Часто в процессе разработки возникает задача автоматизировать формирование печатных документов с определенными настройками, например, с наложением факсимиле. Начинающие разработчики нередко пытаются решить эту задачу путем программного открытия формы документа и установки значения ее реквизитов (например, фПечатьФаксимиле). Давайте разберем, почему такой подход является ошибочным и как правильно реализовать эту задачу в архитектуре 1С.
Реквизиты формы существуют только в оперативной памяти в момент активного сеанса работы пользователя с конкретным окном ФормаДокумента. Когда вы запускаете внешнюю обработку или работаете в фоновом режиме, формы не существует. Попытка вызвать ПолучитьФорму() в коде обработки приводит к тому, что система пытается «отрисовать» интерфейс, что создает избыточную нагрузку на сервер, замедляет работу и, в конечном итоге, выдает ошибку доступа к объекту. Помните: реквизиты формы служат исключительно для управления интерфейсом, а не для хранения бизнес-логики.
Чтобы управлять печатью факсимиле, необходимо перенести логику из интерфейсной части (формы) в модуль объекта или общий модуль, где выполняется непосредственная подготовка табличного документа. Разберем шаги по правильной реализации.
Вместо того чтобы искать состояние флажка на форме, сделайте процедуру формирования печатной формы «экспортной» и добавьте в нее параметр для управления факсимиле. Рассмотрим на примере типовой процедуры ПечатьСчетаЗаказа.
Изменим функцию в модуле объекта так, чтобы она принимала логический параметр Факсимиле:
Функция ПечатьСчетаЗаказа(Тип, Факсимиле = Ложь) ЭКСПОРТ
Возврат СоздатьТабличныйДокументПечатиСчетаЗаказа(Тип, ПолучитьПараметрыПечатиСчетаЗаказа(Тип), Факсимиле);
КонецФункции
Теперь эта функция способна принимать значение Истина или Ложь, напрямую определяя, нужно ли выводить факсимиле в итоговый табличный документ.
Теперь, когда мы изменили логику функции, вызов из внешней обработки становится простым и надежным. Нам больше не нужно обращаться к ЭлементыФормы или искать фПечатьФаксимиле. Мы просто передаем нужный параметр при вызове функции объекта.
Пример кода вызова из обработки:
// Получаем объект документа
Док = РезультатЗапроса.Ссылка.ПолучитьОбъект();
// Формируем документ с факсимиле
Факсимиле = ИСТИНА;
ТабДок = Док.ПечатьСчетаЗаказа("СчетСС", Факсимиле);
// Выводим на печать или сохраняем
ТабДок.Напечатать();
Если в вашей конфигурации печать реализована через универсальную процедуру Печать(ИмяМакета, ...), проанализируйте модуль объекта. Скорее всего, там есть блок условий, определяющий, какой метод вызывать:
Если ИмяМакета = "Счет" Тогда
ТабДокумент = ПечатьСчетаЗаказа(ИмяМакета);
ИначеЕсли ИмяМакета = "СчетСС" ИЛИ ИмяМакета = "СчетСБиС" Тогда
ТабДокумент = ПечатьСчета(ИмяМакета, фПечатьФаксимиле);
КонецЕсли;
В данном примере видно, что процедура ПечатьСчета уже ожидает второй параметр фПечатьФаксимиле. Однако, если значение передается из формы, оно будет недоступно в обработке. Рекомендация: если вам нужно печатать факсимиле программно, вы можете либо передать Истина при вызове этой процедуры из вашей обработки, либо создать в модуле объекта механизм получения глобальной настройки из регистра сведений, где пользователь заранее указывает, нужно ли использовать факсимиле при печати.
ПолучитьФорму() для автоматизированных задач. Это ведет к нестабильности кода.СчетНаОплатуПокупателю или используйте РегистрСведений с настройками текущего пользователя.Используя предложенный подход, вы избавитесь от ошибок доступа к полям объекта и сделаете код своей обработки максимально быстрым и устойчивым к обновлениям конфигурации.