Каждый специалист, работающий с системой 1С, рано или поздно сталкивается с процедурой импорта данных из внешних источников. Одной из наиболее частых проблем при загрузке номенклатуры из файлов Microsoft Excel является потеря ведущих нулей в кодах товаров. Например, код, который в системе должен выглядеть как 00000561, после импорта приобретает вид обычного числа 561.
Эта на первый взгляд незначительная деталь может привести к серьезным сбоям в учете: документы реализации перестают проводиться, система начинает дублировать номенклатурные позиции, а автоматический поиск товаров ломается. В этой статье мы подробно разберем, как исправить эту проблему с помощью встроенных инструментов 1С, рассмотрим популярные ошибки пользователей при написании формул и предложим несколько гарантированно работающих способов приведения кодов к правильному 8-значному виду.
Прежде чем приступать к исправлению кодов, проанализируем, почему возникает подобная ситуация. В программе Excel числовые значения по умолчанию хранятся без ведущих нулей. Если ячейка с кодом 00000561 не была принудительно преобразована в текстовый формат перед выгрузкой, Excel распознает ее как число 561. При последующем импорте в базу 1С эти усеченные данные записываются в текстовое поле Код справочника Номенклатура.
В результате мы получаем рассогласование данных:
00000561).561).Многие начинающие пользователи полагают, что тип данных поля Код в 1С является числовым. Это заблуждение. В типовых конфигурациях 1С (включая «1С:Управление торговлей 11.3») поле Код всегда имеет тип данных Строка. Именно поэтому мы можем использовать строковые операции для восстановления исходного формата.
Для исправления сложившейся ситуации нам не потребуется вносить изменения в конфигурацию или привлекать программистов для написания сложных обработок. Мы воспользуемся стандартным инструментом — обработкой «Групповое изменение реквизитов». Разберем по шагам, как настроить эту обработку для нашей задачи:
Номенклатура.Код.Этот метод основан исключительно на строковых операциях платформы 1С. Он хорош тем, что не пытается преобразовывать строки в числа, а значит, гарантированно не вызовет критических ошибок, даже если среди кодов случайно окажутся текстовые префиксы, дефисы или пробелы.
Формула работает следующим образом: мы искусственно приписываем к текущему коду слева строку из восьми нулей, а затем с помощью функции Прав() «отрезаем» ровно восемь символов с правой стороны полученной строки. Разберем работу этой формулы на примере кода 561:
561."00000000" + "561" дает результат "00000000561".Прав("00000000561", 8) берет 8 символов справа и возвращает идеальный результат: "00000561".Для реализации этого метода в поле алгоритма групповой обработки введем следующее выражение:
Объект.Код = Прав("00000000" + СокрЛП(Объект.Код), 8);
Функция СокрЛП() здесь крайне важна — она предварительно очищает наш код от случайных пробелов слева и справа, которые могли незаметно импортироваться из Excel.
Другой популярный способ решения задачи — использование встроенной функции 1С Формат(). Однако при работе с ней пользователи часто сталкиваются с неприятной проблемой. Если попытаться применить простую конструкцию, код может неожиданно приобрести вид 5 432 (с пробелом посередине), а ведущие нули так и не появятся.
Выясним причину этого поведения. По умолчанию платформа 1С при преобразовании больших чисел группирует их по разрядам (триадам) и разделяет группы специальным неразрывным пробелом (символом с кодом 160 / Символы.НПП). Чтобы этого не происходило, в форматной строке необходимо явно отключать группировку и задавать вывод лидирующих нулей.
Правильный вариант использования функции Формат() выглядит следующим образом:
Объект.Код = Формат(Число(Объект.Код), "ЧЦ=8; ЧВН=; ЧГ=0");
Разберем параметры этой форматной строки подробнее:
ЧЦ=8 — задает общую точность (длину) числа в 8 символов.ЧВН= — указывает системе обязательно выводить незаполненные старшие разряды как нули (ведущие нули).ЧГ=0 — полностью отключает группировку разрядов, что избавляет нас от нежелательных пробелов внутри кода.Важное предупреждение: этот способ можно использовать только тогда, когда вы абсолютно уверены, что все текущие коды в вашей базе состоят исключительно из цифр. Если функция Число() наткнется хотя бы на один код, содержащий букву (например, префикс склада) или дефис, обработка аварийно завершится с ошибкой преобразования типа.
Иногда разработчики пытаются решить задачу через вычисление недостающего количества нулей с помощью функции ЛЕВ(). Формула должна посчитать длину текущего кода, вычесть ее из 8, взять соответствующее количество нулей слева и прибавить к ним сам код.
Однако при написании такой формулы легко допустить критическую синтаксическую ошибку, из-за которой коды всей номенклатуры могут превратиться в 00000000. Посмотрим на ошибочный вариант, который часто встречается на практике:
// ВНИМАНИЕ: Ошибочный код! Приведет к занулению всей базы!
Объект.Код = ЛЕВ("00000000", 8 - СтрДлина(СокрЛП(Объект.Код)) + СокрЛП(Объект.Код));
Проанализируем причину сбоя: здесь закрывающая скобка функции ЛЕВ() ошибочно поставлена в самом конце выражения. Из-за этого сложение строк произошло внутри второго аргумента функции ЛЕВ(), где должна вычисляться только длина. Система попыталась сложить числовое значение длины со строкой кода, аргумент длины вычислился некорректно, и функция вернула стандартный шаблон из восьми нулей.
Чтобы избежать этой ошибки, скобка должна закрывать функцию ЛЕВ() сразу после вычисления количества нулей. Правильный синтаксис выглядит так:
Объект.Код = ЛЕВ("00000000", 8 - СтрДлина(СокрЛП(Объект.Код))) + СокрЛП(Объект.Код);
Этот способ вполне рабочий, но он выглядит гораздо более громоздким по сравнению с изящным решением через функцию Прав() из первого способа.
Любые групповые операции с ключевыми реквизитами справочников (такими как Код или Артикул) несут в себе потенциальный риск повреждения целостности данных. Чтобы избежать неприятных последствий, настоятельно рекомендуем придерживаться следующих правил:
00000561), снимите ограничение и запустите процесс для оставшейся тысячи товаров.Применяя эти несложные методики и аккуратно работая со строковыми функциями 1С, вы без труда наведете порядок в справочнике номенклатуры и избавитесь от дублей при проведении коммерческих документов.