Как правильно реализовать подтверждение пользователем проведения документа в 1С?

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

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

Почему нельзя просто вызвать вопрос в модуле объекта?

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

Решение через дополнительные свойства

Лучший способ реализовать проверку — это передать «сигнал» из клиентской формы в серверный код через ДополнительныеСвойства объекта. Рассмотрим этот алгоритм по шагам:

  1. В форме документа: при нажатии на кнопку «Провести» мы сначала проверяем, нужно ли задавать вопрос. Если нужно, вызываем ПоказатьВопрос.
  2. Обработка ответа: если пользователь нажал «Да», мы устанавливаем специальный флаг в объект, который передаем на сервер.
  3. В модуле объекта: мы проверяем этот флаг в событии ПередЗаписью. Если флага нет, выполнение прерывается.

Посмотрим, как это выглядит на практике:


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

&НаКлиенте
Процедура ПослеВопроса(Результат, ДопПараметры) Экспорт
    Если Результат = КодВозвратаДиалога.Да Тогда
        Объект.ДополнительныеСвойства.Вставить("Подтвержден", Истина);
        Записать();
    КонецЕсли;
КонецПроцедуры

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

Почему групповое проведение — это критический момент?

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


Если ОбщегоНазначениеКлиентСервер.ЭтоКлиент() Тогда
    // Здесь можно показывать вопросы
КонецЕсли;

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

Если вопрос «Вы уверены?» задается слишком часто, возможно, стоит пересмотреть подход к бизнес-процессу. Рассмотрим более профессиональные варианты:

Выясним причину: использование ДополнительныхСвойств является наиболее чистым архитектурным решением, так как оно позволяет «протащить» решение пользователя через слой записи, не ломая при этом работу автоматизированных механизмов системы. Анализируйте свои задачи комплексно и всегда учитывайте автоматические процессы в 1С!

← На главную