Каждый специалист, работающий с базами данных «1С:Предприятие» в клиент-серверном варианте (под управлением MS SQL Server или PostgreSQL), рано или поздно сталкивается со странным поведением автонумерации. Типичный сценарий: система автоматически присваивает номера документам, но внезапно один из номеров (например, «12АВ») наотрез отказывается выводиться автоматически. При этом последующие номера («13АВ», «14АВ») создаются без каких-либо трудностей, а ручной ввод проблемного номера не вызывает ошибок уникальности. Выясним причину этой проблемы и подробно разберем, как восстановить корректный порядок автонумерации.
Для того чтобы понять, почему система «пропускает» конкретный номер, нам необходимо заглянуть под капот платформы «1С:Предприятие». В клиент-серверной архитектуре генерацией номеров занимается специальный внутренний менеджер платформы на уровне сервера приложений. Чтобы оптимизировать производительность и исключить постоянные блокировки таблиц базы данных при одновременной работе сотен пользователей, сервер 1С кэширует диапазоны номеров в своей оперативной памяти (в рабочих процессах rphost).
Рассмотрим основные ситуации, из-за которых конкретный номер выпадает из кэша и становится недоступным для автоматического назначения:
rphost сохраняется информация о том, что номера с 1 по 15 уже были выданы. Однако в восстановленной базе данных этих документов физически не существует. При попытке создать первый документ после восстановления сервер выдаст ему номер 16, оставив «дыру» в нумерации с 1 по 15.Самым надежным и быстрым способом вернуть «пропавший» номер в оборот является принудительное обновление механизма автонумерации платформы. Для этого в глобальном контексте «1С:Предприятия» существует специализированный метод ОбновитьНумерациюОбъектов(). Этот метод дает команду серверу приложений полностью очистить текущий кэш номеров в ОЗУ, обратиться напрямую к физическим таблицам СУБД, вычислить максимальный реально существующий номер в базе данных для каждого префикса и продолжить нумерацию строго со следующего за ним значения.
Проанализируем синтаксис данного метода. Мы можем вызывать его двумя способами:
ОбновитьНумерациюОбъектов() — без параметров. В этом случае платформа инициирует тотальный пересчет кэша для абсолютно всех справочников и документов, существующих в конфигурации. Важно помнить: на крупных корпоративных базах данных такой вызов может привести к существенному снижению производительности и временному «зависанию» рабочих процессов сервера.ОбновитьНумерациюОбъектов(Метаданные.Документы.ИмяДокумента) — с указанием конкретного объекта метаданных. Это наиболее правильный, точечный метод, который мгновенно решает проблему для целевого документа, не затрагивая остальные объекты системы.Разберем по шагам, как написать и применить обработку для исправления нумерации на примере документа «Счет-фактура выданный»:
ВыполнитьОбновление. Перетащим ее на панель элементов формы, чтобы создать кнопку.НаКлиентеИНаСервереБезКонтекста.
&НаКлиенте
Процедура ВыполнитьОбновление(Команда)
// Вызываем серверную процедуру для безопасного выполнения метода
ВыполнитьОбновлениеНаСервере();
ПоказатьПредупреждение(, "Кэш автонумерации счетов-фактур успешно сброшен!");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьОбновлениеНаСервере()
Попытка
// Сбрасываем кэш номеров конкретно для счетов-фактур выданных
ОбновитьНумерациюОбъектов(Метаданные.Документы.СчетФактураВыданный);
Исключение
// В случае непредвиденных ошибок выводим информацию для диагностики
ВызватьИсключение "Не удалось обновить нумерацию. Описание ошибки: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
После написания кода сохраним обработку на жесткий диск. Теперь нам необходимо запустить базу данных в режиме 1С:Предприятие, открыть сохраненную внешнюю обработку через меню «Файл» — «Открыть» (или через функции для технического специалиста) и нажать на созданную нами кнопку. После выполнения этой процедуры платформа очистит кэш, и следующий создаваемый счет-фактура автоматически получит пропущенный номер «12АВ» (при условии, что в базе действительно нет других документов с таким номером).
Если у вас нет доступа к конфигуратору или вы не можете запускать внешние обработки из-за ограничений прав доступа, существует альтернативный административный метод. Поскольку кэшированные номера хранятся непосредственно в оперативной памяти процессов rphost службы сервера 1С, очистить этот кэш можно путем перезапуска всей службы.
Рассмотрим порядок действий для операционной системы Windows:
Win + R, введем команду services.msc и нажмем Enter.1C:Enterprise 8.3 Server Agent).Если сервер работает под управлением операционной системы Linux, перезапуск службы выполняется через терминал одной из следующих команд (в зависимости от дистрибутива и версии платформы):
systemctl restart srv1cv83
// или для более старых версий
service srv1cv83 restart
Важное предупреждение: перезапуск службы сервера 1С приведет к мгновенному принудительному завершению сеансов всех пользователей, работающих в данный момент в любых базах данных на этом сервере. Этот метод рекомендуется применять только во внерабочее время, согласовав процедуру с пользователями системы.
Если мы работаем в типовой конфигурации (например, «1С:Бухгалтерия предприятия»), мы можем воспользоваться встроенными механизмами анализа данных, которые выполняют проверку последовательности номеров без необходимости написания программного кода.
Проанализируем работу инструмента «Экспресс-проверка ведения учета». Чтобы запустить ее, выполним следующие шаги:
Программа проанализирует всю хронологию документов за выбранный период. Если будут обнаружены пропуски, дубли или нарушения хронологического порядка, система выдаст подробный отчет с рекомендациями и в некоторых случаях предложит автоматически перенумеровать документы для восстановления правильной последовательности.
Если вы выполнили обновление нумерации объектов и перезапустили сервер 1С, но номер «12АВ» все равно упорно игнорируется системой при автонумерации, велика вероятность того, что этот номер на самом деле физически существует в базе данных, но скрыт от ваших глаз. Рассмотрим подробнее, как провести диагностику и выявить скрытые проблемы:
СОКРЛП() или анализируя длину строки номера с помощью функции ДЛИНАСТРОКИ().Мы подробно разобрали все грани проблемы сбоя автонумерации в «1С:Предприятии». Понимание механизмов кэширования платформы и умение использовать метод ОбновитьНумерациюОбъектов() позволят вам оперативно решать подобные технические инциденты и поддерживать порядок в учете вашей компании.