При переносе данных из внешних файлов, таких как таблицы Microsoft Excel, пользователи 1С часто сталкиваются с неприятной проблемой: числовые коды товаров теряют свои лидирующие (ведущие) нули. Например, правильный код номенклатуры 00000001 превращается в обычную единицу 1, а код 00001254 становится числом 1254. На первый взгляд это кажется чисто визуальным дефектом, но на практике это приводит к серьезному сбою в механизме автонумерации платформы 1С:Предприятие. Сортировка по коду начинает работать некорректно, а при попытке создать новый элемент вручную система может выдать критическую ошибку об уникальности кода.
В этой статье мы подробно разберем, как исправить эту ситуацию для уже загруженных позиций (даже если их больше тысячи), используя встроенный инструмент «Групповое изменение реквизитов» в конфигурации «1С:Управление торговлей 11.3» (или любой другой современной конфигурации на управляемых формах), рассмотрим альтернативные варианты программного кода, а также научимся предотвращать эту проблему на этапе импорта.
Стандартная обработка «Групповое изменение реквизитов» — это мощный инструмент администратора, но по умолчанию платформа скрывает ключевые системные поля, такие как Код или Родитель, во избежание случайного повреждения ссылочной целостности базы данных. Чтобы изменить коды у уже созданных товаров, нам необходимо включить специальный режим.
Рассмотрим по шагам, как разблокировать нужный реквизит:
Номенклатура.Код.Важное примечание: Запуск произвольных алгоритмов и изменение системных реквизитов доступны исключительно пользователям, обладающим Полными правами (роль Администратора системы).
Рассмотрим алгоритм, к которому пришел автор темы на форуме. Это классический строковый метод «дописывания» нулей слева с последующим отсечением лишней длины справа. Он является максимально универсальным, так как корректно работает даже в том случае, если в кодах товаров случайно затесались буквы или префиксы.
В строке реквизита Код выберем вариант заполнения «Выполнить произвольный алгоритм» и напишем следующее выражение:
Объект.Код = Прав("00000000" + СокрЛП(Объект.Код), 8);
Проанализируем детально, как работает данная конструкция:
СокрЛП() удаляет все лишние пробелы слева и справа от текущего значения кода товара. Это критически важно, чтобы случайный невидимый пробел в конце строки не испортил итоговый результат."00000000" + Код. Например, если исходный код был 125, то в результате сложения строк мы получим временную строку "00000000125".Прав(Строка, 8) берет ровно 8 крайних правых символов из полученного выражения. Для строки "00000000125" правые 8 символов — это как раз нужные нам "00000125". Задача решена!Хотя строковый метод с Прав() отлично справляется с задачей, в стандартах разработки фирмы 1С более изящным и правильным считается использование встроенной функции форматирования чисел. Если вы абсолютно уверены, что все ваши текущие коды состоят исключительно из цифр и не содержат буквенных префиксов, мы рекомендуем применить следующее выражение:
Объект.Код = Формат(Число(Объект.Код), "ЧЦ=8; ЧВН=; ЧГ=0");
Давайте разберем параметры этой функции подробнее:
Число(Объект.Код) преобразует текущий строковый код в числовой тип данных."ЧЦ=8; ЧВН=; ЧГ=0" управляет представлением этого числа в текстовом виде.ЧЦ=8 (Число Цифр) жестко регламентирует общую длину возвращаемой строки в 8 символов.ЧВН= (Число с Ведущими Нулями) указывает системе, что все пустые разряды слева необходимо автоматически заполнить нулями.ЧГ=0 (Численная Группировка) отключает разделение разрядов пробелами. Если этот параметр случайно пропустить, то число 1000 превратится в строку вида "0001 000" (с пробелом внутри), что мгновенно нарушит уникальность и структуру кода.Предостережение: Если в вашей базе среди кодов номенклатуры уже есть элементы с буквами или знаками препинания (например, артикулы вида "УТ-0015" или коды с префиксами организации "А0045"), функция Число() вызовет фатальную ошибку выполнения. В таких смешанных случаях следует использовать только строковый метод из Варианта 1.
Это самый критичный нюанс, о котором часто забывают начинающие специалисты. После того как вы успешно переименуете все коды с 1 на 00000001, платформа 1С может продолжить ориентироваться на старый числовой шаблон без нулей, который она зафиксировала при первоначальном создании объектов. В результате при попытке создать любой новый товар вручную система выдаст ошибку «Код не уникальный!» или продолжит генерировать новые коды в неверном формате (например, выдаст код 1001 вместо ожидаемого 00001001).
Выясним, как решить эту проблему. Нам необходимо принудительно сбросить внутренний кэш нумерации справочника. Для этого администратору базы данных нужно выполнить специальную системную команду. Сделать это можно через внешнюю обработку «Групповой запуск кода» или стандартную консоль разработчика:
ОбновитьНумерациюОбъектов(Метаданные.Справочники.Номенклатура);
Эта процедура заставит платформу заново просканировать справочник Номенклатура, определить максимальный существующий код с правильной длиной и продолжить автоматическую нумерацию корректно (следующий код автоматически запишется как 00001001).
Чтобы не тратить время на исправление кодов в базе постфактум, разберем причины, почему это происходит, и научимся избегать усечения нулей на этапе импорта:
"00000001" как обычное число и превращает её в единицу. Чтобы этого избежать, перед заполнением кодов выделите колонку в Excel, нажмите правой кнопкой мыши -> «Формат ячеек» и выберите тип «Текстовый». После этого ведущие нули перестанут исчезать при сохранении файла.Код выбран тип данных «Строка», а не «Число». В таком случае ведущие нули перенесутся в неизменном виде.Любые групповые изменения ключевых реквизитов (таких как коды, артикулы или наименования) являются необратимыми операциями на уровне базы данных. В случае логической ошибки в кодовой строке вы можете испортить данные у тысяч товаров за одну секунду. Поэтому перед началом любых работ обязательно создайте резервную копию информационной базы (выгрузите файл базы данных .dt или сделайте копию файла 1Cv8.1CD для файловой версии базы).