При переходе с классических реляционных баз данных на 1С разработчики часто сталкиваются с задачей организации сложных связей между данными. Стандартная модель с внешними ключами и каскадным обновлением/удалением, привычная в SQL, в 1С имеет свои аналоги и особенности. Рассмотрим, как реализовать иерархическую структуру «Изделие → Операция → Работник», чтобы она была гибкой, не привязывалась жестко к документам и позволяла отслеживать динамические производственные процессы.
Проанализируем ситуацию: нам нужно спроектировать систему для отслеживания производственных маршрутов. Маршрут состоит из изделия, последовательности операций для его изготовления и списка работников, выполняющих каждую операцию. Эта структура должна быть динамической, то есть данные по маршруту (например, статус выполнения) будут меняться. Хранить всё в одном документе неудобно, так как это потребует постоянного открытия и перепроведения документа, что не соответствует концепции 1С и может вызывать проблемы с блокировками.
Разберем несколько архитектурных подходов, которые предлагает платформа 1С для решения этой задачи, от самых простых до наиболее мощных и масштабируемых.
Самый простой и наглядный для пользователя вариант — реализовать всю структуру внутри одного объекта, например, документа МаршрутныйЛист. Для этого можно создать три табличные части:
Изделия — список изделий, производимых по этому маршрутному листу.Операции — список технологических операций.Исполнители — список работников, выполняющих операции.Связь между ними организуется вручную с помощью дополнительных реквизитов-идентификаторов. Например, в табличной части Операции добавляем реквизит ИдентификаторИзделия, а в Исполнители — ИдентификаторОперации. В качестве идентификатора можно использовать числовой счетчик или уникальный идентификатор (GUID), который генерируется при добавлении новой строки в родительскую таблицу.
Преимущества:
ДеревоЗначений), что очень удобно для пользователя.Недостатки:
Этот подход хорошо подходит для ввода первичной информации, которая в дальнейшем не будет сильно изменяться.
Это более гибкий и "правильный" с точки зрения архитектуры 1С подход. Вместо того чтобы хранить связи внутри документа, мы выносим их в отдельный объект — РегистрСведений. Назовем его, например, СоставПроизводственныхОпераций.
Структура регистра будет следующей:
Изделие (тип СправочникСсылка.Номенклатура)Операция (тип СправочникСсылка.ТехнологическиеОперации)Работник (тип СправочникСсылка.Сотрудники)ДатаНачалаДатаОкончанияСтатусВыполненияТакая структура представляет собой плоскую таблицу, где каждая запись — это уникальная связь "Изделие-Операция-Работник".
Пример записей в регистре:
Изделие 1 | Операция 1 | Работник 1 Изделие 1 | Операция 1 | Работник 2 Изделие 1 | Операция 2 | Работник 3
Преимущества:
Опасения и как с ними работать:
Часто возникает вопрос об избыточности: "Мы дублируем 'Изделие 1' и 'Операция 1' для каждого работника". В мире 1С такая денормализация — это не ошибка, а осознанный выбор в пользу производительности запросов. Попытка привести структуру к третьей нормальной форме (создавая отдельные регистры для каждой связи) усложнит код и замедлит получение данных.
Этот подход является развитием идеи с регистром сведений и активно применяется в типовых конфигурациях вроде 1С:ERP. Он идеально подходит, когда у вас много аналитических разрезов, и нужно оптимизировать хранение и обработку данных.
Суть метода:
КлючиАналитикиПроизводственныхМаршрутов.Изделие + Операция + Работник. У элемента справочника есть реквизиты, соответствующие этим измерениям.КлючАналитики (тип СправочникСсылка.КлючиАналитикиПроизводственныхМаршрутов).При записи данных система сначала ищет в справочнике элемент с нужной комбинацией "Изделие-Операция-Работник". Если находит — использует ссылку на него. Если нет — создает новый элемент и использует его.
Преимущества:
Недостатки:
Этот метод стоит применять в высоконагруженных системах с большим объемом данных и сложной аналитикой.
Если ваша задача — это не просто хранение связей, а управление процессом, его движением по этапам, назначение ответственных и контроль исполнения, то платформа 1С предлагает для этого идеальный инструмент — объекты БизнесПроцесс и Задача.
Как это работает:
ПроизводственныйМаршрут. В нем с помощью карты маршрута описывается последовательность этапов (точек маршрута).Задача для конкретных исполнителей ("Работник 1", "Работник 2").Преимущества:
Для задачи создания "рабочего места оператора цеха" с отслеживанием прохождения изделия по операциям, этот подход является наиболее мощным и соответствующим предметной области.
Выбор конкретного решения зависит от сложности вашей задачи. Не стоит сразу бросаться реализовывать самый сложный механизм.
Реализация через ручное управление GUID'ами, как в классической СУБД, возможна, но она лишает вас преимуществ платформенных механизмов 1С и перекладывает всю ответственность за целостность данных на плечи разработчика. Использование встроенных объектов 1С делает код более надежным, понятным и простым в поддержке.