Каждый администратор и разработчик 1С рано или поздно сталкивается с ситуацией, когда пользователи случайно или намеренно вручную изменяют номер какого-либо документа. В результате этого автонумерация в системе «слетает» — новые документы начинают создаваться со сбившимися префиксами или номерами из неверного диапазона. Даже после того как мы находим и исправляем некорректный номер вручную, платформа продолжает настойчиво подставлять ошибочные номера при создании новых объектов.
В этой статье мы подробно разберем, почему стандартные механизмы исправления нумерации часто не дают результатов в современных конфигурациях на базе БСП (включая «1С:Управление торговлей 11», «1С:Комплексная автоматизация 2» и «1С:ERP Управление предприятием 2»), и пошагово рассмотрим методы полного решения этой проблемы.
Для начала проанализируем ситуацию. В более ранних версиях платформ и конфигураций «1С:Предприятие» для восстановления автонумерации было достаточно исправить некорректный номер в документе-первоисточнике и выполнить метод ОбновитьНумерациюОбъектов(). В крайнем случае требовалось перезапустить службу сервера 1С, чтобы очистить кэш выданных номеров.
В современных конфигурациях ситуация усложнилась из-за двух ключевых факторов:
РеестрДокументов. Это главный виновник того, почему «не работают» стандартные методы. Для оптимизации работы динамических списков и ускорения механизмов RLS (разграничения прав на уровне записей) разработчики БСП вынесли отображение списков документов в отдельный индексированный регистр. В нем хранятся реквизиты НомерДокументаИБ и ДатаДокументаИБ. Именно из этого регистра система часто считывает данные для отображения в журналах и для некоторых алгоритмов префиксации. Если мы изменили номер документа программно в обход стандартных подписок на события (например, с включенным режимом ОбменДанными.Загрузка = Истина), данные в регистре остаются старыми.Рассмотрим по шагам, как правильно и в какой последовательности локализовать и устранить сбой автонумерации.
---
Прежде чем приступать к сбросу системных кэшей, нам необходимо убедиться, что в базе данных действительно не осталось документов со сбитыми номерами. Сделать это лучше всего с помощью простого запроса в консоли запросов. Напишем и выполним следующий запрос для анализа номеров документов РеализацияТоваровУслуг:
ВЫБРАТЬ Ссылка, Номер, Дата
ИЗ Документ.РеализацияТоваровУслуг КАК Реализация
УПОРЯДОЧИТЬ ПО Номер УБЫВ
Внимательно изучим результат запроса. Обратим внимание на символы в номерах. Распространенная ошибка — использование схожих по написанию русских и латинских букв (например, «О» и «0», «Х» и «X»). Платформа сортирует их по-разному, и визуально незаметный символ может уводить диапазон нумерации в неверную сторону. Если обнаружены некорректные документы, исправим их номера на правильные.
---
Выясним, назначен ли для нашего документа общий нумератор. Для этого откроем конфигуратор, найдем документ РеализацияТоваровУслуг и перейдем на вкладку «Нумерация». Если поле «Нумератор» заполнено, значит, автонумерация этого документа не является независимой.
Если нумератор используется, то вызов метода обновления нумерации по конкретному метаданному документа не принесет результата. Нам потребуется обновить нумерацию для всего нумератора в целом.
---
Для того чтобы принудительно заставить платформу забыть старый диапазон номеров, выполним метод ОбновитьНумерациюОбъектов(). Напишем небольшую внешнюю обработку или воспользуемся обработкой «Групповое изменение реквизитов» для выполнения произвольного алгоритма на сервере:
// Если документ имеет индивидуальную нумерацию:
ОбновитьНумерациюОбъектов(Метаданные.Документы.РеализацияТоваровУслуг);
// Если документ использует общий нумератор (подставим имя нумератора из конфигуратора):
ОбновитьНумерациюОбъектов(Метаданные.НумераторыДокументов.Продажи);
// Универсальный вариант (выполняет обновление нумерации по всей базе данных):
ОбновитьНумерациюОбъектов();
После выполнения данного кода настоятельно рекомендуется произвести полный перезапуск службы сервера «1С:Предприятие». Дело в том, что рабочие процессы сервера (rphost) кэшируют пулы свободных номеров. Чтобы гарантированно очистить оперативную память процессов от старого кэша, остановим службу сервера 1С, убедимся в диспетчере задач операционной системы, что все процессы rphost, rmngr и ragent успешно завершены, и запустим службу вновь. В случае работы на тестовом сервере самым надежным решением будет полная перезагрузка операционной системы сервера.
---
Проанализируем ситуацию: мы исправили номера в документах, очистили серверный кэш, но при создании нового документа система снова предлагает некорректный номер. Это явный признак того, что данные зависли в регистре РеестрДокументов.
Давайте убедимся в этом. Откроем функции для технического специалиста, найдем регистр сведений Реестр документов и настроим отбор по типу нашего документа. Мы увидим, что в колонке Номер документа (ИБ) для измененных документов все еще отображаются старые ошибочные значения.
Чтобы исправить это рассогласование, нам необходимо принудительно перезаписать записи регистра. Сделать это можно двумя способами.
Напишем простую обработку, которая переберет измененные документы и запишет их в обычном режиме (без использования флага загрузки обмена данными). При обычной записи автоматически сработают подписки на события БСП, которые обновят записи в регистре сведений:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода";
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ТекущаяДата()));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
// Записываем документ в режиме Запись, чтобы обновился РеестрДокументов
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;
Если у нас нет возможности писать код в базе данных, воспользуемся стандартной обработкой «Групповое изменение реквизитов»:
0 (ноль) и нажмем кнопку «Изменить реквизиты». Все выбранные документы получат нулевые номера.[Установить автоматически] (или [Авто]) и запустим процесс изменения.При использовании этого метода система последовательно и корректно присвоит документам новые правильные номера, при этом автоматически отработают все подписки на события БСП, и данные в регистре сведений РеестрДокументов синхронизируются без риска возникновения ошибок дублирования ключей.
---
При устранении проблем с автонумерацией в современных решениях на платформе «1С:Предприятие 8.3» необходимо действовать комплексно. Не ограничивайтесь простым исправлением номера в документе. Всегда проверяйте наличие общего нумератора, сбрасывайте кэш транзакций сервера с помощью метода ОбновитьНумерациюОбъектов() и обязательно актуализируйте вспомогательные регистры сведений, такие как РеестрДокументов.