Почему в 1С 7.7 задваиваются номера расходных накладных и подставляется чужой префикс?

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

При организации работы между центральной (ЦБ) и периферийной (ПБ) базами без использования штатного модуля УРБД (распределенных информационных баз) разработчики и администраторы часто сталкиваются с коллизиями нумерации. Типичная ситуация: информационная база скопирована на флешку, развернута на удаленной точке, но при создании новой расходной накладной система упорно предлагает префикс и номер центрального узла (например, СП-0000345), порождая ошибку уникальности номеров. Разберем по шагам, почему это происходит и как правильно организовать нумерацию документов в среде 1С 7.7.

Причины сбоя автонумерации и подстановки старого префикса

Проанализируем механику работы платформы 1С:Предприятие 7.7 при формировании нового номера документа:

  1. Копирование базы вместо создания узла УРБД. Простое копирование файлов каталога базы данных переносит всю историю документов центральной базы. Встроенный механизм назначения номеров ориентируется на уже существующие записи в таблице журнала документов (_1SJOURN).
  2. Сортировка префиксов в платформе. Если номер формируется автоматически без явной программной передачи префикса, платформа собирает все существующие префиксы документов за установленный период нумерации (например, за текущий год), сортирует их по алфавиту и берет лексикографически последний. Если в центральной базе использовался префикс СП, а в периферийной настроили префикс СК, то при алфавитной сортировке строка СП окажется позже СК (буква «П» идет после буквы «К»). Соответственно, система выберет СП и попытается прибавить к нему единицу.
  3. Значения по умолчанию в карточках пользователей. При переносе копии базы в профиле пользователя остаются привязки к основному складу или основной фирме центральной базы. При событии ВводНового() документ инициализирует реквизиты старыми значениями, что запускает генерацию номера ЦБ. Даже если пользователь потом вручную выбирает свой склад, номер автоматически не пересчитывается.
  4. Влияние общих нумераторов. Если для расходной накладной назначен сквозной нумератор, используемый несколькими видами документов, поиск максимального номера осуществляется по всей совокупности документов этого нумератора.

Способ 1. Программное назначение номера с явным префиксом

Рассмотрим основной программный способ решения проблемы. Для того чтобы платформа не занималась самостоятельным выбором префикса на основе ранее введенных документов, необходимо явно вызывать метод УстановитьНовыйНомер() в модуле формы документа с передачей нужного строкового префикса.

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

Разберем пример кода для модуля формы расходной накладной при вводе нового документа:


Процедура ВводНового()
    // Определяем префикс базы (из константы или системного кода базы)
    ПрефБазы = СокрЛП(Константа.ПрефиксИБ);
    
    // При необходимости добавляем префикс юрлица или места хранения
    ПрефФирмы = СокрЛП(Фирма.ЮрЛицо.Префикс);
    ПолныйПрефикс = ПрефБазы + ПрефФирмы;
    
    // Принудительно устанавливаем новый номер по нашему префиксу
    УстановитьНовыйНомер(ПолныйПрефикс);
КонецПроцедуры

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


Процедура ПриВыбореСклада()
    Если Выбран() = 0 Тогда
        // Документ еще не записан в базу данных, разрешено переопределить номер
        Преф = СокрЛП(Склад.Префикс);
        Если ПустаяСтрока(Преф) = 0 Тогда
            УстановитьНовыйНомер(Преф);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Способ 2. Использование функции ТекущаяИБКод() при работе с базами

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


Процедура ПриОткрытии()
    Если Выбран() = 0 Тогда
        // Формируем уникальный номер на основании кода текущей базы
        УстановитьНовыйНомер(СокрЛП(ТекущаяИБКод()) + "-");
    КонецЕсли;
КонецПроцедуры

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

Способ 3. Коррекция алфавитного порядка префиксов (быстрое решение)

Если конфигурацию изменять нельзя или нежелательно вмешиваться в код типовой конфигурации («Бухгалтерский учет для Украины», «Торговля и Склад» и др.), проанализируем алфавитный порядок префиксов.

Платформа 1С 7.7 без явного параметра в функции выбирает наибольший префикс по алфавиту:

  1. Сравним префикс центральной базы (например, СП) и префикс периферийной базы (СК). Так как "СК" < "СП", платформа всегда отдает приоритет СП.
  2. Заменим префикс на складе или в константе периферийной базы на такой, который по алфавиту идет после префикса ЦБ. Например, префикс СФ, СЦ или Т1.
  3. Поскольку буква «Ф» идет после «П», платформа при стандартном поиске увидит, что СФ старше СП, и начнет наращивать номера с префиксом СФ.

Важное предостережение: если документы из ПБ будут затем загружаться обратно в ЦБ, то уже в центральной базе максимальным окажется префикс периферийной базы (СФ), что собьет нумерацию уже в центре. Поэтому данный метод является временным костылем и уступает явному вызову УстановитьНовыйНомер(Префикс).

Очистка сбитой нумерации в информационной базе

Выясним причину, по которой даже после настройки кода система может продолжать выдавать занятый номер. Если в периферийной базе пользователь уже успел сохранить документ с ошибочным номером (например, СП-0000345), автонумератор платформы зафиксировал этот максимум в таблице журнала.

Разберем по шагам, как восстановить последовательность:

  1. Открываем общий журнал документов или журнал расходных накладных за текущий период (год).
  2. Находим документы, которые ошибочно получили префикс центральной базы.
  3. Вручную исправляем их номера на корректный префикс периферии (например, меняем на СК-0000001) либо удаляем эти тестовые документы, если они были созданы ошибочно.
  4. Проверяем справочник «Места хранения» и константы информационной базы, чтобы там не было ссылок на префиксы ЦБ.
  5. В режиме «Конфигуратор» запускаем процедуру Администрирование -> Тестирование и исправление ИБ с установленным флажком «Переиндексация», чтобы обновить индексные файлы таблицы _1SJOURN.

Обратите внимание: перенос документов через простое копирование баз таит скрытую опасность — совпадение внутренних идентификаторов (IDDOC). Для полноценной распределенной работы рекомендуется либо внедрить штатный модуль УРБД, либо производить обмен через выгрузку/загрузку документов в формате XML или DBF с созданием новых объектов через метод СоздатьОбъект("Документ.РасходнаяНакладная").

← На главную