Как массово добавить ведущие нули в коды номенклатуры в 1С 8.3 после загрузки из Excel?

Системный администратор 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При переносе данных из внешних файлов, таких как таблицы Microsoft Excel, пользователи 1С часто сталкиваются с неприятной проблемой: числовые коды товаров теряют свои лидирующие (ведущие) нули. Например, правильный код номенклатуры 00000001 превращается в обычную единицу 1, а код 00001254 становится числом 1254. На первый взгляд это кажется чисто визуальным дефектом, но на практике это приводит к серьезному сбою в механизме автонумерации платформы 1С:Предприятие. Сортировка по коду начинает работать некорректно, а при попытке создать новый элемент вручную система может выдать критическую ошибку об уникальности кода.

В этой статье мы подробно разберем, как исправить эту ситуацию для уже загруженных позиций (даже если их больше тысячи), используя встроенный инструмент «Групповое изменение реквизитов» в конфигурации «1С:Управление торговлей 11.3» (или любой другой современной конфигурации на управляемых формах), рассмотрим альтернативные варианты программного кода, а также научимся предотвращать эту проблему на этапе импорта.

Шаг 1. Как разблокировать редактирование поля «Код» в групповой обработке

Стандартная обработка «Групповое изменение реквизитов» — это мощный инструмент администратора, но по умолчанию платформа скрывает ключевые системные поля, такие как Код или Родитель, во избежание случайного повреждения ссылочной целостности базы данных. Чтобы изменить коды у уже созданных товаров, нам необходимо включить специальный режим.

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

  1. Откроем обработку «Групповое изменение реквизитов» (обычно она доступна в разделе НСИ и администрирование — Обслуживание — Корректировка данных).
  2. В открывшемся окне в поле «Изменять» выберем справочник Номенклатура.
  3. Нажмем на кнопку «Дополнительные параметры» (расположена в нижней или правой части экрана в зависимости от релиза вашей платформы).
  4. В появившемся диалоговом окне найдем группу «Режим разработчика» и установим флажок «Разрешить редактирование служебных реквизитов». Нажмем «ОК».
  5. Теперь вернемся к списку доступных для изменения реквизитов справочника — в нем должно появиться системное поле Код.

Важное примечание: Запуск произвольных алгоритмов и изменение системных реквизитов доступны исключительно пользователям, обладающим Полными правами (роль Администратора системы).

Шаг 2. Вариант 1. Использование строкового метода дополнения нулями (быстрое решение)

Рассмотрим алгоритм, к которому пришел автор темы на форуме. Это классический строковый метод «дописывания» нулей слева с последующим отсечением лишней длины справа. Он является максимально универсальным, так как корректно работает даже в том случае, если в кодах товаров случайно затесались буквы или префиксы.

В строке реквизита Код выберем вариант заполнения «Выполнить произвольный алгоритм» и напишем следующее выражение:

Объект.Код = Прав("00000000" + СокрЛП(Объект.Код), 8);

Проанализируем детально, как работает данная конструкция:

  1. Функция СокрЛП() удаляет все лишние пробелы слева и справа от текущего значения кода товара. Это критически важно, чтобы случайный невидимый пробел в конце строки не испортил итоговый результат.
  2. К полученной очищенной строке слева принудительно прибавляется шаблон из восьми нулей: "00000000" + Код. Например, если исходный код был 125, то в результате сложения строк мы получим временную строку "00000000125".
  3. Функция Прав(Строка, 8) берет ровно 8 крайних правых символов из полученного выражения. Для строки "00000000125" правые 8 символов — это как раз нужные нам "00000125". Задача решена!

Шаг 3. Вариант 2. Более надежный метод форматирования через функцию Формат()

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

Объект.Код = Формат(Число(Объект.Код), "ЧЦ=8; ЧВН=; ЧГ=0");

Давайте разберем параметры этой функции подробнее:

  1. Функция Число(Объект.Код) преобразует текущий строковый код в числовой тип данных.
  2. Форматная строка "ЧЦ=8; ЧВН=; ЧГ=0" управляет представлением этого числа в текстовом виде.
  3. Параметр ЧЦ=8 (Число Цифр) жестко регламентирует общую длину возвращаемой строки в 8 символов.
  4. Параметр ЧВН= (Число с Ведущими Нулями) указывает системе, что все пустые разряды слева необходимо автоматически заполнить нулями.
  5. Параметр ЧГ=0 (Численная Группировка) отключает разделение разрядов пробелами. Если этот параметр случайно пропустить, то число 1000 превратится в строку вида "0001 000" (с пробелом внутри), что мгновенно нарушит уникальность и структуру кода.

Предостережение: Если в вашей базе среди кодов номенклатуры уже есть элементы с буквами или знаками препинания (например, артикулы вида "УТ-0015" или коды с префиксами организации "А0045"), функция Число() вызовет фатальную ошибку выполнения. В таких смешанных случаях следует использовать только строковый метод из Варианта 1.

Шаг 4. Решаем проблему «сломанной» автонумерации в будущем

Это самый критичный нюанс, о котором часто забывают начинающие специалисты. После того как вы успешно переименуете все коды с 1 на 00000001, платформа 1С может продолжить ориентироваться на старый числовой шаблон без нулей, который она зафиксировала при первоначальном создании объектов. В результате при попытке создать любой новый товар вручную система выдаст ошибку «Код не уникальный!» или продолжит генерировать новые коды в неверном формате (например, выдаст код 1001 вместо ожидаемого 00001001).

Выясним, как решить эту проблему. Нам необходимо принудительно сбросить внутренний кэш нумерации справочника. Для этого администратору базы данных нужно выполнить специальную системную команду. Сделать это можно через внешнюю обработку «Групповой запуск кода» или стандартную консоль разработчика:

ОбновитьНумерациюОбъектов(Метаданные.Справочники.Номенклатура);

Эта процедура заставит платформу заново просканировать справочник Номенклатура, определить максимальный существующий код с правильной длиной и продолжить автоматическую нумерацию корректно (следующий код автоматически запишется как 00001001).

Шаг 5. Как предотвратить проблему на этапе загрузки из Excel

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

  1. На стороне Excel: По умолчанию Excel автоматически распознает строку вида "00000001" как обычное число и превращает её в единицу. Чтобы этого избежать, перед заполнением кодов выделите колонку в Excel, нажмите правой кнопкой мыши -> «Формат ячеек» и выберите тип «Текстовый». После этого ведущие нули перестанут исчезать при сохранении файла.
  2. На стороне 1С: При использовании встроенного помощника «Загрузка данных из файла» на этапе сопоставления колонок обязательно убедитесь, что для реквизита Код выбран тип данных «Строка», а не «Число». В таком случае ведущие нули перенесутся в неизменном виде.

Меры предосторожности перед выполнением групповых операций

Любые групповые изменения ключевых реквизитов (таких как коды, артикулы или наименования) являются необратимыми операциями на уровне базы данных. В случае логической ошибки в кодовой строке вы можете испортить данные у тысяч товаров за одну секунду. Поэтому перед началом любых работ обязательно создайте резервную копию информационной базы (выгрузите файл базы данных .dt или сделайте копию файла 1Cv8.1CD для файловой версии базы).

← На главную