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

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

Каждый специалист, работающий с системой 1С, рано или поздно сталкивается с процедурой импорта данных из внешних источников. Одной из наиболее частых проблем при загрузке номенклатуры из файлов Microsoft Excel является потеря ведущих нулей в кодах товаров. Например, код, который в системе должен выглядеть как 00000561, после импорта приобретает вид обычного числа 561.

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

Почему пропадают ведущие нули и как это влияет на базу

Прежде чем приступать к исправлению кодов, проанализируем, почему возникает подобная ситуация. В программе Excel числовые значения по умолчанию хранятся без ведущих нулей. Если ячейка с кодом 00000561 не была принудительно преобразована в текстовый формат перед выгрузкой, Excel распознает ее как число 561. При последующем импорте в базу 1С эти усеченные данные записываются в текстовое поле Код справочника Номенклатура.

В результате мы получаем рассогласование данных:

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

Пошаговая инструкция по исправлению кодов через групповое изменение реквизитов

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

  1. Перейдем в раздел НСИ и администрирование (или Администрирование в зависимости от вашей конфигурации) и выберем пункт Обслуживание.
  2. В открывшемся окне найдем подраздел Корректировка данных и перейдем по ссылке Групповое изменение реквизитов.
  3. В поле Выбирать элементы выберем справочник Номенклатура.
  4. Важный шаг! Чтобы не испортить всю базу, обязательно настроим отбор. Нажмем ссылку Все элементы и добавим условие отбора, например, выберем только ту группу товаров, в которую производилась загрузка, или установим отбор по конкретным незаполненным кодам. Это обезопасит нас от случайного изменения кодов у тех товаров, которые изначально были записаны корректно.
  5. В списке доступных для изменения реквизитов найдем поле Код.
  6. В колонке Новое значение нам необходимо задать формулу. Для этого перейдем в режим ввода формулы (в зависимости от версии платформы может потребоваться включить режим разработчика или выбрать пункт «Выполнить произвольный алгоритм»).

Способ 1. Самый безопасный и надежный вариант через функцию Прав()

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

Формула работает следующим образом: мы искусственно приписываем к текущему коду слева строку из восьми нулей, а затем с помощью функции Прав() «отрезаем» ровно восемь символов с правой стороны полученной строки. Разберем работу этой формулы на примере кода 561:

  1. Исходный код: 561.
  2. Сложение строк: "00000000" + "561" дает результат "00000000561".
  3. Функция Прав("00000000561", 8) берет 8 символов справа и возвращает идеальный результат: "00000561".

Для реализации этого метода в поле алгоритма групповой обработки введем следующее выражение:

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

Функция СокрЛП() здесь крайне важна — она предварительно очищает наш код от случайных пробелов слева и справа, которые могли незаметно импортироваться из Excel.

Способ 2. Использование функции Формат() и разбор ошибки группировки разрядов

Другой популярный способ решения задачи — использование встроенной функции 1С Формат(). Однако при работе с ней пользователи часто сталкиваются с неприятной проблемой. Если попытаться применить простую конструкцию, код может неожиданно приобрести вид 5 432 (с пробелом посередине), а ведущие нули так и не появятся.

Выясним причину этого поведения. По умолчанию платформа 1С при преобразовании больших чисел группирует их по разрядам (триадам) и разделяет группы специальным неразрывным пробелом (символом с кодом 160 / Символы.НПП). Чтобы этого не происходило, в форматной строке необходимо явно отключать группировку и задавать вывод лидирующих нулей.

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

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

Разберем параметры этой форматной строки подробнее:

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

Способ 3. Восстановление кода с помощью ЛЕВ() и разбор синтаксической ошибки

Иногда разработчики пытаются решить задачу через вычисление недостающего количества нулей с помощью функции ЛЕВ(). Формула должна посчитать длину текущего кода, вычесть ее из 8, взять соответствующее количество нулей слева и прибавить к ним сам код.

Однако при написании такой формулы легко допустить критическую синтаксическую ошибку, из-за которой коды всей номенклатуры могут превратиться в 00000000. Посмотрим на ошибочный вариант, который часто встречается на практике:


// ВНИМАНИЕ: Ошибочный код! Приведет к занулению всей базы!
Объект.Код = ЛЕВ("00000000", 8 - СтрДлина(СокрЛП(Объект.Код)) + СокрЛП(Объект.Код));

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

Чтобы избежать этой ошибки, скобка должна закрывать функцию ЛЕВ() сразу после вычисления количества нулей. Правильный синтаксис выглядит так:


Объект.Код = ЛЕВ("00000000", 8 - СтрДлина(СокрЛП(Объект.Код))) + СокрЛП(Объект.Код);

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

Золотые правила безопасности при массовом изменении кодов номенклатуры

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

  1. Всегда делайте резервную копию базы данных! Перед запуском групповой обработки создайте архивную копию информационной базы (файл .dt) или сделайте бэкап на уровне СУБД. Если что-то пойдет не так (например, коды занулятся, как в случае с синтаксической ошибкой), вы сможете восстановить работу за пару минут.
  2. Тестируйте алгоритмы на копии. Никогда не выполняйте непроверенные формулы сразу на рабочей базе. Создайте локальную копию, выполните обработку на ней, проверьте результат и только после этого повторяйте процедуру на "живой" системе.
  3. Используйте пошаговый отбор. Настройте групповую обработку так, чтобы она сначала применилась только к одному или двум тестовым элементам номенклатуры. Убедившись, что их коды приняли правильный вид (например, 00000561), снимите ограничение и запустите процесс для оставшейся тысячи товаров.

Применяя эти несложные методики и аккуратно работая со строковыми функциями 1С, вы без труда наведете порядок в справочнике номенклатуры и избавитесь от дублей при проведении коммерческих документов.

← На главную