Почему в 1С пропускаются или не выводятся определенные номера документов и как это исправить?

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

Каждый специалист, работающий с базами данных «1С:Предприятие» в клиент-серверном варианте (под управлением MS SQL Server или PostgreSQL), рано или поздно сталкивается со странным поведением автонумерации. Типичный сценарий: система автоматически присваивает номера документам, но внезапно один из номеров (например, «12АВ») наотрез отказывается выводиться автоматически. При этом последующие номера («13АВ», «14АВ») создаются без каких-либо трудностей, а ручной ввод проблемного номера не вызывает ошибок уникальности. Выясним причину этой проблемы и подробно разберем, как восстановить корректный порядок автонумерации.

Причины сбоя автонумерации в клиент-серверном режиме

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

Рассмотрим основные ситуации, из-за которых конкретный номер выпадает из кэша и становится недоступным для автоматического назначения:

  1. Транзакционные сбои и отмены операций. Когда пользователь нажимает кнопку создания нового документа, сервер 1С выделяет из своего кэша очередной свободный номер (например, «12АВ»). Если в процессе заполнения или проведения документа возникла ошибка выполнения кода, оборвалось сетевое соединение или пользователь просто закрыл форму без сохранения, этот номер возвращается в кэш не всегда. Если в свойствах конфигурации для данного документа режим автонумерации установлен в значение «Не освобождать автоматически», этот номер резервируется навсегда и больше никогда не будет предложен системой в автоматическом режиме.
  2. Восстановление базы данных из резервной копии СУБД. Это наиболее частая причина «пропажи» номеров на практике. Представим ситуацию: администратор сделал бэкап базы данных средствами MS SQL Server в 12:00. После этого пользователи создали несколько документов, получивших номера с 1 по 15. В 13:00 происходит сбой, и базу восстанавливают из бэкапа за 12:00. При этом сам сервер приложений «1С:Предприятие» не перезапускается. В оперативной памяти процессов rphost сохраняется информация о том, что номера с 1 по 15 уже были выданы. Однако в восстановленной базе данных этих документов физически не существует. При попытке создать первый документ после восстановления сервер выдаст ему номер 16, оставив «дыру» в нумерации с 1 по 15.
  3. Многопоточный запрос номеров. При одновременной работе большого количества пользователей сервер выдает номера порциями (кэш-пулами). Если один из пользователей, забравший себе пул номеров, не использовал их до конца сеанса, эти номера могут временно или насовсем заблокироваться для автонумерации.

Решение 1: Программный сброс кэша с помощью метода ОбновитьНумерациюОбъектов()

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

Проанализируем синтаксис данного метода. Мы можем вызывать его двумя способами:

Разберем по шагам, как написать и применить обработку для исправления нумерации на примере документа «Счет-фактура выданный»:

  1. Запустим базу данных в режиме Конфигуратор.
  2. В меню выберем Файл — Новый, укажем тип файла Внешняя обработка.
  3. В открывшемся окне свойств обработки назовем ее «ВосстановлениеНумерации» и перейдем на вкладку Формы.
  4. Добавим новую форму обработки (форму управляемого приложения) и назначим ее основной.
  5. На вкладке Команды создадим новую команду формы с именем ВыполнитьОбновление. Перетащим ее на панель элементов формы, чтобы создать кнопку.
  6. В свойствах команды нажмем на лупу в поле «Действие», выберем вариант создания обработчика событий НаКлиентеИНаСервереБезКонтекста.
  7. В открывшемся модуле формы напишем следующий код:

&НаКлиенте
Процедура ВыполнитьОбновление(Команда)
    
    // Вызываем серверную процедуру для безопасного выполнения метода
    ВыполнитьОбновлениеНаСервере();
    ПоказатьПредупреждение(, "Кэш автонумерации счетов-фактур успешно сброшен!");
    
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьОбновлениеНаСервере()
    
    Попытка
        // Сбрасываем кэш номеров конкретно для счетов-фактур выданных
        ОбновитьНумерациюОбъектов(Метаданные.Документы.СчетФактураВыданный);
    Исключение
        // В случае непредвиденных ошибок выводим информацию для диагностики
        ВызватьИсключение "Не удалось обновить нумерацию. Описание ошибки: " + ОписаниеОшибки();
    КонецПопытки;
    
КонецПроцедуры

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

Решение 2: Перезапуск службы сервера «1С:Предприятие»

Если у вас нет доступа к конфигуратору или вы не можете запускать внешние обработки из-за ограничений прав доступа, существует альтернативный административный метод. Поскольку кэшированные номера хранятся непосредственно в оперативной памяти процессов rphost службы сервера 1С, очистить этот кэш можно путем перезапуска всей службы.

Рассмотрим порядок действий для операционной системы Windows:

  1. Подключимся к серверу приложений 1С через удаленный рабочий стол (RDP) с правами администратора.
  2. Откроем оснастку управления службами. Для этого нажмем комбинацию клавиш Win + R, введем команду services.msc и нажмем Enter.
  3. В списке служб найдем службу с именем Агент сервера 1С:Предприятия 8.3 (или 1C:Enterprise 8.3 Server Agent).
  4. Нажмем на нее правой кнопкой мыши и выберем пункт Перезапустить.

Если сервер работает под управлением операционной системы Linux, перезапуск службы выполняется через терминал одной из следующих команд (в зависимости от дистрибутива и версии платформы):


systemctl restart srv1cv83
// или для более старых версий
service srv1cv83 restart

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

Решение 3: Проверка встроенными инструментами конфигурации

Если мы работаем в типовой конфигурации (например, «1С:Бухгалтерия предприятия»), мы можем воспользоваться встроенными механизмами анализа данных, которые выполняют проверку последовательности номеров без необходимости написания программного кода.

Проанализируем работу инструмента «Экспресс-проверка ведения учета». Чтобы запустить ее, выполним следующие шаги:

  1. Перейдем в раздел меню Отчеты — Анализ учета — Экспресс-проверка.
  2. В настройках отчета укажем интересующий нас период и перейдем в детальные настройки.
  3. Развернем раздел Ведение книги продаж по налогу на добавленную стоимость или Операции по кассе (в зависимости от того, какой документ имеет сбой нумерации).
  4. Установим флаг напротив проверки Соблюдение нумерации счетов-фактур (или кассовых документов).
  5. Нажмем кнопку Выполнить проверку.

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

Скрытые причины «невидимости» номера

Если вы выполнили обновление нумерации объектов и перезапустили сервер 1С, но номер «12АВ» все равно упорно игнорируется системой при автонумерации, велика вероятность того, что этот номер на самом деле физически существует в базе данных, но скрыт от ваших глаз. Рассмотрим подробнее, как провести диагностику и выявить скрытые проблемы:

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

← На главную