Как сформировать код справочника с префиксом и ведущими нулями из числа?

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

В процессе разработки часто возникает задача преобразования обычного целого числа в строковый код справочника, соответствующий стандартам 1С. Например, когда из внешнего источника (DBF-файл, Excel или веб-сервис) приходят номера заказов или идентификаторы клиентов вида 1, 4, 69, а в базе 1С они хранятся в формате 00-000001, 00-000004 и 00-000069. В этой статье мы подробно разберем, как правильно реализовать такую конвертацию, рассмотрим различные подходы от простых строковых функций до использования возможностей БСП.

Метод 1: Использование комбинации функций Прав и Формат

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


// Предположим, Номер = 69
// Нам нужно получить хвост из 6 символов с нулями
КодБезПрефикса = Прав("000000" + Формат(Номер, "ЧГ=0"), 6); 
КодСправочника = "00-" + КодБезПрефикса;

Проанализируем ситуацию: функция Формат с параметром ЧГ=0 гарантирует нам, что число не будет разбито пробелами на группы (например, вместо 1 000 мы получим 1000). Затем мы приклеиваем это число к строке «000000». Если число было 69, получится «00000069». Функция Прав(..., 6) возьмет шесть символов справа, и мы получим искомое «000069». Остается только добавить префикс.

Метод 2: Профессиональное использование форматных строк

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

Рассмотрим использование следующих параметров:

  1. ЧЦ (Число цифр) — задает общее количество знаков.
  2. ЧВН (Выводить лидирующие нули) — автоматически заполняет пустые позиции нулями слева.
  3. ЧГ=0 — убирает группировку разрядов.

// Прямое формирование числовой части кода
ДлинаКода = 6;
Префикс = "00-";
НомерЧислом = 69;

КодСтрокой = Префикс + Формат(НомерЧислом, "ЧЦ=" + ДлинаКода + "; ЧВН=; ЧГ=0");
// Результат: "00-000069"

Этот метод хорош тем, что платформа сама контролирует длину и заполнение, что минимизирует риск ошибок при изменении требований к длине кода в будущем.

Метод 3: Использование функций БСП (Библиотека стандартных подсистем)

Если вы работаете в современной конфигурации (например, УТ 11, ERP 2 или БП 3.0), в вашем распоряжении есть готовые программные интерфейсы. Использование БСП делает код более читаемым и соответствующим стандартам разработки 1С.

Разберем пример с использованием общего модуля СтроковыеФункцииКлиентСервер:


ЧислоСтрокой = Формат(Номер, "ЧГ=0");
КодБезПрефикса = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(ЧислоСтрокой, 6, "0", "Слева");
КодСправочника = "00-" + КодБезПрефикса;

Метод ДополнитьСтроку универсален: вы можете указать любой символ дополнения и сторону (Слева/Справа). Это избавляет от необходимости писать логику «склеивания» строк вручную.

Нюансы импорта данных из DBF и поиска контрагентов

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

Важно помнить о производительности поиска:

  1. Индексный поиск: Если вы ищете контрагента по точному совпадению сформированного кода (Справочники.Контрагенты.НайтиПоКоду(КодСправочника)), система использует индекс, и это происходит очень быстро.
  2. Альтернативный поиск: Как справедливо заметили участники обсуждения, поиск только по коду может быть ненадежным, если префиксы в базе могут меняться (например, при смене организации или обмене данными). Если есть возможность, всегда дополняйте поиск проверкой по ИНН или КПП.

// Пример надежного поиска
НайденнаяСсылка = Справочники.Контрагенты.НайтиПоКоду(КодСправочника);
Если НайденнаяСсылка.Пустая() Тогда
    // Попробуем найти по ИНН, если код не совпал из-за префикса
    НайденнаяСсылка = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ИННИзФайла);
КонецЕсли;

Проблема «жестких» префиксов

В реальных базах префикс 00- часто является составным (префикс информационной базы + префикс организации). Жесткое прописывание строки "00-" в коде может привести к тому, что при переносе обработки в другую базу она перестанет работать. Выясним причину: в другой базе префикс может быть МС-. Поэтому в идеале рекомендуется получать префикс программно из настроек организации или использовать механизмы автонумерации платформы.

Подводя итог, можно сказать, что для быстрой разработки лучше всего подходит Метод 1 (с функцией Прав), а для качественного промышленного кода — Метод 2 (с параметрами ЧВН в формате) или использование методов БСП.

← На главную