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

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

В торговых и производственных компаниях часто возникает классическая проблема взаимодействия между отделом продаж и складом. Менеджер оформляет документ реализации, пытается его провести, но система выдает ошибку — например, из-за фактического отсутствия товара на свободном остатке. Чтобы не упустить клиента или ускорить процесс, менеджер просто распечатывает непроведенную товарную накладную (ТОРГ-12) или УПД и передает ее на склад. Кладовщик, ориентируясь на бумажный носитель, отпускает товар. В итоге учет ломается: товар со склада ушел, в программе он числится, себестоимость не списана, а бухгалтерия в конце месяца вынуждена вручную разбираться с отрицательными остатками.

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

Анализируем механизмы печати в БСП (Библиотеке стандартных подсистем)

Прежде чем переходить к написанию кода, давайте разберем, как устроена система печати в современных конфигурациях 1С на управляемых формах. За вывод печатных форм отвечает специализированная подсистема БСП — «Печать».

Каждая команда печати (будь то ТОРГ-12, Акт об оказании услуг или УПД) регистрируется в модуле менеджера соответствующего документа в процедуре ДобавитьКомандыПечати(КомандыПечати). В этой процедуре описываются свойства команды, включая ее идентификатор, представление, а также важные поведенческие флаги.

Одним из ключевых свойств структуры описания команды является флаг ПроверкаПроведенияПередПечатью. Если это свойство имеет значение Истина, платформа 1С автоматически выполняет следующую логику:

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

По умолчанию для многих документов в БП 3.0 это свойство установлено в значение Ложь, что и позволяет менеджерам беспрепятственно печатать черновики документов.

Способ 1. Программная настройка в модуле менеджера конкретного документа

Рассмотрим самый простой способ реализации запрета для конкретного документа (например, РеализацияТоваровУслуг). Для этого нам потребуется определить команду печати и принудительно установить признак проверки проведения.

Если мы заглянем в модуль менеджера документа РеализацияТоваровУслуг, то найдем там процедуру описания команд печати. Нам необходимо модернизировать код регистрации конкретной команды (например, для ТОРГ-12). Код будет выглядеть следующим образом:


// В модуле менеджера документа РеализацияТоваровУслуг
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт

    // Поиск существующей команды печати ТОРГ-12 и изменение ее свойств
    Для Каждого Команда Из КомандыПечати Цикл
        Если Команда.Идентификатор = "ТОРГ12" Или Команда.Идентификатор = "ТОРГ12БезУслуг" Тогда
            Команда.ПроверкаПроведенияПередПечатью = Истина;
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры

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

Способ 2. Использование расширения конфигурации (Рекомендуемый метод)

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

Выполним следующие действия:

  1. Откроем конфигуратор вашей базы данных.
  2. Перейдем в меню Конфигурация -> Расширения конфигурации и создадим новое расширение (назовем его, например, БлокировкаПечатиНепроведенных). Назначение выберем Адаптация.
  3. В дереве объектов расширения добавим общий модуль УправлениеПечатьюПереопределяемый.
  4. В модуле УправлениеПечатьюПереопределяемый переопределим процедуру ПриПолученииКомандПечати с помощью аннотации &Вместо.

Давайте проанализируем код, который мы напишем в общем модуле расширения:


&Вместо("ПриПолученииКомандПечати")
Процедура Расш_ПриПолученииКомандПечати(Источники, КомандыПечати)
    
    // Сначала вызываем стандартный обработчик, чтобы заполнить коллекцию команд
    ПродолжитьВызов(Источники, КомандыПечати);
    
    // Теперь модифицируем поведение команд для контроля проведения перед печатью
    Для Каждого Команда Из КомандыПечати Цикл
        
        // Проверяем типы документов, для которых нужно ввести жесткое ограничение
        Если Команда.МенеджерПечати = "Документ.РеализацияТоваровУслуг" 
            Или Команда.МенеджерПечати = "Документ.СчетФактураВыданный" Тогда
            
            // Включаем обязательную проверку проведения
            Команда.ПроверкаПроведенияПередПечатью = Истина;
            
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Важное преимущество данного подхода: этот метод централизованно блокирует печать ТОРГ-12, УПД, Счетов-фактур и любых других печатных форм, привязанных к выбранным документам. При этом основная конфигурация остается полностью типовой и обновляется без каких-либо сложностей.

Способ 3. Тонкая настройка прав пользователей

Что делать, если запретить печать непроведенных документов нужно не всем сотрудникам? Например, главному бухгалтеру или руководителю отдела продаж такая возможность может быть необходима для оперативной проверки макетов, а рядовым менеджерам — строго запрещена.

Для реализации такой избирательности мы можем использовать проверку ролей пользователей прямо в нашем расширении. Модернизируем наш код, добавив проверку роли:


&Вместо("ПриПолученииКомандПечати")
Процедура Расш_ПриПолученииКомандПечати(Источники, КомандыПечати)
    
    ПродолжитьВызов(Источники, КомандыПечати);
    
    // Если пользователь имеет полные права, не будем накладывать ограничения
    Если РольДоступна("ПолныеПрава") Тогда
        Возврат;
    КонецЕсли;
    
    // Блокировка для рядовых сотрудников
    Для Каждого Команда Из КомандыПечати Цикл
        Если Команда.МенеджерПечати = "Документ.РеализацияТоваровУслуг" Тогда
            Команда.ПроверкаПроведенияПередПечатью = Истина;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

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

Особенности работы с Внешними печатными формами (ВПФ)

Обратите внимание на важный технический нюанс. Если в вашей программе ТОРГ-12 или УПД подключены как внешние печатные формы (через справочник «Дополнительные отчеты и обработки»), стандартное свойство ПроверкаПроведенияПередПечатью в некоторых старых версиях БСП может игнорироваться.

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

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


// В модуле формы внешней печатной формы
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
    
    Для Каждого СсылкаНаДокумент Из ОбъектыНазначения Цикл
        
        // Проверяем статус проведения на сервере перед формированием
        Если Не ДокументПроведен(СсылкаНаДокумент) Тогда
            ПоказатьПредупреждение(, "Печать невозможна! Документ должен быть проведен.");
            Возврат;
        КонецЕсли;
        
    КонецЦикла;
    
    // Если все проверки пройдены, вызываем печать
    ОткрытьФормуПечати(ОбъектыНазначения);
    
КонецПроцедуры

Организационные методы обхода проблемы

Если у вас нет оперативной возможности привлечь программиста 1С для внедрения расширения, можно временно применить административные настройки интерфейса, которые усложнят менеджеру печать непроведенного документа «по ошибке»:

Мы подробно разобрали технические и организационные аспекты блокировки печати непроведенных документов. Рекомендуем использовать Способ 2 (с созданием расширения), так как он является наиболее безопасным, гибким и соответствующим современным стандартам разработки на платформе «1С:Предприятие 8.3».

← На главную