Как распечатать непроведенный документ в 1С:Розница 2.0?

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

При работе в конфигурации 1С:Розница 2.0 пользователи часто сталкиваются с необходимостью напечатать предварительный чек, накладную или товарный чек из еще не проведенного документа (например, Реализация товаров). В старых конфигурациях на обычных формах (таких как 1С:Управление торговлей 10.3 или 1С:УПП) для этого достаточно было установить флаг в дополнительных правах пользователя. Однако в 1С:Розница 2.0 этот механизм работает иначе.

Рассмотрим подробнее, почему возникают ограничения при печати, разберем работу алгоритмов 1С и изучим способы решения данной задачи.

Выясним причину: почему программа блокирует печать

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


// Пример логики проверки проведения из общего модуля УправлениеПечатьюКлиент
Процедура ПроверитьПроведенностьДокументовДиалогПроведения(Параметры) Экспорт
    Если УправлениеПечатьюВызовСервера.ДоступноПравоПроведения(Параметры.НепроведенныеДокументы) Тогда
        ТекстВопроса = НСтр("ru = 'Для того чтобы распечатать документ, его необходимо предварительно провести. Выполнить проведение документа и продолжить?'");
        // Вызов диалога с предложением провести документ
    Иначе
        ТекстПредупреждения = НСтр("ru = 'Для того чтобы распечатать документ, его необходимо предварительно провести. Недостаточно прав для проведения документа, печать невозможна.'");
        ПоказатьПредупреждение(, ТекстПредупреждения);
        Возврат;
    КонецЕсли;
КонецПроцедуры

Проанализировав данный код, разберем ключевые проблемы:

  1. Если документ не проведен, подсистема запрашивает у пользователя разрешение на проведение.
  2. Если у пользователя нет прав на проведение документа (например, отсутствуют права на чтение и запись остатков по регистрам), система выдает предупреждение о невозможности печати.
  3. Многие печатные формы по умолчанию формируют данные не из табличной части документа, а из движений по регистрам накопления. У непроведенного документа движений нет, поэтому печатная форма выводилась бы пустой.

Способ 1. Быстрый обходной путь (без программирования)

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

  1. Проводим документ в системе.
  2. Нажимаем кнопку печати и выводим нужный макет на принтер.
  3. Отменяем проведение документа (возвращаем ему статус непроведенного).

Важное ограничение: данный метод подходит только пользователям с полными правами или правами на проведение документов. Если у оператора ограничены права (например, установлен запрет на проведение при отсутствии остатков на складе), система не позволит выполнить этот алгоритм.

Способ 2. Отключение проверки проведения через расширение

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

Каждая команда печати в модуле менеджера объекта имеет свойство ПроверкаПроведенияПередПечатью. По умолчанию для отгрузочных документов оно равно Истина. Изменим это значение с помощью расширения:

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

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

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

Способ 3. Использование внешней печатной формы (ВПФ)

Рассмотрим вариант создания внешней печатной формы. Чтобы подсистема БСП не блокировала печать непроведенного объекта при вызове ВПФ, выполняем следующие шаги:

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

Важные нюансы и ограничения печати непроведенных документов

При снятии проверки проведения необходимо учитывать важные особенности работы 1С:Розница:

  1. Нерассчитанные данные: В непроведенном документе могут отсутствовать окончательные расчеты по автоматическим скидкам, распределению по складам или сериям номенклатуры. Все эти значения формируются именно в момент проведения.
  2. Контроль RLS и прав доступа: Отключение проверки проведения не отменяет права доступа RLS. У пользователя должно быть минимум право на чтение данного типа документов.
  3. Обозначение черновика: Рекомендуется добавлять на макет печатной формы фоновую надпись или заголовок «ЧЕРНОВИК / Не является документом отгрузки», чтобы исключить злоупотребления со стороны персонала.
← На главную