К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как получить последний номер документа в 1С

Как получить последний номер документа в 1С: запрос к базе, метод ПолучитьПоследнийНомер, нумераторы, типичные ошибки и примеры кода для разработчиков.

Получить последний номер документа в 1С может понадобиться в двух ситуациях: пользователю — чтобы проверить, не пропал ли документ или не сбилась ли нумерация, а разработчику — чтобы программно сформировать следующий номер, проверить дубли или построить отчёт. В зависимости от задачи применяются разные инструменты: журнал документов, встроенный язык запросов, методы объекта конфигурации или механизм нумераторов.

Важно понимать, что «последний номер» — не всегда однозначное понятие. Номер может быть строковым, содержать префиксы организации или информационной базы, а нумерация может вестись в разрезе периода (год, месяц), подразделения или вида документа. Поэтому перед выбором способа нужно определить, что именно считается последним номером в вашем случае.

Ниже разобраны основные рабочие способы: от простого просмотра журнала до программного получения номера через запрос и метод ПолучитьПоследнийНомер, а также типичные ошибки, из-за которых нумерация «скачет» или возникают дубли.

Как устроена нумерация документов в 1С

Платформа 1С:Предприятие присваивает номер документу автоматически при записи. Настройки нумерации задаются в конфигураторе на уровне объекта «Документ»: длина номера, периодичность (в пределах года, месяца или непрерывная), контроль уникальности и автонумерация. Если автонумерация включена, платформа хранит внутренний счётчик и увеличивает его при каждом новом документе.

Номер документа может быть строковым, и это важно: строка «10» при сортировке по алфавиту окажется раньше строки «2». Поэтому сортировка по номеру в запросе без учёта длины и формата может дать неверный результат. Кроме того, префиксы (организации, обмена данными) входят в номер и влияют на порядок.

При обмене данными между базами платформа может резервировать диапазоны номеров или добавлять префикс узла. Это ещё одна причина, почему «максимальный номер» и «последний выданный номер» — не одно и то же.

Как посмотреть последний номер через журнал документов

Самый быстрый способ для пользователя без доступа к конфигуратору — открыть журнал соответствующего вида документов. В журнале нажмите на заголовок колонки «Номер» или «Дата», чтобы отсортировать список. Сортировка по дате по убыванию покажет последний созданный документ сверху.

Учтите, что сортировка по колонке «Номер» выполняется как по строке, поэтому при разной длине номеров порядок может быть неожиданным. Надёжнее ориентироваться на дату документа: последний по дате документ почти всегда имеет и последний выданный номер, если никто не менял номера вручную.

Если журнал большой, используйте отбор по периоду (например, текущий месяц) и по организации — это ускорит поиск и исключит документы других подразделений с собственными префиксами.

Порядок действий в журнале
  1. 1
    Откройте журнал нужного вида документов
  2. 2
    Установите отбор по периоду и организации при необходимости
  3. 3
    Отсортируйте по колонке Дата по убыванию
  4. 4
    Сверьте номер верхнего документа с ожидаемым
  5. 5
    Проверьте, нет ли пропусков или дублей в конце списка

Получение последнего номера запросом

Универсальный программный способ — запрос к таблице документа с сортировкой по убыванию и ограничением выборки одной строкой. Такой запрос можно выполнять и в консоли запросов в режиме предприятия, и из кода.

ВЫБРАТЬ ПЕРВЫЕ 1

РеализацияТоваровУслуг.Номер КАК Номер,

РеализацияТоваровУслуг.Дата КАК Дата

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

УПОРЯДОЧИТЬ ПО

РеализацияТоваровУслуг.Дата УБЫВ,

РеализацияТоваровУслуг.Номер УБЫВ

Если нужен именно максимальный номер в рамках периода и префикса, добавьте условия ГДЕ на дату и, при необходимости, на подстроку номера с префиксом. Помните про строковую сортировку: для числовых номеров фиксированной длины (с лидирующими нулями) сортировка корректна, а для номеров без нулей — нет.

