В торговых и производственных компаниях часто возникает классическая проблема взаимодействия между отделом продаж и складом. Менеджер оформляет документ реализации, пытается его провести, но система выдает ошибку — например, из-за фактического отсутствия товара на свободном остатке. Чтобы не упустить клиента или ускорить процесс, менеджер просто распечатывает непроведенную товарную накладную (ТОРГ-12) или УПД и передает ее на склад. Кладовщик, ориентируясь на бумажный носитель, отпускает товар. В итоге учет ломается: товар со склада ушел, в программе он числится, себестоимость не списана, а бухгалтерия в конце месяца вынуждена вручную разбираться с отрицательными остатками.
В типовой конфигурации «1С:Бухгалтерия предприятия 3.0» (БП 3.0) отсутствует стандартная «галочка» в пользовательском интерфейсе, которая могла бы запретить печать непроведенных документов для определенных пользователей. В этой статье мы подробно разберем, как решить данную задачу программными методами, не нарушая типовую конфигурацию и сохраняя возможность беспрепятственного обновления программы.
Прежде чем переходить к написанию кода, давайте разберем, как устроена система печати в современных конфигурациях 1С на управляемых формах. За вывод печатных форм отвечает специализированная подсистема БСП — «Печать».
Каждая команда печати (будь то ТОРГ-12, Акт об оказании услуг или УПД) регистрируется в модуле менеджера соответствующего документа в процедуре ДобавитьКомандыПечати(КомандыПечати). В этой процедуре описываются свойства команды, включая ее идентификатор, представление, а также важные поведенческие флаги.
Одним из ключевых свойств структуры описания команды является флаг ПроверкаПроведенияПередПечатью. Если это свойство имеет значение Истина, платформа 1С автоматически выполняет следующую логику:
По умолчанию для многих документов в БП 3.0 это свойство установлено в значение Ложь, что и позволяет менеджерам беспрепятственно печатать черновики документов.
Рассмотрим самый простой способ реализации запрета для конкретного документа (например, РеализацияТоваровУслуг). Для этого нам потребуется определить команду печати и принудительно установить признак проверки проведения.
Если мы заглянем в модуль менеджера документа РеализацияТоваровУслуг, то найдем там процедуру описания команд печати. Нам необходимо модернизировать код регистрации конкретной команды (например, для ТОРГ-12). Код будет выглядеть следующим образом:
// В модуле менеджера документа РеализацияТоваровУслуг
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
// Поиск существующей команды печати ТОРГ-12 и изменение ее свойств
Для Каждого Команда Из КомандыПечати Цикл
Если Команда.Идентификатор = "ТОРГ12" Или Команда.Идентификатор = "ТОРГ12БезУслуг" Тогда
Команда.ПроверкаПроведенияПередПечатью = Истина;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот способ рабочий, но у него есть существенный недостаток: непосредственное изменение типовой конфигурации снимает объект с поддержки или усложняет процесс полуавтоматического обновления. Чтобы избежать проблем с обновлением, мы настоятельно рекомендуем использовать механизм расширений.
Давайте разберем по шагам, как решить эту задачу изящно и безопасно с помощью механизма расширений. Мы напишем универсальный код, который будет перехватывать формирование всех команд печати в системе и изменять свойство контроля проведения для нужных нам документов и печатных форм.
Выполним следующие действия:
БлокировкаПечатиНепроведенных). Назначение выберем Адаптация.УправлениеПечатьюПереопределяемый.УправлениеПечатьюПереопределяемый переопределим процедуру ПриПолученииКомандПечати с помощью аннотации &Вместо.Давайте проанализируем код, который мы напишем в общем модуле расширения:
&Вместо("ПриПолученииКомандПечати")
Процедура Расш_ПриПолученииКомандПечати(Источники, КомандыПечати)
// Сначала вызываем стандартный обработчик, чтобы заполнить коллекцию команд
ПродолжитьВызов(Источники, КомандыПечати);
// Теперь модифицируем поведение команд для контроля проведения перед печатью
Для Каждого Команда Из КомандыПечати Цикл
// Проверяем типы документов, для которых нужно ввести жесткое ограничение
Если Команда.МенеджерПечати = "Документ.РеализацияТоваровУслуг"
Или Команда.МенеджерПечати = "Документ.СчетФактураВыданный" Тогда
// Включаем обязательную проверку проведения
Команда.ПроверкаПроведенияПередПечатью = Истина;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важное преимущество данного подхода: этот метод централизованно блокирует печать ТОРГ-12, УПД, Счетов-фактур и любых других печатных форм, привязанных к выбранным документам. При этом основная конфигурация остается полностью типовой и обновляется без каких-либо сложностей.
Что делать, если запретить печать непроведенных документов нужно не всем сотрудникам? Например, главному бухгалтеру или руководителю отдела продаж такая возможность может быть необходима для оперативной проверки макетов, а рядовым менеджерам — строго запрещена.
Для реализации такой избирательности мы можем использовать проверку ролей пользователей прямо в нашем расширении. Модернизируем наш код, добавив проверку роли:
&Вместо("ПриПолученииКомандПечати")
Процедура Расш_ПриПолученииКомандПечати(Источники, КомандыПечати)
ПродолжитьВызов(Источники, КомандыПечати);
// Если пользователь имеет полные права, не будем накладывать ограничения
Если РольДоступна("ПолныеПрава") Тогда
Возврат;
КонецЕсли;
// Блокировка для рядовых сотрудников
Для Каждого Команда Из КомандыПечати Цикл
Если Команда.МенеджерПечати = "Документ.РеализацияТоваровУслуг" Тогда
Команда.ПроверкаПроведенияПередПечатью = Истина;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Таким образом, администраторы и руководство сохранят гибкость работы, а менеджеры по продажам будут ограничены жесткими рамками бизнес-логики предприятия.
Обратите внимание на важный технический нюанс. Если в вашей программе ТОРГ-12 или УПД подключены как внешние печатные формы (через справочник «Дополнительные отчеты и обработки»), стандартное свойство ПроверкаПроведенияПередПечатью в некоторых старых версиях БСП может игнорироваться.
Если вы столкнулись с ситуацией, когда внешняя печатная форма продолжает выводиться на печать для непроведенного документа, вам необходимо модифицировать саму внешнюю обработку. Откройте обработку в конфигураторе и найдите функцию СведенияОВнешнейОбработке().
В таблице команд внешней обработки для свойства Использование укажите тип запуска ВызовКлиентскогоМетода вместо ВызовСерверногоМетода. В модуле формы внешней обработки перед формированием табличного документа добавьте явную проверку:
// В модуле формы внешней печатной формы
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
Для Каждого СсылкаНаДокумент Из ОбъектыНазначения Цикл
// Проверяем статус проведения на сервере перед формированием
Если Не ДокументПроведен(СсылкаНаДокумент) Тогда
ПоказатьПредупреждение(, "Печать невозможна! Документ должен быть проведен.");
Возврат;
КонецЕсли;
КонецЦикла;
// Если все проверки пройдены, вызываем печать
ОткрытьФормуПечати(ОбъектыНазначения);
КонецПроцедуры
Если у вас нет оперативной возможности привлечь программиста 1С для внедрения расширения, можно временно применить административные настройки интерфейса, которые усложнят менеджеру печать непроведенного документа «по ошибке»:
Ещё -> Настроить список -> Отбор, выберите поле Проведен со значением Да. Менеджер просто не будет видеть непроведенные документы в общем списке, что снизит вероятность случайной групповой печати.Администрирование -> Проведение документов) установлена галочка «Разрешить списание запасов при отсутствии остатков по данным учета» в положение Выключено. Это не позволит менеджерам проводить документы задним числом в «минус» и заставит их оперативно решать проблемы с пересортицей совместно с кладовщиками и закупщиками.Мы подробно разобрали технические и организационные аспекты блокировки печати непроведенных документов. Рекомендуем использовать Способ 2 (с созданием расширения), так как он является наиболее безопасным, гибким и соответствующим современным стандартам разработки на платформе «1С:Предприятие 8.3».