Одной из самых раздражающих проблем в работе пользователя и программиста 1С является внезапный сбой нумерации. Система начинает выдавать ошибку: «Номер не уникальный», хотя визуально кажется, что следующий свободный номер должен быть доступен. Особенно часто это проявляется при вводе Счет-фактура полученный на основании документов поступления.
В данной статье мы подробно разберем, почему возникает эта ситуация, как работают механизмы платформы 8.3 и какие шаги необходимо предпринять, чтобы восстановить автоматическую нумерацию и предотвратить ее повторение в будущем.
Для начала проанализируем ситуацию. Платформа 1С определяет следующий номер документа, исходя из максимального существующего номера в базе за текущий период (обычно год) в разрезе префикса организации и префикса информационной базы. Рассмотрим основные факторы, которые приводят к ошибке уникальности:
0000-000001, то появление в базе номера, заполненного до предела (например, 99999999999 или номер с лишней буквой), лишает программу возможности инкрементировать (увеличить на единицу) текущее значение.1С:Розница или внешними системами (так называемыми «нетленками») могут приходить документы с номерами, которые не соответствуют принятому в текущей базе шаблону. Если в «Рознице» был вручную изменен номер документа, при загрузке в Бухгалтерию он может стать «максимальным», и автонумерация в основной базе начнет отсчет от него.Прежде чем что-то исправлять, нам нужно понять, какой именно номер система считает «последним». Для этого воспользуемся консолью запросов. Проанализируем список документов за текущий год, отсортировав их по номеру в обратном порядке.
Обратим внимание на документы, номера которых выбиваются из общего ряда по длине или формату префикса. Если мы находим документ с номером вроде ЯЯЯ-00001 или просто слишком длинную цифровую строку без ведущих нулей, это и есть источник проблемы. Система видит этот «максимальный» номер и пытается прибавить к нему единицу, что приводит к ошибке.
Если визуально все номера выглядят корректно, но ошибка сохраняется, вероятно, произошел сбой внутреннего счетчика (кэша) платформы. В 1С существует встроенный механизм для принудительного пересчета последнего номера. Рассмотрим, как применить метод ОбновитьНумерациюОбъектов.
Для выполнения этой операции можно создать простейшую обработку или воспользоваться консолью кода. Разберем программный пример для документа СчетФактураПолученный:
// Пример обновления нумерации для конкретного типа документа
МетаданныеОбъекта = Метаданные.Документы.СчетФактураПолученный;
ОбновитьНумерациюОбъектов(МетаданныеОбъекта);
Сообщить("Нумерация для счетов-фактур успешно обновлена");
Этот метод заставляет сервер перечитать таблицу базы данных и сбросить текущий закэшированный индекс. После выполнения этой команды платформа найдет действительно максимальный номер в таблице и продолжит нумерацию с него.
Рассмотрим подробнее ситуацию с длиной. Если в базе обнаружены номера разной длины, их необходимо привести к единому стандарту. Важно: в номерах 1С ведущие нули имеют критическое значение.
Посмотрим на пример:
0000-000123124 (без префикса и нулей)Если в базе появился короткий номер 124, система может начать воспринимать его как больший, чем 0000-000123, из-за особенностей строковой сортировки. В таком случае необходимо вручную или с помощью групповой обработки изменить некорректные номера, добавив в них недостающие префиксы и нули до стандартной длины, установленной в конфигурации.
Если проблема со сбивающейся нумерацией повторяется регулярно (например, раз в неделю), проанализируем настройки самого объекта в Конфигураторе. Для документа можно изменить режим автонумерации.
Найдем в дереве метаданных Документы -> СчетФактураПолученный, перейдем на вкладку «Прочее» и нажмем кнопку «Автонумерация». В поле «Кэширование» вместо значения «Авто» можно установить «Не использовать». Это немного снизит производительность при массовом создании документов (так как сервер будет обращаться к таблице БД за каждым новым номером), но зато полностью исключит потерю номеров при сбоях сервера.
Разберем важный нюанс. В 1С:Бухгалтерии для документа СчетФактураПолученный существует два поля номера:
Ошибка уникальности часто возникает именно по внутреннему номеру, который иногда скрыт с формы. Проверьте, не настроены ли в базе расширения или дописки, которые пытаются программно присвоить внутреннему номеру значение номера поставщика. Поскольку номера у разных поставщиков могут совпадать (например, многие начинают год с номера 1), это неизбежно приведет к конфликту уникальности.
Для того чтобы нумерация больше не «слетала», придерживайтесь следующих правил:
Во-первых, запретите пользователям редактировать номера документов вручную. В настройках профилей групп доступа можно снять право «Редактирование номера».
Во-вторых, при настройке синхронизации с другими базами (например, с Розницей) всегда устанавливайте уникальные префиксы информационных баз (например, «РЗ» для розницы и «БП» для бухгалтерии). Это позволит документам сосуществовать в одной базе, не мешая нумерации друг друга.
В-третьих, после любых регламентных работ на сервере или массового удаления документов рекомендуется профилактически выполнять команду ОбновитьНумерациюОбъектов через консоль администратора.
Соблюдение этих простых шагов позволит вам поддерживать порядок в учете и избежать неприятных пауз в работе бухгалтерской службы.