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