Сбой автоматической нумерации документов — одна из распространенных проблем в типовых конфигурациях 1С, в частности в 1С:Бухгалтерия предприятия 3.0. Часто ситуация возникает из-за ручного вмешательства пользователя: достаточно изменить формат одного номера (добавить лишний дефис, убрать лидирующие нули или изменить префикс), как последующие документы начинают создаваться с некорректными номерами, а стандартный вызов метода обновления нумерации не дает ожидаемого результата.
Разберем детально, как платформа 1С и библиотека стандартных подсистем (БСП) формируют номера, почему возникают сбои и как по шагам восстановить правильную последовательность.
Проанализируем базовые механизмы платформы и типовых конфигураций, влияющие на расчет нового номера:
С-00-1, платформа определяет префикс как С-00-, а числовую часть — всего лишь как 1. Разрядность числа резко сокращается, и следующий номер не может корректно масштабироваться в пределах стандартной длины.0000-000000). Поиск максимального существующего номера СУБД выполняет посимвольно. Если пользователь вручную ввел короткий номер без лидирующих нулей (например, С000-9 вместо С000-000009), то при сравнении строк С000-9 оказывается лексикографически больше, чем С000-000009. В итоге автоинкремент пытается сформировать следующий номер от некорректной короткой строки.ПриУстановкеНовогоНомера. Префикс формируется по строгому шаблону: [ПрефиксОрганизации(2)][ПрефиксИБ(2)]-[Номер(6)]. Вызов метода ОбновитьНумерациюОбъектов() лишь сбрасывает кэш нумератора на сервере, но если в информационной базе остался хотя бы один документ с нарушенной маской, при первой же попытке сформировать новый номер БСП снова выберет этот максимальный «кривой» номер в качестве базового.Нередко при попытке найти проблемный документ через строку быстрого поиска или полнотекстовый поиск платформа выдает неожиданные результаты или не находит нужный объект. Выясним причину:
В языке поисковых выражений полнотекстового поиска 1С знак дефиса (минуса -) зарезервирован как оператор логического отрицания (НЕ / NOT), а также может разделять слова. При поиске по шаблону С-00-0 система пытается найти вхождения буквы «С», исключая последующие части строки. Чтобы найти точный номер с дефисами через строку поиска, обязательно заключайте выражение в двойные кавычки: "С-00-0".
Рассмотрим по шагам, как выявить все проблемные документы и вернуть корректную автонумерацию.
Визуально в журнале документов сложно заметить пропущенные лидирующие нули или скрытые символы. Поэтому выполним точный поиск через консоль запросов. Поскольку нумерация большинства расчетных документов (включая платежные поручения) ведется с периодичностью в пределах года, ограничим выборку текущим годом:
ВЫБРАТЬ
Док.Ссылка КАК Документ,
Док.Дата КАК Дата,
Док.Номер КАК Номер,
ДЛИНА(Док.Номер) КАК ДлинаНомера
ИЗ
Документ.ПлатежноеПоручение КАК Док
ГДЕ
Док.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ТекущаяДата, ГОД) И КОНЕЦПЕРИОДА(&ТекущаяДата, ГОД)
И (ДЛИНА(Док.Номер) <> 11
ИЛИ Док.Номер ПОДОБНО "%-%-%"
ИЛИ Док.Номер ПОДОБНО "% %")
Этот запрос позволит выявить документы, где длина номера отличается от 11 символов, присутствуют лишние дефисы или случайные пробелы.
Приведем номера всех найденных документов к типовому формату: 4 знака префикса + дефис + 6 знаков номера с лидирующими нулями (например, 0000-000123 или С000-000123). Для массового исправления воспользуемся типовой обработкой «Групповое изменение реквизитов» или выполним программную перезапись:
Выборка = Документы.ПлатежноеПоручение.Выбрать(НачалоГода(ТекущаяДата()), КонецГода(ТекущаяДата()));
Пока Выборка.Следующий() Цикл
// Проверяем и корректируем номер при необходимости
ОбъектДок = Выборка.ПолучитьОбъект();
ОбъектДок.ОбменДанными.Загрузка = Истина; // Отключаем подписки БСП при перезаписи
// Пример приведения: устанавливаем верный номер вручную
// ОбъектДок.Номер = "0000-000124";
// ОбъектДок.Записать();
КонецЦикла;
Важно: При программном изменении номеров обязательно устанавливайте режим ОбменДанными.Загрузка = Истина, чтобы избежать срабатывания типовых обработчиков подсистемы префиксации БСП при записи объекта.
После того как все документы текущего периода приведены к единому формату и помеченные на удаление некорректные документы окончательно удалены из базы, необходимо сбросить платформенный кэш нумератора. Выполним на сервере команду:
ОбновитьНумерациюОбъектов(Метаданные.Документы.ПлатежноеПоручение);
Если после выполнения предыдущих действий при создании нового документа номер продолжает формироваться некорректно:
Организации и настройках синхронизации данных (префикс информационной базы). В них не должно быть дефисов и спецсимволов.ОбновитьНумерациюОбъектов().