Как создать механизм проверки документов с тремя статусами в 1С:Предприятие 8.3

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

Разберем процесс создания надежного механизма изменения статусов документов. Основная задача — обеспечить запись состояния документа в РегистрСведений непосредственно после нажатия кнопки, минуя механизм проведения документа. Это позволяет гибко управлять статусами «Не проверен», «Проверен» и «К повторной проверке».

Шаг 1: Правильная архитектура записи в регистр

Первым делом проанализируем ошибку смешивания логики. Часто новички пытаются писать в регистр в процедуре ОбработкаПроведения. Это приводит к тому, что статус затирается или дублируется. Мы должны использовать серверную процедуру, вызываемую из модуля формы при нажатии кнопки.

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

Шаг 2: Реализация записи статуса при нажатии кнопки

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


&НаСервере
Процедура ЗаписьВРегистр(СтатусДляЗаписи)
    НаборЗаписей = РегистрыСведений.ЛП_СтатусыПроверкиДокументов.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Документ.Установить(Объект.Ссылка);
    НаборЗаписей.Прочитать();
    
    Если НаборЗаписей.Количество() = 0 Тогда
        Запись = НаборЗаписей.Добавить();
        Запись.Документ = Объект.Ссылка;
    Иначе
        Запись = НаборЗаписей[0];
    КонецЕсли;
    
    Запись.СтатусПроверки = СтатусДляЗаписи;
    Запись.Проверил = Пользователи.ТекущийПользователь();
    Запись.ДатаПроверки = ТекущаяДатаСеанса();
    
    НаборЗаписей.Записать(Истина);
КонецПроцедуры

Шаг 3: Логика смены статусов

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


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

Шаг 4: Основные рекомендации для корректной работы

  1. Очистка модуля объекта: Убедитесь, что в процедуре ОбработкаПроведения модуля объекта больше нет кода, который принудительно устанавливает статус НеПроверен, если этот статус уже был задан пользователем через кнопку.
  2. Использование отладчика: Это основной инструмент программиста. Установите точку останова в начале процедуры ИзменениеСтатусаПроверкиДокумента на клиенте и пошагово пройдите выполнение до серверной процедуры. Проверяйте содержимое переменных Объект.Ссылка и СтатусПроверки на каждом этапе.
  3. Имена объектов: Всегда проверяйте написание имен метаданных. Ошибки типа «Таблица не найдена» часто возникают из-за лишних пробелов или опечаток в именах регистров или перечислений.
  4. Разделение данных: Используйте ДополнительныеСвойства только в том случае, если вам необходимо передать статус из формы в процедуру проведения документа для каких-то отчетных целей. Если же статус должен обновляться мгновенно — прямой вызов записи в регистр из формы является предпочтительным.

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

← На главную