Каждый технический специалист или опытный пользователь 1С рано или поздно сталкивается с неприятной ситуацией: при создании нового документа или элемента справочника система внезапно предлагает совершенно «левый» номер. Например, вместо ожидаемого очередного номера БП00-000456 программа генерирует короткий код 1, 0001 или вовсе выдает ошибку «Код не уникален». При этом восстановить правильную последовательность вручную не удается — следующий созданный объект все равно генерируется с нарушением логики.
В рамках этой статьи мы подробно разберем, почему ломается механизм автонумерации в платформе «1С:Предприятие 8.3», как быстро локализовать ошибочный объект в базе данных и какими программными средствами вернуть нумератор в рабочее состояние.
Прежде чем переходить к активным действиям, проанализируем, как устроен механизм генерации номеров и кодов. В большинстве конфигураций 1С номера документов и коды справочников имеют текстовый тип данных. Это необходимо для поддержки префиксов организаций, подразделений или узлов распределенных информационных баз (РИБ). Платформа анализирует существующие номера и автоматически прибавляет единицу к самому большому текстовому коду.
Основными причинами сбоя автонумерации являются:
00000000001), а пользователь вручную сократил его, записав документ с номером 1 или 45, платформа теряет ориентир по разрядности. В следующий раз система попробует создать номер, базируясь на этой некорректной длине.УТ00-000001. Если кто-то вручную убирает префикс и записывает просто 00000001, платформа запоминает эту новую ветку нумерации и продолжает вести ее отдельно, что приводит к хаосу.0001/1 или 0001-01 вместо стандартной структуры) полностью ломает встроенный парсер платформы.rphost) в целях повышения производительности кэширует диапазон номеров. Если вы исправили ошибочный документ, сервер может «не заметить» этого изменения, продолжая выдавать старые закэшированные значения из своей оперативной памяти.Рассмотрим алгоритм поиска объекта, который сбил нумерацию. Нам нужно понять, от какого номера система начинает вести неверный отсчет. Посмотрим на предлагаемый системой автоматический номер при создании нового объекта. Наша задача — отнять от последней цифры единицу и найти в списке базу данных объект с получившимся номером.
Например, если система упорно предлагает новому документу номер 000005, значит, в системе уже записан документ с номером 000004 (или похожим кривым кодом), который сбивает алгоритм. Воспользуемся поиском или сортировкой по колонке «Номер» (или «Код») в списке документов/справочника, чтобы обнаружить этого виновника.
Если визуально в списке найти документ не удается (например, из-за огромного объема данных), целесообразно написать простой запрос в консоли запросов. Напишем пример запроса для поиска последних по коду элементов справочника:
ВЫБРАТЬ ПЕРВЫЕ 50
Дети.Ссылка КАК Ссылка,
Дети.Код КАК Код,
Дети.ЭтоГруппа КАК ЭтоГруппа
ИЗ
Справочник.Дети КАК Дети
УПОРЯДОЧИТЬ ПО
Код УБЫВ
Обратите внимание на поле ЭтоГруппа. Если мы анализируем справочник, обязательно проверяйте не только элементы, но и папки (группы). Очень часто именно папка с некорректным кодом (например, код 99 при длине кода 8 символов) мешает автонумерации элементов.
Выяснив причину и найдя проблемные объекты, перейдем к их исправлению. Нам необходимо вручную отредактировать коды у всех найденных некорректных элементов.
Приведите номера в соответствие со стандартным шаблоном конфигурации. Например, если длина номера должна быть 11 символов с учетом префикса организации, то вместо 45 запишите БП00-0000045. Обязательно сохраняйте все лидирующие нули и префиксы. Если исправлений требуется слишком много, можно воспользоваться стандартной обработкой «Групповое изменение реквизитов».
Даже после того как все некорректные номера в базе данных были успешно исправлены, при создании нового объекта система все равно может предлагать старый ошибочный номер. Это связано с работой кэша сервера приложений 1С. Чтобы очистить кэш и заставить систему пересчитать последний свободный номер на основе реальных данных в таблицах СУБД, нам потребуется выполнить метод ОбновитьНумерациюОбъектов().
Рассмотрим варианты применения этого метода программным путем.
Если мы хотим обновить нумераторы абсолютно для всех объектов в нашей информационной базе, мы можем выполнить метод без параметров:
ОбновитьНумерациюОбъектов();
Важное предупреждение: запуск метода без параметров для всей базы данных может вызвать серьезные блокировки таблиц на крупных работающих базах в разгар рабочего дня. Рекомендуется выполнять полное обновление в монопольном режиме или использовать точечный сброс кэша для конкретного метаданного.
Для точечного обновления нумератора конкретного справочника передадим в качестве параметра объект метаданных этого справочника:
// Обновляем нумерацию только для справочника "Дети"
ОбновитьНумерациюОбъектов(Метаданные.Справочники.Дети);
Если сбой произошел в документах, передаем объект метаданных соответствующего документа:
// Обновляем нумерацию только для документа "РеализацияТоваровУслуг"
ОбновитьНумерациюОбъектов(Метаданные.Документы.РеализацияТоваровУслуг);
Обратите внимание на частую ошибку начинающих разработчиков: передача строкового представления вместо объекта метаданных. Код вида ОбновитьНумерациюОбъектов("Дети") вызовет исключение «Несоответствие типов».
Разберем, как выполнить данный программный код, если у вас нет под рукой конфигуратора или база находится во фреше (облаке).
Также можно воспользоваться любой внешней обработкой, позволяющей выполнять произвольный код на встроенном языке 1С, открыв ее через меню «Файл» — «Открыть».
Для того чтобы обезопасить базу данных от повторения подобных инцидентов, рекомендуем выполнить следующие настройки:
Мы полностью разобрали проблему сбоя автонумерации в 1С, изучили причины ее возникновения, включая влияние кодов папок и серверного кэширования, и рассмотрели надежный способ исправления с помощью метода ОбновитьНумерациюОбъектов(). Применяйте эти знания на практике, и работа в вашей информационной базе всегда будет стабильной и комфортной.