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