Как настроить префиксы и раздельное присвоение номеров документам в 1С 7.7

Программист 1С v7.7 1С:Комплексная автоматизация Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При ведении учета в платформе 1С 7.7 часто возникает задача разделения нумерации документов одного вида в зависимости от условий их создания. Например, требуется сформировать обычный номер для счетов-фактур на реализацию и отдельный номер с префиксом АВ для счетов-фактур на аванс, введенных на основании банковской выписки. Разберем по шагам механизмы автонумерации платформы 1С 7.7, программные методы назначения префиксов и способы предотвращения ошибок неуникальности номеров.

Особенности механизма нумерации в 1С 7.7

Прежде чем переходить к программному коду, проанализируем ключевые принципы работы платформы 1С 7.7 со строковыми номерами документов:

  1. Лексикографическая сортировка: Поле НомерДок имеет строковый тип. Поиск следующего наибольшего номера выполняется по кодам символов. Поскольку буквы в таблице символов следуют после цифр, номер АВ000001 считается больше, чем чисто числовой номер 00009999. Если в одном диапазоне смешиваются префиксные и беспрефиксные номера, автонумератор может давать сбои.
  2. Длина номера и лидирующие нули: Длина номера жестко задана в метаданных документа. При ручном или программном вводе номеров без ведущих нулей (например, АВ1 вместо АВ000001) платформа после номера АВ9 сформирует АВ10, однако лексикографически АВ9 останется максимальным значением, что заблокирует дальнейший корректный автоинкремент.
  3. Периодичность контроля уникальности: В свойствах документа указывается периодичность сброса номеров (например, «В пределах года» или «В пределах месяца»). При переносе документа на другую дату номер не пересчитывается автоматически, что может приводить к конфликтам.

Способ 1. Установка префикса при вводе на основании

Рассмотрим ситуацию, когда документ должен получать префикс только при создании на основании конкретного документа-источника. Для этого откроем модуль документа (или модуль формы документа) в конфигураторе и переопределим предопределенную процедуру ВводНаОсновании().

Посмотрим на пример кода с проверкой вида документа-основания:


Процедура ВводНаОсновании(ДокОснование)
    Если ДокОснование.Вид() = "Реализация" Тогда
        УстановитьНовыйНомер("");
    ИначеЕсли ДокОснование.Вид() = "СтрокаВыпискиБанкПриход" Тогда
        УстановитьНовыйНомер("АВ");
    КонецЕсли;
КонецПроцедуры

Метод контекста документа УстановитьНовыйНомер(<Префикс>) генерирует следующий свободный номер с учетом заданной в конфигураторе периодичности и указанного префикса. Если префикс пустой, платформа генерирует стандартный числовой номер.

Способ 2. Автоматическое назначение префиксов при старте системы

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

Такую настройку обычно размещают в процедуре ПриНачалеРаботыСистемы() глобального модуля:


Процедура ПриНачалеРаботыСистемы()
    ПрефиксАвтоНумерации("Документ.Договор", "ДГ-");
    ПрефиксАвтоНумерации("Документ.РасходнаяНакладная", "РН-");
    ПрефиксАвтоНумерации("Документ.ПриходнаяНакладная", "ПН-");
    ПрефиксАвтоНумерации("Документ.Счет", "СЧ-");
    ПрефиксАвтоНумерации("Документ.СчетВходящий", "СВ-");
КонецПроцедуры

Этот подход гарантирует, что каждый интерактивно создаваемый документ сразу получит заданный префикс в поле НомерДок.

Использование объекта «Нумератор» в конфигураторе

Когда требуется обеспечить сквозную нумерацию по нескольким разным видам документов (например, счета-фактуры выданные и счета-фактуры на аванс формируют единый непрерывный журнал регистрации), правильным решением является использование общего объекта метаданных Нумератор:

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

Диагностика и устранение ошибок уникальности номера

Выясним причину частой ошибки «Номер не уникальный!» при программной загрузке документов или их ручном сохранении. Чаще всего сбой вызван переносом пользователем даты документа в другой отчетный период без изменения номера либо попыткой записать неуникальный номер из внешнего источника.

При программной обработке и загрузке данных (например, из DBF или других систем) операцию записи необходимо защищать конструкцией обработки исключений с подробным логированием:


Попытка
    Док.Записать();
Исключение
    Сообщить("Не удалось записать документ № " + Док.НомерДок + " от " + Док.ДатаДок + " - причина: " + ОписаниеОшибки());
КонецПопытки;

Если в процессе алгоритма требуется проигнорировать системный контроль уникальности, можно применить метод контекста документа ПроверитьУникальность(0) перед записью объекта. Для исправления сбившейся нумерации в рабочей базе применяются специализированные внешние обработки перенумерации документов (например, универсальные инструменты пакетной обработки документов).

← На главную