Как реализовать обязательное создание счета-фактуры при оформлении реализации в 1С?

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

В процессе автоматизации учета часто возникает задача «принудительного» создания связанных документов. Одной из самых популярных заявок является требование бухгалтерии: «Не позволять пользователю выходить из реализации, пока он не выпишет счет-фактуру». На первый взгляд задача кажется простой — достаточно перехватить событие закрытия формы. Однако на практике такой подход ведет к серьезным техническим проблемам и неудобству пользователей. Рассмотрим детально, почему стандартные методы блокировки формы могут не работать и как правильно реализовать эту логику с точки зрения архитектуры 1С.

Почему попытка блокировки через событие ПередЗакрытием терпит неудачу

Разберем ситуацию, с которой часто сталкиваются начинающие разработчики. При попытке вставить проверку в процедуру ПередЗакрытием управляемой формы через расширение с директивой &Вместо, программа может вести себя непредсказуемо: игнорировать точки останова или вовсе аварийно завершать работу. Выясним причину этого поведения.

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

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


&НаКлиенте
Процедура Расш1_ПередЗакрытиемВместо(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    // Попытка проверки
    Если НЕ ПроверкаНаличияСчетФактуры() Тогда
        Отказ = Истина; // Блокируем закрытие
        Сообщить("Счет-фактура не создана!");
    КонецЕсли;
КонецПроцедуры

Такой подход неэффективен, так как он не учитывает, что пользователь может просто нажать Alt+F4 или закрыть все приложение. Система не «выпускает» только из конкретной формы, но не может надежно контролировать жизненный цикл всего сеанса без ущерба для стабильности.

Правильный подход: Использование триггера проведения документа

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

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

Разберем по шагам, как реализовать автоматическое создание или проверку в расширении для процедуры ОбработкаПроведения:

  1. Создадим расширение для документа РеализацияТоваровУслуг.
  2. Добавим в расширение процедуру-обработчик ПередЗаписью или подписку на событие ОбработкаПроведения.
  3. В коде реализуем проверку наличия связанного документа СчетФактураВыданный через запрос к базе данных.

Пример реализации проверки в модуле объекта через расширение:


&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если РежимПроведения = РежимПроведенияДанных.Проведение Тогда
        // Проверяем, существует ли уже счет-фактура по этому основанию
        Если НЕ СФСуществует(ЭтотОбъект.Ссылка) Тогда
            // Здесь может быть либо автоматическое создание, 
            // либо выдача предупреждения пользователю
            АвтоматическоеСозданиеСчетФактуры(ЭтотОбъект);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Автоматизация создания счета-фактуры программным способом

Рассмотрим подробнее, как программно создать счет-фактуру, чтобы пользователю не приходилось делать это вручную. В типовой конфигурации «1С:Бухгалтерия» существуют общие модули, упрощающие эту задачу. Мы можем использовать методы для работы с НДС, чтобы гарантировать корректное заполнение всех реквизитов.

Выясним, как выглядит процедура создания документа на основании:


Процедура АвтоматическоеСозданиеСчетФактуры(ДокументОснование)
    
    // Создаем новый объект Счет-фактура выданный
    НоваяСФ = Документы.СчетФактураВыданный.СоздатьДокумент();
    НоваяСФ.Дата = ДокументОснование.Дата;
    НоваяСФ.Организация = ДокументОснование.Организация;
    
    // Заполняем на основании реализации
    НоваяСФ.Заполнить(ДокументОснование.Ссылка);
    
    Попытка
        НоваяСФ.Записать(РежимЗаписиДокумента.Проведение);
        Сообщить("Счет-фактура № " + НоваяСФ.Номер + " создан автоматически.");
    Исключение
        ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось создать счет-фактуру: " + ТекстОшибки);
    КонецПопытки;
    
КонецПроцедуры

Использование программного создания при проведении — это гораздо более «дружелюбный» интерфейс по сравнению с блокировкой закрытия формы. Пользователь просто нажимает «Провести и закрыть», а система сама выполняет всю рутинную работу в фоновом режиме.

Альтернативные методы контроля

Если автоматическое создание по каким-то причинам не подходит (например, требуется ручной ввод специфических реквизитов счета-фактуры), проанализируем другие способы контроля:

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

← На главную