Как распечатать непроведенный документ в 1С:ERP?

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

При работе в 1С:ERP Управление предприятием пользователи часто сталкиваются с ситуацией, когда требуется распечатать предварительную версию документа (например, заказ, реализацию или накладную) до момента его фактического проведения по учету. В более ранних решениях фирмы «1С» (например, в «1С:Управление производственным предприятием 1.3») эта задача решалась установкой флага в дополнительных правах пользователя. Выясним, почему в современных версиях ERP этот механизм работает иначе и какими способами можно реализовать печать непроведенного объекта.

Архитектурные особенности печати в 1С:ERP

Проанализируем, почему типовая настройка в пользовательском режиме 1С:ERP отсутствует:

  1. Подсистема печати БСП: В конфигурациях на базе Библиотеки Стандартных Подсистем (БСП) проверка проведения документа перед выводом печатной формы заложена на уровне программного кода. В процедуре ДобавитьКомандыПечати модуля менеджера документа для большинства печатных форм устанавливается параметр ПроверкаПроведенияПередПечатью = Истина. При таком значении система блокирует открытие печатной формы, требуя предварительного проведения документа.
  2. Источники данных для макетов: В 1С:ERP многие печатные формы (в частности, ТОРГ-12, УПД, акты) собирают данные не только из реквизитов самого документа, но и из сопутствующих регистров или служебных табличных частей (например, «Виды запасов»). В непроведенном документе эти движения и служебные данные еще не сформированы, поэтому типовой алгоритм формирования печатной формы не сможет заполнить отчет корректно.

Рассмотрим основные варианты решения этой задачи без снятия конфигурации с поддержки.

Способ 1. Использование переопределяемых модулей или расширений для внешних печатных форм

Если для печати используется внешняя печатная форма (ВПФ), стандартный механизм БСП все равно запускает предварительную проверку проведения. Обойти данное ограничение можно программно, переопределив обработчик команды печати.

Разберем пример отключения стандартной проверки в клиентском переопределяемом модуле ДополнительныеОтчетыИОбработкиКлиентПереопределяемый в процедуре ПередВыполнениемКомандыПечатиВнешнейПечатнойФормы (изменение можно внедрить через расширение конфигурации):


Процедура ПередВыполнениемКомандыПечатиВнешнейПечатнойФормы(ПечатаемыеОбъекты, СтандартнаяОбработка)
    
    // Проверяем переданный массив объектов печати
    Если ТипЗнч(ПечатаемыеОбъекты) = Тип("Массив") И ПечатаемыеОбъекты.Количество() > 0 Тогда
        // Отключаем стандартную проверку проведения для нужного типа документа
        Если ТипЗнч(ПечатаемыеОбъекты[0]) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
            СтандартнаяОбработка = Ложь;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

При установке СтандартнаяОбработка = Ложь типовой механизм БСП пропускает этап проверки проведенности переданных ссылок и переходит непосредственно к выполнению печати формы.

Способ 2. Создание внешней печатной формы с типом команды «Вызов клиентского метода»

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

Посмотрим на структуру регистрации такой команды в модуле объекта ВПФ:


Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.Назначение.Добавить("Документ.РеализацияТоваровУслуг");
    
    Команда = ПараметрыРегистрации.Команды.Добавить();
    Команда.Представление = НСтр("ru = 'Предварительный просмотр (без проведения)'");
    Команда.Идентификатор = "ПечатьБезПроведения";
    Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
    Команда.ПоказыватьОповещение = Ложь;
    
    Возврат ПараметрыРегистрации;

КонецФункции

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


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

Важное замечание: При формировании макета на сервере в методе СформироватьПечатнуюФормуНаСервере данные необходимо извлекать исключительно из реквизитов шапки и табличных частей самого документа (Объект.Товары, Объект.Услуги), не обращаясь к виртуальным таблицам движений и регистрам накопления, так как они будут пустыми.

Способ 3. Переопределение команд печати через расширение

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

  1. Подключаем расширение в режиме совместимости с основной конфигурацией.
  2. Добавляем в расширение модуль менеджера целевого документа.
  3. Используем директиву &После для процедуры ДобавитьКомандыПечати.
  4. В цикле обходим коллекцию КомандыПечати и для нужной команды выставляем свойство КомандаПечати.ПроверкаПроведенияПередПечатью = Ложь.

Посмотрим на пример такого переопределения:


&После("ДобавитьКомандыПечати")
Процедура Расш_ДобавитьКомандыПечати(КомандыПечати)
    
    Для Каждого Команда Из КомандыПечати Цикл
        Если Команда.Идентификатор = "ЗаказКлиента" Тогда
            Команда.ПроверкаПроведенияПередПечатью = Ложь;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Методологические рекомендации

При реализации печати непроведенных документов следует учитывать методологию ведения учета:

  1. Разделение первичных документов и проектов: Документы, отражающие факт хозяйственной жизни (УПД, акты, накладные), с точки зрения законодательства должны быть проведены. Для предварительного согласования с клиентом рекомендуется использовать печатные формы заказов, коммерческих предложений или счетов на оплату, которые не формируют проводок и движений по регистрам.
  2. Маркировка черновиков: Если в организации требуется печать бланка до момента его проведения, рекомендуется программно выводить в макет колонтитул или фоновую надпись: «Проект», «Черновик» или «Не для оплаты/отгрузки», чтобы исключить риски передачи юридически недействительных документов контрагентам.
← На главную