Пример вызова из кода:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 1

| Док.Номер КАК Номер

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Док

|ГДЕ

| Док.Дата МЕЖДУ &НачалоГода И &КонецГода

|УПОРЯДОЧИТЬ ПО

| Док.Номер УБЫВ";

Запрос.УстановитьПараметр("НачалоГода", НачалоГода(ТекущаяДатаСеанса()));

Запрос.УстановитьПараметр("КонецГода", КонецГода(ТекущаяДатаСеанса()));

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

ПоследнийНомер = Выборка.Номер;

КонецЕсли;

bsl
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 Номер ИЗ Документ.РеализацияТоваровУслуг УПОРЯДОЧИТЬ ПО Номер УБЫВ"); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Сообщить(Выборка.Номер); КонецЕсли;

Метод ПолучитьПоследнийНомер и нумераторы

У менеджера документа есть штатный метод, который возвращает последний номер, выданный механизмом автонумерации:

ПоследнийНомер = Документы.РеализацияТоваровУслуг.ПолучитьПоследнийНомер();

Метод учитывает настройки периодичности нумерации: если нумерация ведётся в пределах года, вернётся последний номер текущего периода. Это быстрее запроса, так как платформа читает внутренний счётчик, а не сканирует таблицу документов.

Однако у метода есть ограничение: он отражает состояние счётчика, а не реально существующие документы. Если документ с последним номером был удалён или номер меняли вручную, счётчик и фактические данные могут разойтись.

Если для вида документов используется общий нумератор, логика выдачи номеров определяется им. В этом случае для получения следующего номера корректнее полагаться на механизм нумератора, а не вычислять максимум запросом — иначе при параллельной работе пользователей возможны конфликты и дубли.

Сравнение способов

Журнал документов

Подходит пользователю без программирования. Ограничение: строковая сортировка по номеру может вводить в заблуждение.

Запрос с УПОРЯДОЧИТЬ УБЫВ

Гибкий, учитывает реальные данные и отборы. Ограничение: медленнее на больших таблицах, требует аккуратности со строковыми номерами.

ПолучитьПоследнийНомер()

Быстрый, читает счётчик платформы. Ограничение: не отражает удалённые документы и ручные правки номеров.

Как сформировать следующий номер программно

Типовая задача — присвоить новому документу номер на единицу больше последнего. Наивный подход «взять максимум и прибавить 1» опасен: при одновременной записи двух документов оба могут получить одинаковый номер. Платформа решает это через автонумерацию и блокировки счётчика, поэтому вмешиваться в механизм без необходимости не стоит.

Если всё же нужна своя логика (например, особый формат номера), выполняйте вычисление в транзакции с управляемой блокировкой по виду документа и периоду. Иначе при конкурентной записи получите дубли и ошибку контроля уникальности.

НовыйНомерЧислом = Число(ПоследнийНомер) + 1;

ДокументОбъект.Номер = Формат(НовыйНомерЧислом, "ЧЦ=6; ЧВН=; ЧГ=");

Функция Формат с лидирующими нулями сохраняет фиксированную длину номера, что обеспечивает правильную строковую сортировку и единообразие в печатных формах.

Типичные ошибки и сбои нумерации

Самая частая жалоба — «номера скачут» или появляются пропуски. Пропуски возникают, когда документ создали, но не записали, либо удалили уже записанный документ: счётчик платформы не откатывается назад. Это нормальное поведение, а не ошибка.

Дубли номеров обычно появляются после ручного изменения номера, обмена данными с неверно настроенными префиксами или самописной выдачи номеров без блокировок. Если контроль уникальности в конфигурации отключён, дубли записываются молча и всплывают позже в отчётах и ЭДО.

