Как изменить коды справочника в 1С 7.7 и на что может повлиять перенумерация?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В процессе эксплуатации информационных баз 1С 7.7 пользователи нередко сбивают встроенную автонумерацию справочников (например, «Номенклатура» или «Контрагенты»). Это происходит, если код вводится вручную без ведущих нулей (10 вместо 0000000010) или содержит произвольные символы. В результате платформа ориентируется на максимальное строковое значение, и автоматическое присвоение очередных номеров перестает работать корректно.

Разберем подробно, можно ли программно изменить коды справочника, как это отразится на работе системы, с какими скрытыми рисками можно столкнуться и как правильно организовать процедуру перенумерации.

Влияние изменения кодов на внутреннюю структуру базы данных

Проанализируем, как устроены связи между объектами в платформе 1С:Предприятие 7.7. Внутри базы данных все ссылки из документов, регистров, проводок и подчиненных справочников (например, «Цены» или «Единицы») формируются не по коду или наименованию, а по неизменяемому системному идентификатору объекта (внутреннему ID). Изменение строкового представления реквизита Код не приводит к разрыву ссылочной целостности: все ранее проведенные документы и движения сохранят корректные ссылки на свои элементы.

Потенциальные риски и негативные последствия

Несмотря на сохранность ссылок внутри базы, массовое изменение кодов может вызвать серьезные сбои в смежных подсистемах и внешних модулях. Рассмотрим основные факторы риска:

  1. Поиск по коду во внешних отчетах и обработках. Если во внешних файлах (.ert) или модулях конфигурации присутствует метод НайтиПоКоду() с жестко заданным значением, эти алгоритмы перестанут работать или вернут неверный объект. Особое внимание следует обратить на специализированные обработки загрузки данных от поставщиков, обменов с сайтами и клиент-банками.
  2. Подмена номенклатуры при автозагрузках. Если регламентный процесс ищет номенклатуру по старому коду, а после перенумерации этот код был присвоен совершенно другому товару, система начнет ошибочно записывать данные на чужие позиции.
  3. Торговое оборудование и весовой товар. В конфигурациях «Торговля и Склад» внутренние штрихкоды штучного товара (формата EAN-13 в диапазоне 20–29) и коды PLU для выгрузки в электронные весы с печатью этикеток часто рассчитываются на основе кода элемента справочника. Изменение кодов приведет к полной рассинхронизации ценников, весов и терминалов сбора данных (ТСД).
  4. Ошибки уникальности кодов при обработке. Если в свойствах справочника включен контроль уникальности, простая последовательная запись новых номеров вызовет ошибку коллизии (попытка установить номер, который еще занят другим элементом далее по списку).
  5. Кэширование автонумератора. Встроенный счетчик платформы 1С 7.7 сохраняет в оперативной памяти последний вычисленный максимум текущего сеанса. Если не перезапустить программу после массовой обработки, новые элементы могут продолжать нумероваться со старого ошибочного диапазона.

Алгоритм безопасной перенумерации справочника

Чтобы избежать ошибок уникальности и блокировок, процедуру перенумерации необходимо выполнять строго по правилам:

  1. Создание резервной копии. Перед любыми пакетными манипуляциями обязательно создаем полную копию информационной базы.
  2. Монопольный режим. Запускаем 1С в монопольном режиме (МонопольныйРежим(1)), чтобы исключить создание новых элементов пользователями во время работы скрипта.
  3. Двухпроходная перенумерация. На первом шаге всем элементам справочника присваивается временный уникальный префикс (например, TMP_000001). На втором шаге выполняется итоговая запись чистых кодов с ведущими нулями. Это полностью исключает конфликт контроля уникальности.
  4. Порционная фиксация транзакций. В базах на платформе MS SQL для предотвращения разрастания журнала транзакций и блокировок рекомендуется периодически вызывать ЗафиксироватьТранзакцию() (например, каждые 200–500 записей).

Посмотрим на пример кода обработки для перенумерации справочника «Номенклатура» в два этапа:


Процедура ВыполнитьПеренумерацию()
    Если МонопольныйРежим() = 0 Тогда
        Предупреждение("Перенумерация должна выполняться только в монопольном режиме!");
        Возврат;
    КонецЕсли;

    Спр = СоздатьОбъект("Справочник.Номенклатура");
    Счетчик = 0;
    ДлинаКода = Метаданные.Справочник("Номенклатура").ДлинаКода;

    // Шаг 1: Присвоение временных кодов для исключения дублей
    НачатьТранзакцию();
    Спр.ВыбратьЭлементы(0);
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
        Если Спр.ЭтоГруппа() = 0 Тогда
            Счетчик = Счетчик + 1;
            Спр.Код = "TMP_" + СокрЛП(Строка(Счетчик));
            Спр.Записать();
            
            Если Счетчик % 200 = 0 Тогда
                ЗафиксироватьТранзакцию();
                НачатьТранзакцию();
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    ЗафиксироватьТранзакцию();

    // Шаг 2: Присвоение итоговых кодов нужного формата
    Счетчик = 0;
    НачатьТранзакцию();
    Спр.ВыбратьЭлементы(0);
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
        Если Спр.ЭтоГруппа() = 0 Тогда
            Счетчик = Счетчик + 1;
            НовыйКод = Строка(Счетчик);
            Пока СтрДлина(НовыйКод) < ДлинаКода Цикл
                НовыйКод = "0" + НовыйКод;
            КонецЦикла;
            
            Спр.Код = НовыйКод;
            Спр.Записать();
            
            Если Счетчик % 200 = 0 Тогда
                ЗафиксироватьТранзакцию();
                НачатьТранзакцию();
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    ЗафиксироватьТранзакцию();

    Предупреждение("Перенумерация завершена. Перезапустите программу для сброса нумератора.");
КонецПроцедуры

Организация синхронизации между ТиС и Бухгалтерией

Привязка обменов исключительно к наименованию или прямому коду базы-источника является архитектурно уязвимым решением. Разберем, как правильно организовать сопоставление данных между конфигурациями «Торговля и Склад» и «Бухгалтерский учет»:

  1. Использование поля «Артикул». Артикул товара стабильнее наименования и не зависит от сброса системных автонумераторов. Если у номенклатуры есть четкий фабричный или внутренний артикул, синхронизацию безопаснее всего строить по нему.
  2. Фиксация соответствий во внешних идентификаторах. Надежный подход — добавить в базу-приемник («Бухгалтерия») дополнительный реквизит (например, КодВБазеТиС) или использовать таблицу соответствий. При выгрузке элемент сначала ищется по этому реквизиту. Если он найден — обновляются остальные поля, если нет — создается новый элемент и в него записывается исходный код из ТиС.
  3. Защита поля «Код» от ручного редактирования. После наведения порядка в нумерации обязательно закрываем в формах справочников доступность реквизита Код на редактирование обычным пользователям, чтобы предотвратить повторный срыв автонумератора.
← На главную