При работе в 1С:ERP Управление предприятием пользователи часто сталкиваются с ситуацией, когда требуется распечатать предварительную версию документа (например, заказ, реализацию или накладную) до момента его фактического проведения по учету. В более ранних решениях фирмы «1С» (например, в «1С:Управление производственным предприятием 1.3») эта задача решалась установкой флага в дополнительных правах пользователя. Выясним, почему в современных версиях ERP этот механизм работает иначе и какими способами можно реализовать печать непроведенного объекта.
Проанализируем, почему типовая настройка в пользовательском режиме 1С:ERP отсутствует:
ДобавитьКомандыПечати модуля менеджера документа для большинства печатных форм устанавливается параметр ПроверкаПроведенияПередПечатью = Истина. При таком значении система блокирует открытие печатной формы, требуя предварительного проведения документа.Рассмотрим основные варианты решения этой задачи без снятия конфигурации с поддержки.
Если для печати используется внешняя печатная форма (ВПФ), стандартный механизм БСП все равно запускает предварительную проверку проведения. Обойти данное ограничение можно программно, переопределив обработчик команды печати.
Разберем пример отключения стандартной проверки в клиентском переопределяемом модуле ДополнительныеОтчетыИОбработкиКлиентПереопределяемый в процедуре ПередВыполнениемКомандыПечатиВнешнейПечатнойФормы (изменение можно внедрить через расширение конфигурации):
Процедура ПередВыполнениемКомандыПечатиВнешнейПечатнойФормы(ПечатаемыеОбъекты, СтандартнаяОбработка)
// Проверяем переданный массив объектов печати
Если ТипЗнч(ПечатаемыеОбъекты) = Тип("Массив") И ПечатаемыеОбъекты.Количество() > 0 Тогда
// Отключаем стандартную проверку проведения для нужного типа документа
Если ТипЗнч(ПечатаемыеОбъекты[0]) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
При установке СтандартнаяОбработка = Ложь типовой механизм БСП пропускает этап проверки проведенности переданных ссылок и переходит непосредственно к выполнению печати формы.
Еще один надежный способ формирования печатной формы для непроведенного документа — регистрация ВПФ с прямым вызовом клиентского метода формы. В этом случае печать инициируется полностью под управлением алгоритма обработки, минуя вызовы стандартных проверок БСП.
Посмотрим на структуру регистрации такой команды в модуле объекта ВПФ:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.Назначение.Добавить("Документ.РеализацияТоваровУслуг");
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = 'Предварительный просмотр (без проведения)'");
Команда.Идентификатор = "ПечатьБезПроведения";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
Команда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
В форме обработки создается клиентская процедура, которая получает сформированный табличный документ с сервера и открывает его через стандартную общую форму:
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
ТабличныйДокумент = СформироватьПечатнуюФормуНаСервере(ОбъектыНазначения);
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("СформированныеДокументы", ТабличныйДокумент);
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия);
КонецПроцедуры
Важное замечание: При формировании макета на сервере в методе СформироватьПечатнуюФормуНаСервере данные необходимо извлекать исключительно из реквизитов шапки и табличных частей самого документа (Объект.Товары, Объект.Услуги), не обращаясь к виртуальным таблицам движений и регистрам накопления, так как они будут пустыми.
Если стоит задача разрешить печать типовой формы документа без снятия конфигурации с поддержки, можно использовать расширение конфигурации:
&После для процедуры ДобавитьКомандыПечати.КомандыПечати и для нужной команды выставляем свойство КомандаПечати.ПроверкаПроведенияПередПечатью = Ложь.Посмотрим на пример такого переопределения:
&После("ДобавитьКомандыПечати")
Процедура Расш_ДобавитьКомандыПечати(КомандыПечати)
Для Каждого Команда Из КомандыПечати Цикл
Если Команда.Идентификатор = "ЗаказКлиента" Тогда
Команда.ПроверкаПроведенияПередПечатью = Ложь;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
При реализации печати непроведенных документов следует учитывать методологию ведения учета: