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