Ещё одна ошибка разработчика — поиск последнего номера функцией МАКСИМУМ(Номер) в запросе. Для строкового поля максимум берётся по алфавиту, и «9» окажется больше «10». Либо приводите номер к числу с учётом префиксов, либо используйте сортировку по дате и счётчик платформы.

Типичные ошибки
01
Использовать МАКСИМУМ по строковому номеру — получаете алфавитный, а не числовой максимум
02
Игнорировать префиксы — сравниваются номера разных организаций или узлов обмена
03
Вычислять следующий номер без блокировки — при параллельной записи возникают дубли
04
Ожидать, что после удаления документа номер будет переиспользован — счётчик не откатывается
05
Забыть про периодичность нумерации — искать последний номер за всё время вместо текущего года

Проверка результата и восстановление нумерации

После получения последнего номера сверьте его с фактическими данными: откройте журнал, отсортируйте по дате и убедитесь, что найденный номер совпадает с номером последнего документа. Если значения расходятся, вероятно, были ручные правки или удаления.

Для поиска дублей используйте запрос с группировкой по номеру и подсчётом количества ссылок — все группы, где количество больше одного, требуют разбора. Для поиска пропусков можно сравнить числовые значения номеров с последовательностью от первого до последнего.

В типовых конфигурациях периодически встречаются сервисные обработки для обновления нумерации, но универсального штатного механизма «перенумеровать всё» нет. Любую перенумерацию выполняйте только на копии базы с последующей проверкой связанных данных.

Контрольные точки

Как проверить результат

Совпадение с журналом
Норма

Найденный номер равен номеру последнего по дате документа

Тревожный признак

Номера расходятся — были ручные правки или удаления

Дубли номеров
Норма

Запрос с группировкой по номеру не даёт групп больше одного документа

Тревожный признак

Есть номера с двумя и более документами

Формат номера
Норма

Все номера одинаковой длины с лидирующими нулями

Тревожный признак

Разная длина — сортировка и поиск максимума работают неверно

FAQ

Почему ПолучитьПоследнийНомер() возвращает номер, которого нет в журнале?

Метод читает внутренний счётчик платформы. Если документ с этим номером был удалён или не был записан, счётчик всё равно остаётся на выданном значении. Счётчик не откатывается автоматически.

Как получить последний номер по конкретной организации?

Используйте запрос с отбором по реквизиту Организация и сортировкой по дате и номеру по убыванию. Метод ПолучитьПоследнийНомер() не поддерживает отбор по реквизитам — он работает со счётчиком целиком.

Почему запрос показывает, что последний номер — «9», хотя есть «10»?

Номер документа — строка, и сортировка идёт по алфавиту: «9» больше «10». Используйте номера фиксированной длины с лидирующими нулями либо сортируйте по дате документа.

Можно ли сбросить нумерацию, чтобы она началась заново?

Штатного безопасного способа сбросить счётчик в середине периода нет. При смене периода нумерации (например, нового года) платформа начинает отсчёт заново автоматически. Принудительные вмешательства делайте только на копии базы.

Как избежать дублей номеров при обмене данными между базами?

Настройте префиксы узлов обмена в настройках синхронизации, чтобы каждая база выдавала номера со своим префиксом. Дополнительно убедитесь, что включён контроль уникальности номеров в свойствах документа.

Что быстрее: запрос или ПолучитьПоследнийНомер()?

Метод ПолучитьПоследнийНомер() быстрее, так как читает счётчик без сканирования таблицы. Запрос медленнее, но отражает реальные данные и позволяет накладывать отборы — выбирайте по задаче.

Итог

Что важно запомнить

Для просмотра последнего номера пользователю достаточно журнала с сортировкой по дате. В коде используйте запрос с ПЕРВЫЕ 1 и УПОРЯДОЧИТЬ УБЫВ либо метод ПолучитьПоследнийНомер(). Помните про строковый формат номера, префиксы и периодичность нумерации, а собственную выдачу номеров выполняйте только с блокировками.