Как обрезать лидирующие нули в номере документа при обмене через 1С:Конвертация данных?

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

При настройке обмена между базами с помощью «1С:Конвертация данных» (КД) часто возникает задача форматирования номеров документов. Проанализируем ситуацию: у базы-источника номер документа короткий, а в базе-приемнике требуется строка длиной 30 символов. Если система автоматически дополняет номер нулями (создавая строку из 27 нулей и самого номера), возникает необходимость либо правильно обрезать эти нули, либо корректно их сформировать. Разберем по шагам, как решить эту задачу и избежать типичных ошибок.

Выясним причину ошибки «Встроенная функция может быть использована только в выражении»

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

Прав("00000000000000000000000000000" + СокрЛП(Источник.Номер), 30)

При выгрузке этот код вызовет ошибку: Встроенная функция может быть использована только в выражении. (Прав).

Почему это происходит? Обработчики событий в «Конвертации данных» (например, «Перед выгрузкой» или «При выгрузке») выполняются платформой как обычный программный модуль. Нельзя просто вызвать функцию, возвращающую значение, и оставить ее «висеть в воздухе». Чтобы передать измененное значение в базу-приемник, результат функции необходимо обязательно присвоить специальной системной переменной Значение.

Правильный вариант написания кода выглядит так:

Значение = Прав("00000000000000000000000000000" + СокрЛП(Источник.Номер), 30);

Обратите внимание: приведенный выше код не обрезает нули, а наоборот — добавляет их, добивая строку до 30 символов слева. Посмотрим на примеры того, как действительно избавиться от нулей.

Как обрезать (удалить) лидирующие нули: три надежных способа

Если наша задача состоит именно в том, чтобы очистить номер от лишних нулей в начале строки (например, превратить "000000000000000000000000000123" в "123"), рассмотрим несколько подходов.

1. Универсальный способ с циклом (сохраняет буквенные префиксы)

Этот метод отлично подходит, если в номере могут присутствовать буквы, которые идут после нулей. Разберем код:


ТекНомер = СокрЛП(Источник.Номер);
Пока Лев(ТекНомер, 1) = "0" Цикл
    ТекНомер = Сред(ТекНомер, 2);
КонецЦикла;
Значение = ТекНомер;

Цикл проверяет первый символ строки. Если это ноль, он отрезает его с помощью функции Сред, сдвигаясь на один символ вправо, пока нули не закончатся.

2. Способ через преобразование в число

Если мы точно уверены, что номер документа состоит исключительно из цифр и не содержит текстовых префиксов, мы можем использовать математическое преобразование. Посмотрим на пример:

Значение = Формат(Число(Источник.Номер), "ЧГ=0");

Функция Число автоматически отбросит все лидирующие нули, а функция Формат с параметром ЧГ=0 вернет значение обратно в строковый тип без пробелов-разделителей разрядов.

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

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


// Вариант 1
Значение = ПрефиксацияОбъектовКлиентСервер.УдалитьЛидирующиеНулиИзНомераОбъекта(Источник.Номер);

// Вариант 2
Значение = СтроковыеФункцииКлиентСервер.УдалитьЛидирующиеНули(Источник.Номер);

Где именно прописывать код в правилах обмена?

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

  1. Откройте правило конвертации объекта (ПКО) нужного документа.
  2. Найдите свойство (ПКС) Номер.
  3. Откройте обработчик события Перед выгрузкой.
  4. Вставьте выбранный вами вариант кода (с использованием переменной Значение).

В этом контексте переменная Источник будет содержать ссылку на выгружаемый объект (документ), и мы сможем обратиться к его реквизиту Источник.Номер. А присвоив результат системной переменной Значение, мы принудительно укажем системе, какие именно данные должны попасть в файл обмена.

← На главную