При разработке конфигураций на платформе 1С:Предприятие часто возникает необходимость изменения состояния справочных данных на основе действий пользователя. В данной статье мы разберем, почему прямой доступ к элементам справочника может приводить к ошибкам и как правильно реализовать смену статуса книги при проведении документа ВыдачаКниг.
Первым делом проанализируем ошибку, с которой столкнулся автор: Поле объекта не обнаружено (Статус). Причина кроется в неправильном обращении к данным. В 1С Справочники.Книги — это менеджер объекта, который отвечает за управление списком в целом, а не за конкретный элемент. Чтобы изменить реквизит конкретной книги, необходимо сначала получить её экземпляр как объект.
Рассмотрим, как технически исправить эту ошибку, если вы решили пойти по пути прямой модификации справочника:
Процедура ОбработкаПроведения(Отказ, Режим)
// Получаем объект справочника по ссылке, которая хранится в документе
ОбъектКнига = Книга.ПолучитьОбъект();
// Теперь, когда мы работаем с объектом, можно изменять его реквизиты
ОбъектКнига.Статус = Перечисления.СтатусКниги.Выдана;
// Обязательно записываем изменения в базу данных
ОбъектКнига.Записать();
КонецПроцедуры
Хотя вышеприведенный код позволит решить задачу «в лоб», профессиональные разработчики 1С избегают такого подхода. Давайте выясним, почему прямая модификация справочника считается плохой практикой:
Записать() вся запись справочника блокируется. Если у вас интенсивная работа, другие пользователи не смогут даже открыть карточку книги, пока ваш документ проводится. Это неизбежно приведет к «зависаниям» системы.Статус, вы навсегда теряете информацию о том, когда и кто именно менял этот статус в прошлом.Свободна. При использовании регистров платформа делает это автоматически.Для решения задачи учета состояния объектов, которые могут меняться во времени, в 1С принято использовать регистры сведений. Это архитектурно правильный подход, который делает систему гибкой и масштабируемой. Давайте разберем, как это работает:
Создадим непериодический регистр сведений СостояниеКниг. В нем будут следующие данные:
Книга (тип СправочникСсылка.Книги).Статус (тип ПеречислениеСсылка.СтатусКниги), Читатель (тип СправочникСсылка.Читатели).При проведении документа ВыдачаКниг вместо работы со справочником, мы будем добавлять запись в этот регистр. Это позволит нам в любой момент времени с помощью виртуальной таблицы СрезПоследних получить актуальный статус книги на текущую дату, не затрагивая основной элемент справочника.
Для корректной работы системы мы рекомендуем следующие шаги:
ПолучитьОбъект() при проведении документов.ОбработкаПроведения формируйте движения по регистру. Это позволит не только избежать блокировок, но и даст возможность строить полноценные отчеты по движению книжного фонда в будущем.Использование механизмов регистров — это стандарт разработки, который защитит вашу систему от рассогласования данных и обеспечит высокую скорость работы даже при больших объемах информации.