При ведении многофирменного учета в конфигурациях платформы 1С:Предприятие 7.7 (например, в «Торговля и Склад 7.7») часто возникает ситуация, когда одна организация (ИП) использует буквенный префикс в номерах документов, а вторая организация (ООО) должна иметь обычную числовую нумерацию без буквенных обозначений. При программном создании или интерактивном переключении фирмы разработчики сталкиваются с тем, что новому документу ошибочно присваивается номер с префиксом другой организации.
Разберем детально, почему так происходит на уровне платформы 1С 7.7 и какими способами можно гарантировать корректное формирование номеров.
Проанализируем внутренний механизм работы нумераторов в платформе 1С 7.7. Для строковых номеров платформа использует стандартный строковый (лексикографический) порядок сравнения символов в рамках заданного периода периодичности нумератора (год, месяц и т. д.):
0 до 9.ИП000001), при строковом сравнении всегда строго больше любого номера той же длины, начинающегося с цифры (например, 00000001).УстановитьНовыйНомер("") с пустой строкой (или метод без параметров), система пытается найти максимальный номер документа данного вида за текущий период. Обнаружив номер с префиксом ИП, платформа принимает эту буквенную часть за текущий действующий шаблон префикса и инкрементирует именно его числовую часть.По этой причине стандартные методы вроде ПрефиксНомера(" ") или передача пустой строки не позволяют платформе выделить чисто цифровой поток номеров, если в базе уже есть документы с буквенными префиксами.
Самый простой и эффективный способ обойти лексикографическую коллизию платформы — явно ограничить выборку номеров символом 0. Так как стандартные номера без букв заполняются лидирующими нулями, передача нуля указывает платформе искать максимальный номер только среди тех, которые начинаются с цифры 0.
Посмотрим на типовой программный фрагмент пересчета номера при смене юридического лица документа:
Если Конт.ЮрЛицо <> ЮрЛицоФирмы Тогда
// Если префикс не задан, используем цифровой префикс "0"
ПрефиксЮрЛица = СокрЛП(ЮрЛицоФирмы.ПрефиксНомеровДокументов);
ПрефиксДляУстановки = ?(ПрефиксЮрЛица = "", "0", ПрефиксЮрЛица);
Конт.УстановитьНовыйНомер(СокрЛП(Константа.ПрефиксИБ) + ПрефиксДляУстановки);
Конт.ЮрЛицо = ЮрЛицоФирмы;
КонецЕсли;
Если требуется принудительно назначить числовой номер при программном формировании документа из внешней обработки или процедуры выгрузки/загрузки данных, достаточно вызвать:
Док = СоздатьОбъект("Документ.Реализация");
Док.Новый();
Док.ДатаДок = ТекущаяДата();
Док.Фирма = ВыбФирма;
Док.ЮрЛицо = ВыбФирма.ЮрЛицо;
// Назначаем номер с цифровым префиксом "0"
Док.УстановитьНовыйНомер("0");
В результате платформа проигнорирует документы с префиксом ИП и сформирует правильный следующий номер вида 00000123.
Если в конфигурации логика автонумерации вынесена в глобальный модуль и привязана к реквизиту префикса у юридического лица (например, ПрефиксНомеровДокументов в справочнике Фирмы или ЮрЛица), можно указать значение 0 непосредственно в карточке организации без изменения программного кода.
Рассмотрим порядок действий:
0.ИП).При таком подходе встроенный модуль конфигурации при вызове процедуры глПересчитатьНомерДокумента() или аналогичной глобальной функции автоматически передаст символ 0 в метод УстановитьНовыйНомер().
Разберем критически важные нюансы, которые необходимо соблюдать при работе с нумерацией в 1С 7.7:
ДатаДок до вызова метода УстановитьНовыйНомер(). Периодичность нумератора привязана к дате документа. Если дата не установлена, система будет искать номер в диапазоне пустой даты, что приведет к дублированию номеров или ошибкам уникальности при последующей записи.Нумератор, коллизия префиксов распространяется на все связанные документы. Назначение префикса 0 решает эту проблему для всего пула документов данного нумератора.глПреобразоватьНомерДляПечати() или пользовательского алгоритма отсечения незначащих символов.