При выгрузке данных в Системе компоновки данных (СКД) разработчики часто сталкиваются с эстетической проблемой: номера документов выводятся в стандартном платформенном формате с кучей лидирующих нулей (например, «00000000125» или «ОТ-00000412»). Для внутренней логики СУБД и автонумерации 1С это необходимо, но конечным пользователям гораздо удобнее видеть лаконичные номера — «125» или «ОТ-412».
В этой статье мы подробно разберем четыре практических метода избавления от лидирующих нулей в СКД. Мы изучим как простые способы без программирования, так и высокопроизводительные решения для тяжелых отчетов.
Если ваша конфигурация построена на базе БСП (Библиотеки стандартных подсистем), что справедливо для большинства современных решений (ERP, КА, УТ, БП, ЗУП), то в вашем арсенале уже есть готовые инструменты для форматирования строк. Данный способ является наиболее корректным и простым в реализации.
Главная прелесть этого подхода заключается в том, что мы не изменяем тип данных самого поля. Если мы применим функцию форматирования к полю Ссылка в колонке «Выражение представления», то на экране отобразится красивый короткий номер, но сама ячейка отчета останется полноценной ссылкой на документ. Пользователь сможет дважды кликнуть по ней и открыть форму объекта (расшифровка не сломается).
Рассмотрим пошагово, как это настроить:
Ссылка или Документ).
ПрефиксацияОбъектовКлиентСервер.УдалитьЛидирующиеНулиИзНомераОбъекта(Ссылка.Номер)
В некоторых версиях конфигураций БСП также отлично зарекомендовала себя другая функция, которая умеет автоматически убирать не только нули, но и системные префиксы (например, префикс организации или информационной базы):
ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(Ссылка.Номер, Истина, Истина)
Параметры этой функции (второй и третий Истина) указывают системе на необходимость удаления префикса информационной базы и пользовательского префикса соответственно. В результате вместо «МСК-00000078» пользователь увидит аккуратное «78».
Выясним, как поступить, если отчет создается на самописной конфигурации без БСП или нет возможности обращаться к общим модулям конфигурации. В таком случае мы можем применить изящный алгоритм обработки строки прямо средствами языка выражений СКД.
Для реализации этого лайфхака перейдем на вкладку «Вычисляемые поля» или пропишем формулу в поле «Выражение представления» для нужного реквизита:
СтрЗаменить(СокрЛ(СтрЗаменить(Номер, "0", " ")), " ", "0")
Проанализируем детально, как работает эта трехступенчатая конструкция:
СтрЗаменить: Заменяет абсолютно все нули в номере документа на пробелы. Строка «000001020» превращается в « 1 2 ».СокрЛ: Удаляет все пробелы с левой стороны строки, то есть те, которые изначально были лидирующими нулями. Наша строка « 1 2 » превращается в «1 2 ». При этом внутренние и хвостовые пробелы бережно сохраняются.СтрЗаменить: Делает обратное преобразование — возвращает оставшиеся пробелы (которые находятся внутри и в конце номера) обратно в нули. Наша строка «1 2 » преобразуется в итоговый корректный номер «1020».Важное ограничение: этот алгоритм работает идеально только при условии, что в исходном номере документа гарантированно отсутствуют естественные пробелы.
Если ваш отчет обрабатывает сотни тысяч или миллионы строк, вызов функций общих модулей (Способ 1) или строковых функций СКД (Способ 2) на каждую строку может привести к заметному падению производительности. Это связано с тем, что такие вычисления выполняются на сервере приложений 1С последовательно при выводе результата.
Чтобы отчет формировался мгновенно, перенесем всю тяжелую работу на сторону СУБД (SQL Server или PostgreSQL), обработав строку непосредственно в тексте запроса СКД. Для этого построим последовательную конструкцию ВЫБОР КОГДА с использованием функции ПОДСТРОКА:
ВЫБРАТЬ
ВЫБОР
КОГДА НЕ ПОДСТРОКА(Реализация.Номер, 1, 1) = "0" ТОГДА ПОДСТРОКА(Реализация.Номер, 1, 11)
КОГДА НЕ ПОДСТРОКА(Реализация.Номер, 2, 1) = "0" ТОГДА ПОДСТРОКА(Реализация.Номер, 2, 10)
КОГДА НЕ ПОДСТРОКА(Реализация.Номер, 3, 1) = "0" ТОГДА ПОДСТРОКА(Реализация.Номер, 3, 9)
КОГДА НЕ ПОДСТРОКА(Реализация.Номер, 4, 1) = "0" ТОГДА ПОДСТРОКА(Реализация.Номер, 4, 8)
КОГДА НЕ ПОДСТРОКА(Реализация.Номер, 5, 1) = "0" ТОГДА ПОДСТРОКА(Реализация.Номер, 5, 7)
КОГДА НЕ ПОДСТРОКА(Реализация.Номер, 6, 1) = "0" ТОГДА ПОДСТРОКА(Реализация.Номер, 6, 6)
КОГДА НЕ ПОДСТРОКА(Реализация.Номер, 7, 1) = "0" ТОГДА ПОДСТРОКА(Реализация.Номер, 7, 5)
КОГДА НЕ ПОДСТРОКА(Реализация.Номер, 8, 1) = "0" ТОГДА ПОДСТРОКА(Реализация.Номер, 8, 4)
КОГДА НЕ ПОДСТРОКА(Реализация.Номер, 9, 1) = "0" ТОГДА ПОДСТРОКА(Реализация.Номер, 9, 3)
ИНАЧЕ ПОДСТРОКА(Реализация.Номер, 10, 2)
КОНЕЦ КАК НомерБезНулей
Посмотрим на логику выполнения этого кода СУБД: запрос проверяет символы номера слева направо. Как только алгоритм натыкается на первый символ, не равный нулю, он моментально обрезает строку с этой позиции до конца и возвращает готовый результат. Этот способ отрабатывает за доли секунды даже на огромных массивах данных.
Если номера ваших документов содержат исключительно цифры (в них гарантированно нет префиксов, букв и дефисов), то мы можем пойти по пути явного приведения типов. Сама платформа 1С при переводе строки в число автоматически отбрасывает все нули перед первой значащей цифрой.
Для реализации этого метода в СКД перейдем на вкладку «Вычисляемые поля», добавим новое поле и в колонке «Выражение» укажем:
Вычислить("Число(Номер)")
Или выполним приведение типов в самом запросе, если уверены в чистоте данных:
ВЫРАЗИТЬ(Реализация.Номер КАК ЧИСЛО)
Внимание: используйте этот способ с осторожностью. Если в номере попадется хотя бы один нечисловой символ (например, косая черта, буква или дефис в префиксе), система выдаст ошибку выполнения запроса или вернет пустое значение.
Мы подробно разобрали различные варианты решения задачи. Какой же из них выбрать?