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

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

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

Разбор ошибки: почему не работает код из первого сообщения?

Первым делом проанализируем ошибку, с которой столкнулся автор: Поле объекта не обнаружено (Статус). Причина кроется в неправильном обращении к данным. В 1С Справочники.Книги — это менеджер объекта, который отвечает за управление списком в целом, а не за конкретный элемент. Чтобы изменить реквизит конкретной книги, необходимо сначала получить её экземпляр как объект.

Рассмотрим, как технически исправить эту ошибку, если вы решили пойти по пути прямой модификации справочника:


Процедура ОбработкаПроведения(Отказ, Режим)
    // Получаем объект справочника по ссылке, которая хранится в документе
    ОбъектКнига = Книга.ПолучитьОбъект();
    
    // Теперь, когда мы работаем с объектом, можно изменять его реквизиты
    ОбъектКнига.Статус = Перечисления.СтатусКниги.Выдана;
    
    // Обязательно записываем изменения в базу данных
    ОбъектКнига.Записать();
КонецПроцедуры

Почему прямая запись — это методически неверный путь?

Хотя вышеприведенный код позволит решить задачу «в лоб», профессиональные разработчики 1С избегают такого подхода. Давайте выясним, почему прямая модификация справочника считается плохой практикой:

  1. Проблемы с блокировками: При выполнении метода Записать() вся запись справочника блокируется. Если у вас интенсивная работа, другие пользователи не смогут даже открыть карточку книги, пока ваш документ проводится. Это неизбежно приведет к «зависаниям» системы.
  2. Отсутствие истории: Справочник хранит текущее состояние. Если вы просто перезаписываете реквизит Статус, вы навсегда теряете информацию о том, когда и кто именно менял этот статус в прошлом.
  3. Сложность отмены проведения: Если пользователь решит пометить документ на удаление или отменить его проведение, вам придется писать дополнительный код, чтобы вернуть книге статус Свободна. При использовании регистров платформа делает это автоматически.

Рекомендуемый стандарт: использование Регистра сведений

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

Создадим непериодический регистр сведений СостояниеКниг. В нем будут следующие данные:

При проведении документа ВыдачаКниг вместо работы со справочником, мы будем добавлять запись в этот регистр. Это позволит нам в любой момент времени с помощью виртуальной таблицы СрезПоследних получить актуальный статус книги на текущую дату, не затрагивая основной элемент справочника.

Подведем итоги

Для корректной работы системы мы рекомендуем следующие шаги:

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

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

← На главную