Как реализовать независимую смену статусов документа через регистр сведений в 1С?

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

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

Основные принципы решения задачи

Для того чтобы механизм работал корректно и не вызывал ошибок при обращении к базе данных, важно соблюдать два ключевых правила:

  1. Разделение клиентской и серверной логики: Вся работа с данными (запись в регистр, чтение статуса, выполнение запросов) должна происходить исключительно на сервере. Форма документа — это клиент, здесь мы только отображаем информацию и реагируем на действия пользователя.
  2. Использование правильных объектов записи: Если вам нужно записать или изменить одну конкретную строку регистра сведений, лучше всего использовать объект МенеджерЗаписи. Это эффективнее, чем работа с НаборЗаписей, так как не требует предварительного чтения всего набора.

Шаг 1: Создание серверной процедуры записи статуса

Создадим процедуру в модуле формы с директивой &НаСервере. Она будет принимать новый статус и записывать его в регистр. Это позволит избежать дублирования кода.


&НаСервере
Процедура ОбновитьСтатусНаСервере(НовыйСтатус)
    МенеджерЗаписи = РегистрыСведений.ЛП_СтатусыПроверкиДокументов.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Документ = Объект.Ссылка;
    
    // Считываем запись, чтобы проверить её наличие или изменить существующую
    МенеджерЗаписи.Прочитать();
    
    МенеджерЗаписи.СтатусПроверки = НовыйСтатус;
    МенеджерЗаписи.ДатаИзменения = ТекущаяДатаСеанса();
    МенеджерЗаписи.Изменил = Пользователи.ТекущийПользователь();
    
    // Записываем данные в базу
    МенеджерЗаписи.Записать();
КонецПроцедуры

Шаг 2: Обработка нажатия кнопки на клиенте

Теперь рассмотрим процедуру, которая вызывается при нажатии на кнопку. Здесь мы управляем визуальным состоянием элементов формы и вызываем серверный код.


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

Шаг 3: Инициализация статуса при открытии документа

Чтобы при открытии формы пользователь видел актуальный статус, необходимо выполнить запрос к регистру сведений в событии ПриСозданииНаСервере. Важно предусмотреть случай, когда записи еще нет (новый документ).


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ СтатусПроверки ИЗ РегистрСведений.ЛП_СтатусыПроверкиДокументов ГДЕ Документ = &Документ";
        Запрос.УстановитьПараметр("Документ", Объект.Ссылка);
        Результат = Запрос.Выполнить();
        
        Если НЕ Результат.Пустой() Тогда
            Выборка = Результат.Выбрать();
            Выборка.Следующий();
            ЭтаФорма.СтатусДокумента = Выборка.СтатусПроверки;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Полезные советы для начинающих

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

← На главную