Как реализовать печать непроведенного документа во внешней печатной форме 1С

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

В типовых конфигурациях 1С, построенных на базе Библиотеки стандартных подсистем (БСП), таких как ЗУП 3.1, ERP 2.5 или УТ 11, существует встроенная проверка: система блокирует печать, если документ не проведен. Это логично для финансовых документов, данные которых должны попасть в регистры, но часто мешает при работе с "черновиками" или вспомогательными формами (уведомления, памятки), где документ используется лишь как "болванка" с данными. Рассмотрим подробно, как обойти это ограничение во внешней печатной форме (ВПФ).

Почему возникает блокировка печати

Разберем ситуацию: когда мы нажимаем кнопку "Печать", срабатывает стандартный механизм БСП. Процедура ВыполнитьОткрытиеПечатнойФормы в общем модуле ДополнительныеОтчетыИОбработкиКлиент проверяет состояние документа. Если документ не проведен, пользователю выводится предупреждение — для обхода есть расширение для печати документов без проведения. Проблема заключается в том, что по умолчанию для внешних печатных форм параметр ПроверкаПроведенияПередПечатью часто жестко установлен в значение Истина.

Решение 1: Использование клиентского метода вызова (рекомендуемый способ)

Самый элегантный способ без изменения конфигурации — перевести команду печати из серверного режима в клиентский. Это позволит нам самостоятельно управлять процессом открытия формы печати, минуя стандартные проверки на проведенность. Выполним следующие шаги:

Шаг 1. Изменение регистрации обработки. Проанализируем функцию СведенияОВнешнейОбработке в модуле объекта вашей ВПФ. Вместо стандартного типа вызова ВызовСерверногоМетода необходимо указать ВызовКлиентскогоМетода.


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

Шаг 2. Подготовка формы обработки. Для работы клиентского метода в состав внешней обработки необходимо добавить форму. Назовем ее ФормаОбработки. В этой форме на закладке Параметры создадим следующие реквизиты (для каждого обязательно установим флаг Ключевой параметр):

  1. ДополнительнаяОбработкаСсылка — Тип: СправочникСсылка.ДополнительныеОтчетыИОбработки
  2. ИдентификаторКоманды — Тип: Строка
  3. ОбъектыНазначения — Тип: Произвольный (сюда придет массив ссылок документов)

Шаг 3. Код процедуры Печать в модуле формы. Теперь пропишем логику в модуле созданной формы (за основу можно взять этот шаблон печатной формы). Нам нужно вручную вызвать общую форму печати документов БСП.


&НаКлиенте
Процедура Печать(ИмяКоманды, МассивОбъектов) Экспорт
    // Параметры для открытия стандартной формы печати
    ПараметрыОткрытия = Новый Структура("ИсточникДанных, ПараметрыИсточника");
    ПараметрыОткрытия.ИсточникДанных = Объект.ДополнительнаяОбработкаСсылка;
    
    ПараметрыИсточника = Новый Структура("ИдентификаторКоманды, ОбъектыНазначения");
    ПараметрыИсточника.ИдентификаторКоманды = Параметры.ИдентификаторКоманды;
    ПараметрыИсточника.ОбъектыНазначения = Параметры.ОбъектыНазначения;
    
    ПараметрыОткрытия.ПараметрыИсточника = ПараметрыИсточника;
    
    // Открываем форму печати БСП напрямую, минуя посредников
    ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия);
КонецПроцедуры

Решение 2: Использование расширения конфигурации

Если вы не хотите менять структуру ВПФ и добавлять в нее формы, проанализируем возможность использования расширения. В современных версиях ЗУП 3.1 и ERP за настройки печати отвечает процедура ПриОпределенииНастроекПечати в модуле менеджера документа. С помощью расширения мы можем принудительно отключить проверку проведения.

Рассмотрим пример кода для расширения (модуль менеджера документа, например, Документ.Отпуск):


&Вместо("ПриОпределенииНастроекПечати")
Процедура Расш_ПриОпределенииНастроекПечати(Настройки)
    ПродолжитьВызов(Настройки);
    // Отключаем проверку проведенности для всех печатных форм документа
    Настройки.ПроверкаПроведенияПередПечатью = Ложь;
КонецПроцедуры

Важный нюанс: Этот метод повлияет на все печатные формы данного типа документа (и встроенные, и внешние). Чтобы ограничить область действия, потребуется более гибкое управление доступом к печати непроведенных документов.

Решение 3: Реализация через промежуточную форму обработки

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

  1. В модуле формы ВПФ в процедуре ПриСозданииНаСервере получаем данные документа по ссылке из Параметры.ОбъектыНазначения.
  2. Вызываем функцию формирования табличного документа (ваша стандартная функция СформироватьПечатнуюФорму).
  3. Выводим результат в реквизит формы типа ТабличныйДокумент.

Этот метод полезен, когда данные для печати берутся не из регистров (которые пусты у непроведенного документа), а напрямую из объектных данных (табличных частей и реквизитов документа) — для этого подойдет готовая ВПФ для проектов доп. соглашений.

Особенности работы с данными непроведенного документа

Проанализируем критически важный технический момент. Программисты часто используют запросы к виртуальным таблицам (РегистрНакопления.Зарплата.Обороты и др.) в коде печати. Помните: у непроведенного документа нет движений в регистрах.

Чтобы печатная форма корректно заполнилась данными, рассмотрите следующие правила:

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

← На главную