Разберем задачу, с которой часто сталкиваются начинающие разработчики: создание механизма проверки документов с произвольными статусами. Основная сложность заключается в том, чтобы запись в регистр сведений происходила не в момент проведения документа, а непосредственно в момент нажатия кнопки пользователем на форме.
Для того чтобы механизм работал корректно и не вызывал ошибок при обращении к базе данных, важно соблюдать два ключевых правила:
МенеджерЗаписи. Это эффективнее, чем работа с НаборЗаписей, так как не требует предварительного чтения всего набора.Создадим процедуру в модуле формы с директивой &НаСервере. Она будет принимать новый статус и записывать его в регистр. Это позволит избежать дублирования кода.
&НаСервере
Процедура ОбновитьСтатусНаСервере(НовыйСтатус)
МенеджерЗаписи = РегистрыСведений.ЛП_СтатусыПроверкиДокументов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Документ = Объект.Ссылка;
// Считываем запись, чтобы проверить её наличие или изменить существующую
МенеджерЗаписи.Прочитать();
МенеджерЗаписи.СтатусПроверки = НовыйСтатус;
МенеджерЗаписи.ДатаИзменения = ТекущаяДатаСеанса();
МенеджерЗаписи.Изменил = Пользователи.ТекущийПользователь();
// Записываем данные в базу
МенеджерЗаписи.Записать();
КонецПроцедуры
Теперь рассмотрим процедуру, которая вызывается при нажатии на кнопку. Здесь мы управляем визуальным состоянием элементов формы и вызываем серверный код.
&НаКлиенте
Процедура ИзменениеСтатусаПроверкиДокумента(Команда)
// Определяем, какой статус нужно установить в зависимости от текущего состояния
Если Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда
НовыйСтатус = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке");
Иначе
НовыйСтатус = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен");
КонецЕсли;
// Вызываем запись на сервере
ОбновитьСтатусНаСервере(НовыйСтатус);
// Обновляем визуальное состояние
ЭтаФорма.СтатусДокумента = НовыйСтатус;
Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка = НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка;
КонецПроцедуры
Чтобы при открытии формы пользователь видел актуальный статус, необходимо выполнить запрос к регистру сведений в событии ПриСозданииНаСервере. Важно предусмотреть случай, когда записи еще нет (новый документ).
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ СтатусПроверки ИЗ РегистрСведений.ЛП_СтатусыПроверкиДокументов ГДЕ Документ = &Документ";
Запрос.УстановитьПараметр("Документ", Объект.Ссылка);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
ЭтаФорма.СтатусДокумента = Выборка.СтатусПроверки;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
F9) в коде и анализируйте переменные. Если отладка не запускается, проверьте настройки конфигуратора: Отладка -> Подключение.МенеджерЗаписи именно значение перечисления, а не ссылку на элемент управления (декорацию или кнопку).ДополнительныеСвойства удобны, но для нашей задачи лучше использовать прямые серверные вызовы. Это делает код более читаемым и легким для поддержки.Объект.Ссылка доступна только после того, как документ был записан в базу. Если вы пытаетесь создать запись для еще не сохраненного документа, 1С выдаст ошибку <Объект не найден>. Всегда делайте проверку Если ЗначениеЗаполнено(Объект.Ссылка) Тогда.Следуя этим шагам, вы сможете реализовать гибкий и независимый механизм смены статусов, который будет работать стабильно и не будет зависеть от проведения или удаления проведения вашего документа.