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