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