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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При выгрузке номенклатуры из 1С в Excel разработчики и пользователи часто сталкиваются с проблемой: программы электронных таблиц по умолчанию воспринимают значения с ведущими нулями (например, 00-00015 или 00015) как обычные числа и автоматически обрезают нули, превращая код в 15. Из-за этого возникают задачи по трансформации артикулов — например, замене лидирующих нулей на буквы алфавита (превращая 00-00015 в ABC15) или явной настройке текстового формата в табличном документе.

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

Причины возникновения проблемы и архитектурный подход

Разберем ситуацию подробно. Подмена артикулов в базе или «на лету» перед выгрузкой может привести к рассинхронизации данных. Если артикул 00-00015 превратить в ABC15, покупатели или поставщики не смогут найти позицию по штрихкоду или каталогу. Поэтому перед реализацией кода стоит чётко разграничить два подхода:

  1. Подход 1 (Трансформация строки): Бизнес-логика действительно требует сформировать условный буквенно-числовой код на основе нулей для печатной формы или стороннего сервиса.
  2. Подход 2 (Форматирование выгрузки): Нужно сохранить исходный вид артикула с нулями в Excel, запретив табличному редактору удалять лидирующие символы.

Проанализируем пошагово оба этих направления.

Алгоритмы замены лидирующих нулей на буквы в 1С

Рассмотрим, как написать алгоритм, который находит лидирующие нули в строке и заменяет их на соответствующие буквы английского или русского алфавита по порядку (1-й ноль A, 2-й ноль B, 3-й ноль C и т. д.).

Если артикул имеет сложную структуру с префиксом и дефисом (например, 00-00015), необходимо корректно отделить префикс или дефис, чтобы не исказить числовую часть.

Рассмотрим простой и понятный алгоритм выделения хвоста строки и пошаговой замены лидирующих нулей:


// Определяем базовый алфавит для замены
Буквы = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

// Пример исходного артикула
Артикул = "00-00015";

// Отсекаем префикс с дефисом, если он присутствует
ПозицияДефиса = СтрНайти(Артикул, "-");
Если ПозицияДефиса > 0 Тогда
    Префикс = Лев(Артикул, ПозицияДефиса);
    РабочаяСтрока = Прав(Артикул, СтрДлина(Артикул) - ПозицияДефиса);
Иначе
    Префикс = "";
    РабочаяСтрока = Артикул;
КонецЕсли;

// Подсчитываем и удаляем лидирующие нули
НулиВАртикуле = "";
Пока Лев(РабочаяСтрока, 1) = "0" Цикл
    НулиВАртикуле = НулиВАртикуле + "0";
    РабочаяСтрока = Прав(РабочаяСтрока, СтрДлина(РабочаяСтрока) - 1);
КонецЦикла;

// Формируем результат: подставляем буквы по количеству нулей и добавляем оставшуюся часть
ДлинаНулей = СтрДлина(НулиВАртикуле);
БуквенныйПрефикс = Лев(Буквы, ДлинаНулей);

Результат = Префикс + БуквенныйПрефикс + РабочаяСтрока;
// Результат для "00-00015" составит "00-ABC15"

Если требуется заменять нули без сохранения дефисов, удалим знак - и примените очистку к числу:


Буквы = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
ЧистаяСтрока = СтрЗаменить(Артикул, "-", "");

// Получаем чистое число без нулей
ЧисловаяЧасть = Формат(Число(ЧистаяСтрока), "ЧГ=0");

// Вычисляем количество удаленных нулей
КоличествоНулей = СтрДлина(ЧистаяСтрока) - СтрДлина(ЧисловаяЧасть);

// Подставляем буквы соответствующей длины
РезультатАртикула = Лев(Буквы, КоличествоНулей) + ЧисловаяЧасть;
// Для "00-00015" ЧистаяСтрока="0000015", ЧисловаяЧасть="15", КоличествоНулей=5 -> "ABCDE15"

Использование регулярных выражений (RegExp)

