При выгрузке номенклатуры из 1С в Excel разработчики и пользователи часто сталкиваются с проблемой: программы электронных таблиц по умолчанию воспринимают значения с ведущими нулями (например, 00-00015 или 00015) как обычные числа и автоматически обрезают нули, превращая код в 15. Из-за этого возникают задачи по трансформации артикулов — например, замене лидирующих нулей на буквы алфавита (превращая 00-00015 в ABC15) или явной настройке текстового формата в табличном документе.
В этой статье мы подробно проанализируем различные варианты решения этой задачи: от посимвольной обработки строк средствами языка 1С до применения регулярных выражений, готовых функций БСП и правильной настройки экспорта в Excel без модификации исходных данных.
Разберем ситуацию подробно. Подмена артикулов в базе или «на лету» перед выгрузкой может привести к рассинхронизации данных. Если артикул 00-00015 превратить в ABC15, покупатели или поставщики не смогут найти позицию по штрихкоду или каталогу. Поэтому перед реализацией кода стоит чётко разграничить два подхода:
Проанализируем пошагово оба этих направления.
Рассмотрим, как написать алгоритм, который находит лидирующие нули в строке и заменяет их на соответствующие буквы английского или русского алфавита по порядку (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"
В современных версиях платформы 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С:Бухгалтерия), в вашем распоряжении есть готовые функции БСП. Они позволяют избежать написания велосипедов и гарантируют отказоустойчивость.
Рассмотрим основные функции БСП для работы с лидирующими нулями и строками:
// Удаляет все нули в начале переданной строки
ОчищенныйАртикул = СтроковыеФункцииКлиентСервер.УдалитьЛидирующиеСимволы(Артикул, "0");
// Корректно обрабатывает префиксы организаций и информационных баз
БезНулей = ПрефиксацияОбъектовКлиентСервер.УдалитьЛидирующиеНулиИзНомераОбъекта(Артикул);
// Разделяет артикул по разделителю "-"
МассивЧастей = ОбщегоНазначенияКлиентСервер.РазложитьСтрокуВМассивПодстрок(Артикул, "-");
Выясним главную причину проблемы: 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 = "'" + Строка(Артикул);
Проанализировав все способы обработки, сделаем следующие выводы:
NumberFormat = "@") или используйте правильное заполнение ТабличногоДокумента в 1С.СтрЗаменитьПоРегулярномуВыражению.СтроковыеФункцииКлиентСервер.УдалитьЛидирующиеСимволы, чтобы сделать код надежным и чистым.