Как организовать связь «многие ко многим» между справочниками устройств и картриджей в 1С

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

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

Почему табличные части — не лучшее решение

Начинающие разработчики часто пытаются решить задачу через создание табличной части в справочнике Устройства. Проанализируем, почему этот путь ведет в тупик:

  1. Дублирование данных: Если один и тот же картридж подходит к 50 моделям принтеров, вам придется 50 раз заносить его в табличные части разных устройств.
  2. Сложность обратного поиска: Если вам нужно узнать, к каким принтерам подходит конкретный картридж, придется писать тяжелый запрос, перебирающий все табличные части всех устройств.
  3. Трудности обновления: При изменении характеристик связи (например, добавлении примечания по заправке) данные придется менять в десятках мест.

Разберем более профессиональный подход, который сделает систему гибкой и масштабируемой.

Использование регистра сведений для связи «многие ко многим»

Для реализации связи «многие ко многим» оптимально использовать Регистр сведений. Это специальный объект 1С, предназначенный для хранения многомерной информации. Рассмотрим структуру такого регистра (назовем его СовместимостьКартриджей):

Измерения:

Реквизиты:

Такая структура позволяет нам один раз создать запись в регистре, которая свяжет конкретную модель принтера с конкретной моделью картриджа. Теперь поиск в обе стороны (какие картриджи подходят принтеру и каким принтерам подходит картридж) будет выполняться мгновенно простым запросом к регистру.

Разделение на «Модели» и «Экземпляры»

Выясним важный нюанс: в системе учета не стоит путать физический принтер, стоящий на столе у бухгалтера (экземпляр с серийным номером), и абстрактную модель устройства. Проанализируем правильную иерархию справочников:

  1. Справочник МоделиУстройств: Содержит список всех существующих моделей (например, HP LaserJet P1102).
  2. Справочник Устройства (или Инвентарь): Содержит записи о конкретных принтерах. У каждой записи есть реквизит Модель, ссылающийся на первый справочник.

Аналогично поступаем с картриджами. Совместимость в регистре сведений мы прописываем именно для Моделей. Это избавляет нас от необходимости указывать подходящие картриджи для каждого из 100 закупленных одинаковых принтеров по отдельности.

Автоматизация интерфейса: Динамические списки

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

Рассмотрим по шагам настройку такого списка:

  1. Добавим на форму справочника Устройства таблицу.
  2. Укажем в качестве источника данных ДинамическийСписок.
  3. В запросе динамического списка пропишем связь с нашим регистром сведений.

Пример запроса для динамического списка (в контексте формы устройства):


ВЫБРАТЬ
    РегистрСовместимость.МодельКартриджа КАК Картридж,
    РегистрСовместимость.Примечание
ИЗ
    РегистрСведений.СовместимостьКартриджей КАК РегистрСовместимость
ГДЕ
    РегистрСовместимость.МодельУстройства = &МодельТекущегоУстройства

Теперь при открытии карточки любого принтера система сама «сходит» в регистр, найдет подходящие модели и выведет их на экран. Пользователю кажется, что данные хранятся в устройстве, хотя на самом деле они лежат в отдельной оптимизированной таблице.

Фильтрация в документах через «Связи параметров выбора»

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

Разберем алгоритм настройки:

  1. В свойствах реквизита Картридж найдем пункт «Связи параметров выбора».
  2. Установим отбор по владельцу или через специальный параметр, передающий модель выбранного устройства.
  3. Если типовых настроек не хватает, используем программный способ в событии НачалоВыбора.

Пример программной установки отбора:


&НаКлиенте
Процедура КартриджНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Получаем массив подходящих моделей из регистра через серверный вызов
    СписокПодходящих = ПолучитьСписокСовместимыхКартриджей(Объект.Принтер.Модель);
    
    ПараметрыВыбора = Новый Структура;
    ПараметрыВыбора.Вставить("Отбор", Новый Структура("Ссылка", СписокПодходящих));
    
    ОткрытьФорму("Справочник.Картриджи.ФормаВыбора", ПараметрыВыбора, Элемент);
    
КонецПроцедуры

Жизненный цикл и учет состояний

Помимо совместимости, важно учитывать и текущее состояние картриджей. Для этого лучше использовать периодический Регистр сведений СостоянияКартриджей. Это позволит отслеживать историю: когда картридж был «Новый», когда стал «В работе», когда ушел «На заправку» и когда был «Списан».

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

← На главную