В процессе работы с программными продуктами на платформе 1С:Предприятие 8.3 (такими как УТ 11, ERP 2.5 или КА 2.5) специалисты часто сталкиваются с необходимостью распечатать документ до того, как он будет проведен — решить эту задачу поможет печать непроведенных документов в 1С:УТ, ERP и КА. Типичный пример — документ Возврат товаров от клиента, который должен быть передан на склад в бумажном виде для предварительной проверки фактического наличия товара. Однако стандартные механизмы печати часто блокируют эту возможность, выдавая ошибку или формируя пустой лист.
В этой статье мы подробно разберем, почему простая настройка команд печати не всегда срабатывает, и рассмотрим пошаговые инструкции по решению этой задачи для различных типов документов.
Для начала проанализируем, как работает система печати в современных конфигурациях, построенных на базе БСП (Библиотеки стандартных подсистем). Большинство команд печати регистрируются в модуле менеджера объекта в процедуре ДобавитьКомандыПечати. Рассмотрим пример настройки для документа Заказ клиента или Счет на оплату, который упоминался в обсуждении:
// Пример регистрации команды в модуле менеджера
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.МенеджерПечати = "Обработка.ПечатьСчетовНаОплату";
КомандаПечати.Идентификатор = "СчетНаОплату";
КомандаПечати.Представление = NStr("ru = 'Счет на оплату'");
КомандаПечати.ПроверкаПроведенияПередПечатью = Ложь; // Ключевой параметр
Казалось бы, установка свойства ПроверкаПроведенияПередПечатью в значение Ложь должна полностью решать проблему. И для простых документов, таких как Счет на оплату, это действительно работает. Но при попытке применить тот же подход к документу Возврат товаров от клиента или Реализация товаров и услуг, мы часто терпим неудачу. Выясним причину этого поведения.
Проанализируем ситуацию глубже. Основная причина кроется в алгоритме сбора данных для печатной формы. В сложных складских и финансовых документах печатная форма формируется не на основании данных табличных частей самого документа (объектных данных), а на основании данных из регистров накопления или регистров сведений.
Когда мы нажимаем кнопку «Печать», система выполняет запрос к базе данных. В случае с Возвратом товаров, код часто обращается к виртуальным таблицам остатков, данным о себестоимости или расчетам с клиентами. Поскольку документ не проведен, он еще не сделал движений по регистрам. Следовательно:
Таким образом, простого изменения флага в команде печати недостаточно — необходимо модифицировать сам текст запроса в процедуре подготовки данных.
Рассмотрим наиболее корректный с точки зрения поддержки конфигурации метод — создание расширения. Нам необходимо найти процедуру, отвечающую за формирование данных для печати (обычно она находится в модуле менеджера или в специализированном модуле печати, например ПечатьФискальныхДокументов или УправлениеПечатьюУТ).
Разберем по шагам, как изменить логику получения данных:
СформироватьДанныеДляПечати... и перехватываем ее с помощью аннотации &Вместо или &Перед.РегистрНакопления.ВыручкаИСебестоимостьПродаж) на обращение к табличной части документа Документ.ВозвратТоваровОтКлиента.Товары.Пример изменения структуры запроса в коде:
// Было (упрощенно):
"ВЫБРАТЬ Себестоимость.Номенклатура, Себестоимость.Количество
ИЗ РегистрНакопления.ВыручкаИСебестоимостьПродаж КАК Себестоимость
ГДЕ Себестоимость.Регистратор = &Ссылка"
// Стало:
"ВЫБРАТЬ Товары.Номенклатура, Товары.Количество
ИЗ Документ.ВозвратТоваровОтКлиента.Товары КАК Товары
ГДЕ Товары.Ссылка = &Ссылка"
Важный момент: При печати непроведенного документа вы не сможете вывести данные, которые рассчитываются только в момент проведения (например, партию списания или точную сумму НДС, если она зависит от налогового статуса, определяемого при проведении).
Если вы не хотите вносить изменения в конфигурацию даже через расширения, использование внешней печатной формы (ВПФ) будет лучшим решением — для этого подойдёт комплект внешних печатных форм для 1С:УТ 11.5. Рассмотрим преимущества этого метода:
При разработке ВПФ для непроведенного документа Возврат товаров, обязательно убедитесь, что в функции СведенияОВнешнейОбработке для команды печати также установлено значение ПроверкаПроведенияПередПечатью = Ложь.
Иногда программисты пытаются использовать метод так называемого «виртуального проведения». Это техника, при которой в памяти создается временный набор записей регистров, имитирующий движения документа, и эти данные подсовываются стандартному менеджеру печати. Мы не рекомендуем использовать этот метод для сложных документов типа Возврат товаров, так как он крайне трудозатратен в реализации и нестабилен при обновлении версии БСП.
Проанализируем ситуацию со стороны пользователя. Как было отмечено в обсуждении, печать непроведенного документа часто нужна для «черновиков». Если ваша цель — дать складу возможность проверить товар, рассмотрите следующие альтернативы:
К возврату (если это предусмотрено функциональными опциями) и проводите документ. В этом статусе он может не делать финансовых движений, но уже будет доступен для печати.Подведем итог. Чтобы успешно распечатать непроведенный Возврат товаров от клиента в 1С:УТ 11, необходимо выполнить два условия:
ПроверкаПроведенияПередПечатью).Наиболее эффективным и поддерживаемым способом реализации этого функционала является создание внешней печатной формы с собственным оптимизированным запросом к объектным таблицам документа.