Как реализовать неблокирующие проверки при записи документов в 1С:ЗУП 3.1?

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

Часто в процессе разработки конфигураций на базе 1С возникает задача: нужно предупредить пользователя о некорректных данных или потенциальных ошибках в документе, но при этом не блокировать процесс записи или проведения. В типовой конфигурации 1С:ЗУП 3.1, дополненной расширениями, стандартный подход через клиентскую процедуру ПередЗаписью часто вызывает неудобства, особенно если пользователь нажимает «Провести и закрыть», теряя все выведенные сообщения. Давайте разберем, как грамотно организовать такой механизм.

Использование обработки проверки заполнения

Один из самых архитектурно верных способов — перенос логики проверок в стандартный обработчик ОбработкаПроверкиЗаполнения(). Это позволяет системе корректно обрабатывать события записи на стороне сервера. Однако, если мы хотим избежать жесткой блокировки (вызова Отказ = Истина), нам нужно продумать способ передачи информации пользователю.

Разберем основные варианты реализации:

  1. Индикация без блокировки: Вместо того чтобы прерывать запись через Отказ = Истина, мы можем записывать предупреждения в специальный реквизит формы или временное хранилище. В форме документа можно добавить динамический индикатор, например, иконку с предупреждением, которая будет загораться, если система нашла отклонения.
  2. Управление закрытием формы: Если мы хотим принудительно показать сообщения, но сохранить возможность записи, мы можем ввести булевый реквизит формы, например, ЕстьПредупреждения. Если при попытке закрытия формы этот признак установлен, мы можем прервать закрытие, пока пользователь не ознакомится со списком ошибок.

Реализация неблокирующей логики с помощью вспомогательных форм

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

Рассмотрим пример логики:


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

Такой подход позволяет пользователю увидеть список замечаний, не закрывая текущую форму документа. Однако здесь возникает важный нюанс: что, если пользователь проигнорировал сообщения или форма была сразу закрыта? Для критически важных проверок рекомендуется не просто выводить окно, а сохранять состояние «непрочитанных замечаний» в РегистрСведений, привязанный к пользователю.

Использование механизма оповещений и уведомлений

Для более современного интерфейса можно использовать механизм оповещений. Вместо того чтобы пытаться удержать пользователя в форме документа, система может отправить уведомление, которое появится в правом нижнем углу экрана. Это не мешает работе, но гарантирует, что пользователь узнает о проблеме.

Основные преимущества такого подхода:

Как не потерять важную информацию при закрытии?

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

Для создания полноценного «Журнала предупреждений» рекомендуем использовать:

  1. РегистрСведений: хранит данные о всех выявленных предупреждениях с привязкой к Регистратор и Пользователь.
  2. ОбработчикОжидания: позволяет проверять наличие новых сообщений для текущего пользователя в фоне и выводить их через системные уведомления.
  3. Условное оформление: в списке документов выводите значок для тех записей, по которым в регистре есть актуальные непросмотренные замечания.

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

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

← На главную