В современных версиях платформы 1С:Предприятие 8.3 (начиная с релиза 8.3.23) появилась встроенная функция СтрЗаменитьПоРегулярномуВыражению. С её помощью можно значительно сократить код обработки строк.

Посмотрим на пример удаления ведущих нулей через регулярное выражение:


// Удаление всех нулей в начале строки или сразу после дефиса
Шаблон = "(?<=^|-)(0+)";
РезультатБезНулей = СтрЗаменитьПоРегулярномуВыражению(Артикул, Шаблон, "");

В более ранних версиях платформы можно воспользоваться объектом COM VBScript.RegExp:


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина;
RegExp.Global = Ложь;
RegExp.Pattern = "^0+"; // Поиск нулей в начале строки

ЧистаяСтрока = RegExp.Replace(Артикул, "");

Применение функций Библиотеки Стандартных Подсистем (БСП)

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

Рассмотрим основные функции БСП для работы с лидирующими нулями и строками:

  1. Очистка от лидирующих символов:
    
    // Удаляет все нули в начале переданной строки
    ОчищенныйАртикул = СтроковыеФункцииКлиентСервер.УдалитьЛидирующиеСимволы(Артикул, "0");
    
  2. Удаление нулей с сохранением префиксов:
    
    // Корректно обрабатывает префиксы организаций и информационных баз
    БезНулей = ПрефиксацияОбъектовКлиентСервер.УдалитьЛидирующиеНулиИзНомераОбъекта(Артикул);
    
  3. Разбиение строки на составные части:
    
    // Разделяет артикул по разделителю "-"
    МассивЧастей = ОбщегоНазначенияКлиентСервер.РазложитьСтрокуВМассивПодстрок(Артикул, "-");
    

Как сохранить нули при выгрузке в Excel без замены на буквы

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

Способ 1. Использование табличного документа 1С (ТабличныйДокумент)

При выгрузке отчета или обработки через ТабличныйДокумент укажите текстовый тип для ячейки перед сохранением в формат .xlsx:


Область = Макет.ПолучитьОбласть("СтрокаТаблицы");
Область.Параметры.Артикул = НоменклатураОбъект.Артикул;

// Явно задаем текстовый формат ячейки
Область.Области.Артикул.Содержимое = ТипЗаполненияОбластиТабличногоДокумента.Значение;
Область.Области.Артикул.СодержащиеЗначение = Истина;
Область.Области.Артикул.ТипЗначения = Новый ОписаниеТипов("Строка");
Область.Области.Артикул.Формат = "ЧГ=0"; // Отключаем группировку триад

При сохранении такого документ командой ТабличныйДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX); платформа 1С автоматически пропишет нужный XML-тег текстового формата, и Excel отобразит ведущие нули.

Способ 2. Выгрузка через COM-объект Excel

Если выгрузка формируется прямо в файл Excel через COM-соединение, примените один из двух вариантов:


// Вариант А: Задать всей колонке текстовый формат "@"
ExcelЛист.Columns("B:B").NumberFormat = "@";
ExcelЛист.Cells(Строка, 2).Value = Строка(Артикул);

// Вариант Б: Добавить апостроф перед значением артикула
// Апостроф заставляет Excel считать значение текстом и не отображается в ячейке
ExcelЛист.Cells(Строка, 2).Value = "'" + Строка(Артикул);

Резюме и рекомендации

Проанализировав все способы обработки, сделаем следующие выводы:

  1. Если задача состоит исключительно в правильном отображении данных в Excel — **не меняйте сам артикул**. Настройте текстовый формат колонки (NumberFormat = "@") или используйте правильное заполнение ТабличногоДокумента в 1С.
  2. Если необходимо модифицировать строку для специфических бизнес-задач — используйте посимвольный анализ с учетом префиксов или встроенную функцию СтрЗаменитьПоРегулярномуВыражению.
  3. Для типовых конфигураций всегда применяйте готовые методы БСП, такие как СтроковыеФункцииКлиентСервер.УдалитьЛидирующиеСимволы, чтобы сделать код надежным и чистым.
← На главную