Сбой нумерации в 1С:Предприятии — одна из тех проблем, которая кажется незначительной на первый взгляд, но может привести к серьезным организационным трудностям. Особенно часто это встречается в конфигурации 1С:Бухгалтерия 3.0, когда пользователи случайно или намеренно удаляют ведущие нули в номере документа (например, в «Реализации товаров и услуг»). В результате программа перестает автоматически присваивать корректные номера, «цепляясь» за ошибочный короткий номер.
В этой статье мы подробно проанализируем, почему так происходит, разберем внутренние алгоритмы платформы 1С и рассмотрим несколько способов решения проблемы, от простых организационных до технических манипуляций в конфигураторе.
Давайте разберем механику сравнения номеров. В системе 1С номера документов — это не числа, а строки. Сравнение строк происходит посимвольно слева направо (лексикографически). Рассмотрим пример из обсуждения:
У3БП-006737У3БП-6737Когда система ищет следующий свободный номер, она ищет максимальное значение среди существующих. При сравнении этих двух строк программа доходит до 5-го символа. В первом случае это «0», во втором — «6». Поскольку символ «6» больше, чем «0», номер У3БП-6737 признается системой как «более поздний». Следующим номером в такой последовательности станет У3БП-6738, и никакие стандартные действия не заставят программу автоматически вернуться к формату с нулями, пока в базе существует хотя бы один номер, начинающийся на «6» сразу после префикса.
Для понимания того, как бороться с проблемой, проанализируем алгоритм восстановления нумерации, заложенный в платформу:
Самый правильный с точки зрения логики системы способ — это вернуть недостающие нули во всех «кривых» документах. Рассмотрим, как это сделать правильно:
Если бухгалтерия утверждает, что «править нельзя, так как документы уже отправлены», стоит напомнить, что в большинстве печатных форм 1С префиксы и ведущие нули отсекаются программно. То есть в печатной форме номер У3БП-006737 и У3БП-6737 будет выглядеть одинаково — «6737». Следовательно, техническое добавление нулей в базе не изменит бумажный документ, выданный клиенту.
Если документов слишком много, и ручная правка затруднительна, можно воспользоваться встроенным методом платформы ОбновитьНумерациюОбъектов. Однако помните: он сработает только в том случае, если вы уже исправили все номера, которые система считала максимальными.
Для выполнения этой команды можно использовать внешнюю обработку или «Групповое изменение реквизитов», но эффективнее всего запустить короткий фрагмент кода в консоли кода:
ВыборкаМетаданных = Метаданные.Документы.РеализацияТоваровУслуг;
ОбновитьНумерациюОбъектов(ВыборкаМетаданных);
Сообщить("Нумерация для документа Реализация успешно обновлена");
Если же исправить номера категорически запрещено, можно прибегнуть к «хитрости», предложенной опытными участниками форума. Задача — сделать так, чтобы система считала «кривые» номера принадлежащими к другой серии, которая не мешает основной.
Разберем пример подмены символов. В префиксах часто используются буквы, которые выглядят одинаково в русской и английской раскладке:
Для системы номер У3БП-6737 (с русской У) и Y3БП-6737 (с английской Y) — это абсолютно разные последовательности. Как только вы измените префикс в «неправильных» документах, они перестанут быть «максимальными» для основной ветки нумерации с префиксом У3БП-. После этого создайте новый документ, и система предложит номер У3БП-006737 (или следующий за последним правильным).
Внимание: Будьте осторожны с этим методом, если ваша база участвует в обмене данными (РИБ или синхронизация с другими конфигурациями). Изменение префикса может повлиять на идентификацию объектов в других базах, хотя в современных версиях 1С обмен чаще идет по уникальному идентификатору (GUID).
Поскольку рассматриваемая база является серверной, в игру вступает механизм кэширования номеров. Сервер 1С (рабочий процесс rmngr) резервирует блоки номеров для ускорения работы. Даже после исправления всех документов в базе, сервер может продолжать выдавать «плохие» номера из своей памяти.
Проанализируем шаги по очистке кэша в серверном варианте:
Если нужно массово добавить нули в документы, не заходя в каждый, рассмотрим пример кода, который можно использовать в простой обработке. Этот код добавит недостающие нули до нужной длины (в примере — 11 символов):
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка КАК Ссылка,
| Реализация.Номер КАК Номер
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| ДЛИНА(Реализация.Номер) < 11";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
ДокОбъект = Результат.Ссылка.ПолучитьОбъект();
СтарыйНомер = СокрЛП(Результат.Номер);
// Выделяем префикс и числовую часть (упрощенно)
Префикс = Лев(СтарыйНомер, 5); // Например, 'У3БП-'
ЧисловаяЧасть = Сред(СтарыйНомер, 6);
// Формируем новый номер с нулями
НовыйНомер = Префикс + Прав("000000" + ЧисловаяЧасть, 6);
ДокОбъект.Номер = НовыйНомер;
Попытка
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
Сообщить("Исправлен номер: " + СтарыйНомер + " -> " + НовыйНомер);
Исключение
Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Для восстановления нумерации в 1С:Бухгалтерии 3.0 необходимо действовать системно:
ОбновитьНумерациюОбъектов() или перезапустить сервер 1С.Помните, что платформа 1С всегда стремится продолжить самую «старшую» строку, поэтому ваша главная задача — сделать ошибочные номера «младше» правильных в глазах системы.