При настройке обмена между базами с помощью «1С:Конвертация данных» (КД) часто возникает задача форматирования номеров документов. Проанализируем ситуацию: у базы-источника номер документа короткий, а в базе-приемнике требуется строка длиной 30 символов. Если система автоматически дополняет номер нулями (создавая строку из 27 нулей и самого номера), возникает необходимость либо правильно обрезать эти нули, либо корректно их сформировать. Разберем по шагам, как решить эту задачу и избежать типичных ошибок.
Рассмотрим подробнее частую ошибку начинающих разработчиков. Пытаясь изменить формат номера, программист может написать в обработчике следующий код:
Прав("00000000000000000000000000000" + СокрЛП(Источник.Номер), 30)
При выгрузке этот код вызовет ошибку: Встроенная функция может быть использована только в выражении. (Прав).
Почему это происходит? Обработчики событий в «Конвертации данных» (например, «Перед выгрузкой» или «При выгрузке») выполняются платформой как обычный программный модуль. Нельзя просто вызвать функцию, возвращающую значение, и оставить ее «висеть в воздухе». Чтобы передать измененное значение в базу-приемник, результат функции необходимо обязательно присвоить специальной системной переменной Значение.
Правильный вариант написания кода выглядит так:
Значение = Прав("00000000000000000000000000000" + СокрЛП(Источник.Номер), 30);
Обратите внимание: приведенный выше код не обрезает нули, а наоборот — добавляет их, добивая строку до 30 символов слева. Посмотрим на примеры того, как действительно избавиться от нулей.
Если наша задача состоит именно в том, чтобы очистить номер от лишних нулей в начале строки (например, превратить "000000000000000000000000000123" в "123"), рассмотрим несколько подходов.
1. Универсальный способ с циклом (сохраняет буквенные префиксы)
Этот метод отлично подходит, если в номере могут присутствовать буквы, которые идут после нулей. Разберем код:
ТекНомер = СокрЛП(Источник.Номер);
Пока Лев(ТекНомер, 1) = "0" Цикл
ТекНомер = Сред(ТекНомер, 2);
КонецЦикла;
Значение = ТекНомер;
Цикл проверяет первый символ строки. Если это ноль, он отрезает его с помощью функции Сред, сдвигаясь на один символ вправо, пока нули не закончатся.
2. Способ через преобразование в число
Если мы точно уверены, что номер документа состоит исключительно из цифр и не содержит текстовых префиксов, мы можем использовать математическое преобразование. Посмотрим на пример:
Значение = Формат(Число(Источник.Номер), "ЧГ=0");
Функция Число автоматически отбросит все лидирующие нули, а функция Формат с параметром ЧГ=0 вернет значение обратно в строковый тип без пробелов-разделителей разрядов.
3. Использование типовых функций Библиотеки стандартных подсистем (БСП)
В современных конфигурациях 1С уже есть готовые инструменты для работы с номерами. Мы можем вызвать функцию из общего модуля базы-источника прямо в правилах конвертации.
// Вариант 1
Значение = ПрефиксацияОбъектовКлиентСервер.УдалитьЛидирующиеНулиИзНомераОбъекта(Источник.Номер);
// Вариант 2
Значение = СтроковыеФункцииКлиентСервер.УдалитьЛидирующиеНули(Источник.Номер);
В КД существует множество мест для внедрения кода (ПКО, ПВД, глобальные обработчики). Для нашей задачи — изменения значения конкретного реквизита при переносе — лучше всего использовать Правило конвертации свойств (ПКС).
Номер.Значение).В этом контексте переменная Источник будет содержать ссылку на выгружаемый объект (документ), и мы сможем обратиться к его реквизиту Источник.Номер. А присвоив результат системной переменной Значение, мы принудительно укажем системе, какие именно данные должны попасть в файл обмена.