Как запретить печать «Товарного чека» до пробития фискального чека ККМ?

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

В процессе автоматизации рабочих мест кассиров часто возникает необходимость жесткого контроля последовательности действий: сначала оплата и пробитие чека на фискальном регистраторе, и только потом — печать «Товарного чека». Давайте вместе разберемся, как реализовать этот запрет и избежать несанкционированной печати.

Анализ проблемы: почему система разрешает печать?

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

Решение 1: Добавление проверки внутри внешней печатной формы

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

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

Посмотрим на пример реализации кода:


Процедура Печать(МассивОбъектов, ПараметрыПечати) Экспорт
    Для Каждого ТекущийОбъект Из МассивОбъектов Цикл
        // Проверка проведения документа
        Если Не ТекущийОбъект.Проведен Тогда
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Сначала произведите оплату!");
            Возврат;
        КонецЕсли;
        
        // Проверка статуса чека (например, для Розницы)
        Если ТекущийОбъект.СтатусЧека <> ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит") Тогда
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Печать возможна только после статуса 'Чек пробит'!");
            Возврат;
        КонецЕсли;
    КонецЦикла;
    
    // Далее следует логика заполнения табличного документа
КонецПроцедуры

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

Решение 2: Переход к использованию расширений (рекомендуемый подход)

Хотя правка ВПФ — самый простой путь, она не избавляет от всех системных вопросов, которые задает платформа 1С перед запуском печати. Чтобы полностью исключить появление вопросов «Для выполнения команды... данные будут записаны», рекомендуется использовать Расширение конфигурации.

Рассмотрим преимущества этого метода:

  1. Мы перехватываем событие нажатия кнопки печати до того, как система начнет проверять проведение документа.
  2. Используя аннотацию &Перед, мы можем установить Отказ = Истина, если условия не выполнены. Это блокирует дальнейший вызов стандартных процедур печати.
  3. Мы не «замусориваем» базу ненужными записями, так как команда прерывается в самом начале.

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


&Перед("Печать")
Процедура Расширение_ПередПечатью(Команда, ПараметрыКоманды, Отказ)
    Если Не Команда.Объект.Проведен Тогда
        Отказ = Истина;
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Печать товарного чека запрещена до пробития чека ККМ.");
    КонецЕсли;
КонецПроцедуры

Как избежать ошибок «Не сформирован печатный документ»?

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

Важно: Всегда проверяйте не только состояние Проведен, но и конкретный статус фискализации объекта ЧекККМ. Использование метода ПредопределенноеЗначение гарантирует, что ваш код будет корректно работать при обновлении конфигурации.

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

← На главную