Рассмотрим распространенную задачу: разработчику требуется вывести номер связанного документа (например, счета-фактуры по документу «Поступление товаров и услуг») в печатную форму. На первый взгляд может показаться, что проще всего извлечь номер прямо из текста гиперссылки или представления документа на форме. Однако такой подход часто приводит к ошибкам при изменении формата строки.
Разберем по шагам два способа решения: классическую работу со строками и регулярными выражениями, а также правильный метод получения номера через объекты и типовые функции 1С.
Если перед нами стоит чисто алгоритмическая задача по извлечению символов из произвольного текста (например, выделение цифр, находящихся между буквами «а» и «в»), проанализируем базовые варианты реализации.
Вариант с использованием встроенных функций СтрНайти и Сред:
Если позиции ограничивающих символов известны, мы можем найти их индексы и вырезать нужный фрагмент строки:
ИсходнаяСтрока = "га1234вт";
ПозицияА = СтрНайти(ИсходнаяСтрока, "а");
ПозицияВ = СтрНайти(ИсходнаяСтрока, "в");
Если ПозицияА > 0 И ПозицияВ > ПозицияА Тогда
ДлинаПодстроки = ПозицияВ - ПозицияА - 1;
Результат = Сред(ИсходнаяСтрока, ПозицияА + 1, ДлинаПодстроки);
КонецЕсли;
Вариант с использованием регулярных выражений:
Если формат строки может меняться или требуется более гибкий поиск по шаблону, целесообразно использовать регулярные выражения. Начиная с платформы 1С:Предприятие 8.3.24, в языке доступны встроенные функции работы с регулярными выражениями (например, СтрНайтиРегулярноеВыражение). На более ранних версиях под управлением Windows применяется COM-объект VBScript.RegExp.
Посмотрим на пример извлечения последовательности цифр между конкретными буквами с помощью COM-объекта:
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина;
RegExp.Global = Ложь;
RegExp.Pattern = "а(\d+)в"; // Группа захвата для цифр между "а" и "в"
Совпадения = RegExp.Execute(ИсходнаяСтрока);
Если Совпадения.Count > 0 Тогда
Результат = Совпадения.Item(0).SubMatches(0);
КонецЕсли;
Выясним, почему вырезать номер из текста гиперссылки (например, из строки Счет-фактура выданный П00000000859 от 31.07.2017) в реальных задачах 1С не рекомендуется:
Вместо работы со строкой получим ссылку на нужный документ через критерий отбора подчиненных документов или стандартные реквизиты:
// Находим подчиненные документы по документу-основанию
МассивСвязанных = КритерииОтбора.СвязанныеДокументы.Найти(СсылкаНаДокументОснование);
СсылкаНаСчетФактуру = Неопределено;
Для Каждого СсылкаИзМассива Из МассивСвязанных Цикл
ТипДокумента = ТипЗнч(СсылкаИзМассива);
Если ТипДокумента = Тип("ДокументСсылка.СчетФактураВыданный")
ИЛИ ТипДокумента = Тип("ДокументСсылка.СчетФактураПолученный") Тогда
СсылкаНаСчетФактуру = СсылкаИзМассива;
Прервать;
КонецЕсли;
КонецЦикла;
После того как ссылка на счет-фактуру получена, сформируем красивый номер для вывода на печать с помощью функции Библиотеки Стандартных Подсистем (БСП):
Если ЗначениеЗаполнено(СсылкаНаСчетФактуру) Тогда
// Удаляем префиксы и лидирующие нули для отображения в печатной форме
НомерНаПечать = ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(СсылкаНаСчетФактуру.Номер);
КонецЕсли;
В типовых конфигурациях (таких как «1С:Бухгалтерия», «1С:ERP» или «1С:Управление торговлей») также присутствуют специализированные функции в общих модулях учета НДС (например, УчетНДС), позволяющие получить связанный счет-фактуру одной строкой кода.