На каком методе перехватывать событие проведения, отмены или удаления документа для изменения картинки на форме

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

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

Механизм реализации через стандартные обработчики формы

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

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

Разберем пример кода для реализации этой логики:


&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    ОбновитьКартинкуСостояния(ТекущийОбъект);
КонецПроцедуры

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
    ОбновитьКартинкуСостояния(ТекущийОбъект);
КонецПроцедуры

&НаСервере
Процедура ОбновитьКартинкуСостояния(ДанныеОбъекта)
    // Предположим, у нас есть программно созданный реквизит формы "ИндексСостояния"
    // Индексы в коллекции картинок: 0 - проведен, 1 - удаление, 2 - черновик
    Если ДанныеОбъекта.ПометкаУдаления Тогда
        ЭтаФорма.ИндексСостояния = 1;
    ИначеЕсли ДанныеОбъекта.Проведен Тогда
        ЭтаФорма.ИндексСостояния = 0;
    Иначе
        ЭтаФорма.ИндексСостояния = 2;
    КонецЕсли;
КонецПроцедуры

Проблема перехвата пометки на удаление

Часто возникает вопрос: почему события ПриЗаписиНаСервере или ПослеЗаписиНаСервере якобы не срабатывают при установке пометки на удаление? Выясним причину этого заблуждения. Если пользователь устанавливает или снимает пометку удаления через меню «Еще — Установить / Снять пометку удаления» непосредственно в открытой форме документа, платформа инициирует стандартный цикл записи объекта. В этом случае все серверные события записи обязательно вызываются.

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

  1. В форме списка при изменении состояния вызывается метод Оповестить("Запись_ИмяДокумента", Параметры, Объект.Ссылка).
  2. В форме документа создается клиентский обработчик ОбработкаОповещения.
  3. При получении нужного сигнала форма вызывает метод ЭтаФорма.Прочитать(), который на сервере инициирует событие ПриЧтенииНаСервере, где у нас уже прописана логика обновления картинки.

Использование дополнительных свойств объекта

В некоторых случаях нам недостаточно знать только стандартные свойства Проведен или ПометкаУдаления. Например, если нужно отобразить флаг «Ручная корректировка», который проверяется в модуле объекта. Рассмотрим способ передачи данных из модуля объекта обратно в форму через ДополнительныеСвойства.

В модуле объекта пишем следующий код:


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

Затем в форме документа в обработчике ПриЗаписиНаСервере мы можем извлечь эти данные из объекта, который передается в параметре ТекущийОбъект:


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

Альтернативный метод: Условное оформление формы

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

Алгоритм настройки:

  1. Создаем реквизит формы СостояниеДокумента (тип: Число).
  2. В обработчике ПриСозданииНаСервере или через редактор формы настраиваем условное оформление:
    • Условие: СостояниеДокумента Равно 1 (Пометка удаления).
    • Оформление: Картинка = БиблиотекаКартинок.СостояниеУдален.
  3. В коде нам остается только менять значение числового реквизита, а визуальная часть обновится автоматически.

Особенности работы через расширения

Если вы реализуете данный функционал в расширении, обратите внимание на аннотации. Рекомендуется использовать &После для процедуры ПослеЗаписиНаСервере. Это гарантирует, что основная конфигурация уже завершила все действия с объектом, и данные в базе данных окончательно зафиксированы. Использование ПередЗаписьюНаСервере в расширении может привести к тому, что вы получите еще «старое» состояние объекта Проведен, которое изменится только в процессе выполнения основной транзакции записи.

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

← На главную