В типовых конфигурациях 1С, построенных на базе Библиотеки стандартных подсистем (БСП), таких как ЗУП 3.1, ERP 2.5 или УТ 11, существует встроенная проверка: система блокирует печать, если документ не проведен. Это логично для финансовых документов, данные которых должны попасть в регистры, но часто мешает при работе с "черновиками" или вспомогательными формами (уведомления, памятки), где документ используется лишь как "болванка" с данными. Рассмотрим подробно, как обойти это ограничение во внешней печатной форме (ВПФ).
Разберем ситуацию: когда мы нажимаем кнопку "Печать", срабатывает стандартный механизм БСП. Процедура ВыполнитьОткрытиеПечатнойФормы в общем модуле ДополнительныеОтчетыИОбработкиКлиент проверяет состояние документа. Если документ не проведен, пользователю выводится предупреждение — для обхода есть расширение для печати документов без проведения. Проблема заключается в том, что по умолчанию для внешних печатных форм параметр ПроверкаПроведенияПередПечатью часто жестко установлен в значение Истина.
Самый элегантный способ без изменения конфигурации — перевести команду печати из серверного режима в клиентский. Это позволит нам самостоятельно управлять процессом открытия формы печати, минуя стандартные проверки на проведенность. Выполним следующие шаги:
Шаг 1. Изменение регистрации обработки. Проанализируем функцию СведенияОВнешнейОбработке в модуле объекта вашей ВПФ. Вместо стандартного типа вызова ВызовСерверногоМетода необходимо указать ВызовКлиентскогоМетода.
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.1.73");
// ... заполнение назначений и наименований ...
ТаблицаКоманд = ПолучитьТаблицуКоманд();
// ВАЖНО: Указываем "ВызовКлиентскогоМетода" вместо "ВызовСерверногоМетода"
ДобавитьКоманду(ТаблицаКоманд,
"Печать непроведенного",
"ИдентификаторКоманды",
"ВызовКлиентскогоМетода",
Истина,
"ПечатьMXL");
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Шаг 2. Подготовка формы обработки. Для работы клиентского метода в состав внешней обработки необходимо добавить форму. Назовем ее ФормаОбработки. В этой форме на закладке Параметры создадим следующие реквизиты (для каждого обязательно установим флаг Ключевой параметр):
ДополнительнаяОбработкаСсылка — Тип: СправочникСсылка.ДополнительныеОтчетыИОбработкиИдентификаторКоманды — Тип: СтрокаОбъектыНазначения — Тип: Произвольный (сюда придет массив ссылок документов)Шаг 3. Код процедуры Печать в модуле формы. Теперь пропишем логику в модуле созданной формы (за основу можно взять этот шаблон печатной формы). Нам нужно вручную вызвать общую форму печати документов БСП.
&НаКлиенте
Процедура Печать(ИмяКоманды, МассивОбъектов) Экспорт
// Параметры для открытия стандартной формы печати
ПараметрыОткрытия = Новый Структура("ИсточникДанных, ПараметрыИсточника");
ПараметрыОткрытия.ИсточникДанных = Объект.ДополнительнаяОбработкаСсылка;
ПараметрыИсточника = Новый Структура("ИдентификаторКоманды, ОбъектыНазначения");
ПараметрыИсточника.ИдентификаторКоманды = Параметры.ИдентификаторКоманды;
ПараметрыИсточника.ОбъектыНазначения = Параметры.ОбъектыНазначения;
ПараметрыОткрытия.ПараметрыИсточника = ПараметрыИсточника;
// Открываем форму печати БСП напрямую, минуя посредников
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия);
КонецПроцедуры
Если вы не хотите менять структуру ВПФ и добавлять в нее формы, проанализируем возможность использования расширения. В современных версиях ЗУП 3.1 и ERP за настройки печати отвечает процедура ПриОпределенииНастроекПечати в модуле менеджера документа. С помощью расширения мы можем принудительно отключить проверку проведения.
Рассмотрим пример кода для расширения (модуль менеджера документа, например, Документ.Отпуск):
&Вместо("ПриОпределенииНастроекПечати")
Процедура Расш_ПриОпределенииНастроекПечати(Настройки)
ПродолжитьВызов(Настройки);
// Отключаем проверку проведенности для всех печатных форм документа
Настройки.ПроверкаПроведенияПередПечатью = Ложь;
КонецПроцедуры
Важный нюанс: Этот метод повлияет на все печатные формы данного типа документа (и встроенные, и внешние). Чтобы ограничить область действия, потребуется более гибкое управление доступом к печати непроведенных документов.
Выясним, как поступить, если мы хотим полностью контролировать процесс вывода без использования ОбщаяФорма.ПечатьДокументов. Мы можем создать свою форму в ВПФ, на которой разместим поле табличного документа.
ПриСозданииНаСервере получаем данные документа по ссылке из Параметры.ОбъектыНазначения.СформироватьПечатнуюФорму).ТабличныйДокумент.Этот метод полезен, когда данные для печати берутся не из регистров (которые пусты у непроведенного документа), а напрямую из объектных данных (табличных частей и реквизитов документа) — для этого подойдет готовая ВПФ для проектов доп. соглашений.
Проанализируем критически важный технический момент. Программисты часто используют запросы к виртуальным таблицам (РегистрНакопления.Зарплата.Обороты и др.) в коде печати. Помните: у непроведенного документа нет движений в регистрах.
Чтобы печатная форма корректно заполнилась данными, рассмотрите следующие правила:
Документ.Отпуск.Сотрудники), а не к регистрам расчета или накопления.Ссылка.ПолучитьОбъект(), если нужно получить данные, которые только что были изменены на форме, но еще не зафиксированы в базе (при условии передачи данных формы на сервер).Выбор конкретного решения зависит от версии вашей конфигурации. Например, для реализации печати счета без проведения использование клиентского метода (Решение 1) остается самым универсальным инструментом для разработчика внешних печатных форм — упрощает работу конструктор печатных форм без программирования.