Как-то на работе возникла проблема с нумерацией документов. Пользователь ввёл номер нового документа вручную, причём вместо "000000675" указал "00_000675". После этого все последующие документы стали нумероваться с префиксом "00_". При этом ни банальное пересохранение объекта с номером "правильного" формата, ни пометка на удаление, ни удаление его из базы не помогли исправить ситуацию. Пришлось разбираться с механизмом автонумерации 1С.
Прежде всего я, естественно, обратился к ресурсам ИТС (благо фирма предоставляет такую возможность). Максимум, что я смог найти по своей тематике, - это две статьи Автонумерация и Особенности работы механизма автонумерации. Данные в них, мягко говоря, не свежие и где-то даже противоречащие реальности (например, там утверждается, что для восстановления нумерации достаточно удалить объекты), но общие представления о механизме дают. Из них стало понятно, что одним из решений вставшей проблемы является установка настройки конфигурации "Режим автонумерации объектов" в значение "Освобождать автоматически". Но, во-первых, это неприменимо в случае использования типовой конфигурации "на поддержке", а, во-вторых, противоречит продвигаемому 1С "новому" режиму нумерации. Поэтому я продолжил рыть дальше.
Как выяснилось, типовых механизмов работы с автонумерацией, как-то обработки, отчёты и прочее, нет. Но, слава Нуралиеву, нам предоставили методы встроенного языка: ОбновитьНумерациюОбъектов, УстановитьНовыйКод и УстановитьНовыйНомер.
ОбновитьНумерациюОбъектов, согласно СП, "выполняет обновление номеров в соответствии с номерами, записанными в базе данных. После вызова данного метода все выданные, но не записанные номера, становятся невалидными, т.к. не гарантируется их уникальность." Соотнеся это описание со статьями по этой тематике и тестовыми данными, становится понятно, что в базе хранится таблица выданных номеров, которые независимо от того, существуют объекты, для которых они были записаны в таблицу или нет, повторно быть выданы уже не могут, если не осуществить "сброс". Как раз процедура ОбновитьНумерациюОбъектов и применяется для "выправления" нумерации объектов. Главное, перед запуском не забудьте удалить из базы объекты с "неправильными" номерами. Это может быть как реальное удаление, так и перезапись их с предварительным присвоением "правильных" номеров.
В принципе, умения использовать вышеуказанную процедуру достаточно, чтобы, в случае необходимости, выправить нумерацию, но хочется упомянуть ещё о "максимальном номере". Под "максимальным номером" я подразумеваю номер, исходя из значения которого система выдаёт следующее значение. Как пример его знание необходимо, чтобы определить, выправлена ли нумерация или нет.
В 1С нет возможности напрямую получить текущий максимальный номер объекта метаданных. Решить эту проблему можно двумя способами:
- использовать запрос;
- получить следующий номер, используя методы УстановитьНовыйКод или УстановитьНовыйНомер.
При формировании запроса система считывает данные базы данных. Можно отсортировать объекты по коду/номеру по убыванию, т.о. верхним в списке окажется обладатель максимального номера. Тут существуют следующие "загвоздки":
- результат не будет содержать данные о занятых номерах, а только о записанных;
- сортировка не всегда выводит наверх "максимальные" с точки зрения системы номера (например, объект с номером "0_01" в результате запроса будет расположен ниже номера "0001", но при вводе нового объекта ему будет присвоен номер с префиксом "0_").
УстановитьНовыйКод и УстановитьНовыйНомер устанавливают код или номер соответственно и заносят это значение в таблицу номеров. При этом неважно, будет ли записан объект или нет, "максисальный номер" всё равно будет обновлён на выданный. Таким образом, если использовать эти методы для проверки, то после этого необходимо обновить нумерацию объектов.
К публикации прикреплена обработка обновления нумерации. В ней:
- кнопка "Обновить" запускает выполнение метода Обновить нумерацию объектов;
- список объектов содержит результат динамически формируемого запроса;
- на результат запроса накладывается отбор согласно свойствам объектов метаданных: по владельцу, родителю или периоду;
- поле "номер содержит" накладывает отбор на данные кода или номера;
- флаг в колонке "Макс." указывает на то, какой номер на момент обновления будет считаться максимальным, все вышерасположенные объекты получат номер согласно указанному максимальному;
- при установке флага "Макс." во всех вышерасположенных строках автоматически рассчитывается новый номер, но запись происходит только после нажатия кнопки "Обновить";
- добавление объектов в список недоступно, но возможно ручное перераспределение строк, т.о. для выправления нумерации необходимо переместить объекты с номерами, требующими коррекции в позицию над строкой с установленным флагом "Макс.".
Буду рад комментариям и замечаниям.