Как реализовать печать непроведенных документов в 1С:Управление торговлей 11?

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

В процессе работы с программными продуктами на платформе 1С:Предприятие 8.3 (такими как УТ 11, ERP 2.5 или КА 2.5) специалисты часто сталкиваются с необходимостью распечатать документ до того, как он будет проведен — решить эту задачу поможет печать непроведенных документов в 1С:УТ, ERP и КА. Типичный пример — документ Возврат товаров от клиента, который должен быть передан на склад в бумажном виде для предварительной проверки фактического наличия товара. Однако стандартные механизмы печати часто блокируют эту возможность, выдавая ошибку или формируя пустой лист.

В этой статье мы подробно разберем, почему простая настройка команд печати не всегда срабатывает, и рассмотрим пошаговые инструкции по решению этой задачи для различных типов документов.

Анализ стандартного механизма команд печати

Для начала проанализируем, как работает система печати в современных конфигурациях, построенных на базе БСП (Библиотеки стандартных подсистем). Большинство команд печати регистрируются в модуле менеджера объекта в процедуре ДобавитьКомандыПечати. Рассмотрим пример настройки для документа Заказ клиента или Счет на оплату, который упоминался в обсуждении:


// Пример регистрации команды в модуле менеджера
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.МенеджерПечати = "Обработка.ПечатьСчетовНаОплату";
КомандаПечати.Идентификатор = "СчетНаОплату";
КомандаПечати.Представление = NStr("ru = 'Счет на оплату'");
КомандаПечати.ПроверкаПроведенияПередПечатью = Ложь; // Ключевой параметр

Казалось бы, установка свойства ПроверкаПроведенияПередПечатью в значение Ложь должна полностью решать проблему. И для простых документов, таких как Счет на оплату, это действительно работает. Но при попытке применить тот же подход к документу Возврат товаров от клиента или Реализация товаров и услуг, мы часто терпим неудачу. Выясним причину этого поведения.

Почему «Возврат товаров» не печатается без проведения?

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

Когда мы нажимаем кнопку «Печать», система выполняет запрос к базе данных. В случае с Возвратом товаров, код часто обращается к виртуальным таблицам остатков, данным о себестоимости или расчетам с клиентами. Поскольку документ не проведен, он еще не сделал движений по регистрам. Следовательно:

  1. Запрос к регистрам возвращает пустой результат.
  2. Алгоритм формирования печатной формы не находит строк для вывода в макет.
  3. Печатная форма отображается пустой или система выдает предупреждение об отсутствии данных.

Таким образом, простого изменения флага в команде печати недостаточно — необходимо модифицировать сам текст запроса в процедуре подготовки данных.

Способ 1. Использование расширения для подмены запроса

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

Разберем по шагам, как изменить логику получения данных:

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

Пример изменения структуры запроса в коде:


// Было (упрощенно):
"ВЫБРАТЬ Себестоимость.Номенклатура, Себестоимость.Количество 
ИЗ РегистрНакопления.ВыручкаИСебестоимостьПродаж КАК Себестоимость 
ГДЕ Себестоимость.Регистратор = &Ссылка"

// Стало:
"ВЫБРАТЬ Товары.Номенклатура, Товары.Количество 
ИЗ Документ.ВозвратТоваровОтКлиента.Товары КАК Товары 
ГДЕ Товары.Ссылка = &Ссылка"

Важный момент: При печати непроведенного документа вы не сможете вывести данные, которые рассчитываются только в момент проведения (например, партию списания или точную сумму НДС, если она зависит от налогового статуса, определяемого при проведении).

Способ 2. Создание внешней печатной формы

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

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

Проблема виртуального проведения

Иногда программисты пытаются использовать метод так называемого «виртуального проведения». Это техника, при которой в памяти создается временный набор записей регистров, имитирующий движения документа, и эти данные подсовываются стандартному менеджеру печати. Мы не рекомендуем использовать этот метод для сложных документов типа Возврат товаров, так как он крайне трудозатратен в реализации и нестабилен при обновлении версии БСП.

Рекомендации по бизнес-процессу

Проанализируем ситуацию со стороны пользователя. Как было отмечено в обсуждении, печать непроведенного документа часто нужна для «черновиков». Если ваша цель — дать складу возможность проверить товар, рассмотрите следующие альтернативы:

Заключение

Подведем итог. Чтобы успешно распечатать непроведенный Возврат товаров от клиента в 1С:УТ 11, необходимо выполнить два условия:

  1. Отключить программную блокировку в команде печати (свойство ПроверкаПроведенияПередПечатью).
  2. Обеспечить выборку данных из табличных частей документа, а не из регистров накопления, так как записи в регистрах появляются только после успешного проведения.

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

← На главную