Как обеспечить уникальность фасетного кода договора при одновременной записи пользователями?

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

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

Использование Регистра Сведений с транзакционной блокировкой

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

Рассмотрим алгоритм действий:

  1. Открываем транзакцию записи в РегистрСведений.
  2. Накладываем исключительную блокировку на запись регистра, соответствующую конкретному виду договора, с помощью метода БлокироватьДляИзменения().
  3. Считываем текущее значение номера.
  4. Увеличиваем его на единицу.
  5. Записываем новое значение обратно в регистр.
  6. Завершаем транзакцию.

Важно помнить: блокировать нужно не весь регистр, а только конкретную запись по отбору, иначе производительность системы значительно упадет, так как пользователи начнут ждать очереди друг друга даже при работе с разными видами договоров.


// Пример логики получения номера в транзакции
НачатьТранзакцию();
МенеджерЗаписи = РегистрыСведений.НумераторыДоговоров.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ВидДоговора = ВыбранныйВид;
МенеджерЗаписи.БлокироватьДляИзменения(); // Ставим блокировку на запись
МенеджерЗаписи.Прочитать();

НовыйКод = МенеджерЗаписи.ЗначениеСчетчика + 1;
МенеджерЗаписи.ЗначениеСчетчика = НовыйКод;
МенеджерЗаписи.Записать();
ЗафиксироватьТранзакцию();

Использование справочника-нумератора

Еще более надежный способ, который часто рекомендуют эксперты, — это вынесение логики генерации в отдельный служебный справочник. Платформа 1С берет на себя все заботы по обеспечению уникальности кода (автонумерации) на уровне СУБД.

Суть метода:

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

Иерархическая структура справочника

Если фасетный код договора жестко привязан к его виду, стоит рассмотреть вариант использования Иерархии внутри самого справочника договоров. Если вы сделаете папки «Виды договоров» на первом уровне, а сами договоры — на втором, вы сможете использовать стандартную платформенную настройку нумерации «в пределах подчинения».

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

Оптимизация и работа в распределенных системах

В высоконагруженных системах или при использовании распределенных информационных баз (РИБ) стоит учитывать следующие нюансы:

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

← На главную