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