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