При ведении учета в платформе 1С 7.7 часто возникает задача разделения нумерации документов одного вида в зависимости от условий их создания. Например, требуется сформировать обычный номер для счетов-фактур на реализацию и отдельный номер с префиксом АВ для счетов-фактур на аванс, введенных на основании банковской выписки. Разберем по шагам механизмы автонумерации платформы 1С 7.7, программные методы назначения префиксов и способы предотвращения ошибок неуникальности номеров.
Прежде чем переходить к программному коду, проанализируем ключевые принципы работы платформы 1С 7.7 со строковыми номерами документов:
НомерДок имеет строковый тип. Поиск следующего наибольшего номера выполняется по кодам символов. Поскольку буквы в таблице символов следуют после цифр, номер АВ000001 считается больше, чем чисто числовой номер 00009999. Если в одном диапазоне смешиваются префиксные и беспрефиксные номера, автонумератор может давать сбои.АВ1 вместо АВ000001) платформа после номера АВ9 сформирует АВ10, однако лексикографически АВ9 останется максимальным значением, что заблокирует дальнейший корректный автоинкремент.Рассмотрим ситуацию, когда документ должен получать префикс только при создании на основании конкретного документа-источника. Для этого откроем модуль документа (или модуль формы документа) в конфигураторе и переопределим предопределенную процедуру ВводНаОсновании().
Посмотрим на пример кода с проверкой вида документа-основания:
Процедура ВводНаОсновании(ДокОснование)
Если ДокОснование.Вид() = "Реализация" Тогда
УстановитьНовыйНомер("");
ИначеЕсли ДокОснование.Вид() = "СтрокаВыпискиБанкПриход" Тогда
УстановитьНовыйНомер("АВ");
КонецЕсли;
КонецПроцедуры
Метод контекста документа УстановитьНовыйНомер(<Префикс>) генерирует следующий свободный номер с учетом заданной в конфигураторе периодичности и указанного префикса. Если префикс пустой, платформа генерирует стандартный числовой номер.
Если для всех документов определенного вида требуется постоянный префикс (например, для разделения баз в распределенной информационной базе или для четкого разграничения видов документов), проанализируем глобальную функцию ПрефиксАвтоНумерации().
Такую настройку обычно размещают в процедуре ПриНачалеРаботыСистемы() глобального модуля:
Процедура ПриНачалеРаботыСистемы()
ПрефиксАвтоНумерации("Документ.Договор", "ДГ-");
ПрефиксАвтоНумерации("Документ.РасходнаяНакладная", "РН-");
ПрефиксАвтоНумерации("Документ.ПриходнаяНакладная", "ПН-");
ПрефиксАвтоНумерации("Документ.Счет", "СЧ-");
ПрефиксАвтоНумерации("Документ.СчетВходящий", "СВ-");
КонецПроцедуры
Этот подход гарантирует, что каждый интерактивно создаваемый документ сразу получит заданный префикс в поле НомерДок.
Когда требуется обеспечить сквозную нумерацию по нескольким разным видам документов (например, счета-фактуры выданные и счета-фактуры на аванс формируют единый непрерывный журнал регистрации), правильным решением является использование общего объекта метаданных Нумератор:
СчетаФактуры).Выясним причину частой ошибки «Номер не уникальный!» при программной загрузке документов или их ручном сохранении. Чаще всего сбой вызван переносом пользователем даты документа в другой отчетный период без изменения номера либо попыткой записать неуникальный номер из внешнего источника.
При программной обработке и загрузке данных (например, из DBF или других систем) операцию записи необходимо защищать конструкцией обработки исключений с подробным логированием:
Попытка
Док.Записать();
Исключение
Сообщить("Не удалось записать документ № " + Док.НомерДок + " от " + Док.ДатаДок + " - причина: " + ОписаниеОшибки());
КонецПопытки;
Если в процессе алгоритма требуется проигнорировать системный контроль уникальности, можно применить метод контекста документа ПроверитьУникальность(0) перед записью объекта. Для исправления сбившейся нумерации в рабочей базе применяются специализированные внешние обработки перенумерации документов (например, универсальные инструменты пакетной обработки документов).