Почему при одновременной записи документов в 1С возникает ошибка уникальности номера и как это исправить?

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

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

Причина 1: Некорректная архитектура кластера и работа NumerationService

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

Проанализируем, что происходит, если два сервера 1С работают с одной базой данных как независимые единицы, а не как узлы одного кластера:

  1. Сервер №1 выделяет пользователю «А» номер 001.
  2. Сервер №2, не зная о действиях первого сервера, выделяет пользователю «Б» тот же номер 001 из своего собственного кэша.
  3. Тот пользователь, который нажмет кнопку «Записать» первым, успешно создаст документ. Второй пользователь получит ошибку уникальности, так как в таблице базы данных номер 001 уже занят.

Решение: Правильная настройка кластера серверов. Рассмотрим шаги по исправлению архитектуры:

Причина 2: Использование устаревших механизмов нумерации в коде

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

Для принудительного обновления кэша и получения актуального номера из базы данных используется метод ОбновитьНумерациюОбъектов. Его рекомендуется вызывать перед записью проблемных документов. Рассмотрим пример реализации:


// В модуле объекта или перед вызовом Записать()
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    // Принудительно обновляем нумерацию для данного типа документа
    // Это заставляет сервер перечитать последний номер из БД
    ОбновитьНумерациюОбъектов(Метаданные.Документы.ЗаказПоставщику);
    
КонецПроцедуры

Также важно пересмотреть момент установки номера. Если логика конфигурации позволяет, лучше устанавливать номер непосредственно в транзакции записи, используя подписку на событие ПриУстановкеНовогоНомера. В этом случае блокировка таблицы номеров будет минимальной по времени, а вероятность дублей практически исчезнет.

Причина 3: Проблема «исчезающих» дат в отчетах на СКД

Выясним причину странного поведения системы, когда на одном сервере колонки с датами отображаются, а на другом — нет. Если настройки СКД идентичны, а очистка кэша (папки LocalSettings\Application Data\1C\1Cv8) не помогает, причину следует искать в региональных стандартах операционной системы на самих серверах.

Разберем, как это работает:

  1. Компоновка данных формирует запрос к SQL-серверу.
  2. При получении результата сервер 1С интерпретирует типы данных, опираясь на системные настройки даты и времени (Locale).
  3. Если на одном сервере установлена локаль «Русский (Россия)», а на другом «English (US)», формат разделителей и порядок элементов в дате могут конфликтовать с внутренними ожиданиями СКД. В итоге значение даты может превратиться в NULL, и система просто скроет колонку, считая ее пустой или ошибочной.

Что нужно сделать:

Причина 4: Зависание пользователей при превышении лимита (51-й пользователь)

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

Рассмотрим основные факторы влияния:

Посмотрим, как оптимизировать работу: рекомендуется устанавливать лимит соединений на один rphost в районе 20–30 пользователей для повышения стабильности. Это позволит распределить нагрузку более равномерно.

Итоговые рекомендации

Для стабильной работы 1С в многосерверной среде необходимо соблюдать три золотых правила. Во-первых, всегда объединяйте серверы в единый Логический Кластер, чтобы NumerationService работал централизованно. Во-вторых, синхронизируйте настройки ОС (региональные стандарты) на всех физических машинах, где установлен rphost. В-третьих, если вы сталкиваетесь с ошибками уникальности в типовых конфигурациях после переноса сервера, обязательно выполните команду:


// Выполнить один раз в консоли запросов или внешней обработке
ОбновитьНумерациюОбъектов();

Это сбросит все накопившиеся ошибки в кэшах менеджеров и позволит системе начать нумерацию с «чистого листа», опираясь на реальные данные в таблицах СУБД.

← На главную