Как получить номер счета-фактуры в 1С или извлечь цифры из строки?

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

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

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

Способ 1. Извлечение символов из строки средствами 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);
КонецЕсли;

Способ 2. Правильное получение номера документа через связи метаданных

Выясним, почему вырезать номер из текста гиперссылки (например, из строки Счет-фактура выданный П00000000859 от 31.07.2017) в реальных задачах 1С не рекомендуется:

  1. Текстовое представление формируется динамически и зависит от настроек пользователя или интерфейса.
  2. Номер документа в базе данных содержит префиксы организации, базы данных и лидирующие нули, которые требуют специализированной обработки для печатной формы.

Вместо работы со строкой получим ссылку на нужный документ через критерий отбора подчиненных документов или стандартные реквизиты:


// Находим подчиненные документы по документу-основанию
МассивСвязанных = КритерииОтбора.СвязанныеДокументы.Найти(СсылкаНаДокументОснование);

СсылкаНаСчетФактуру = Неопределено;
Для Каждого СсылкаИзМассива Из МассивСвязанных Цикл
    ТипДокумента = ТипЗнч(СсылкаИзМассива);
    Если ТипДокумента = Тип("ДокументСсылка.СчетФактураВыданный") 
       ИЛИ ТипДокумента = Тип("ДокументСсылка.СчетФактураПолученный") Тогда
        СсылкаНаСчетФактуру = СсылкаИзМассива;
        Прервать;
    КонецЕсли;
КонецЦикла;

После того как ссылка на счет-фактуру получена, сформируем красивый номер для вывода на печать с помощью функции Библиотеки Стандартных Подсистем (БСП):


Если ЗначениеЗаполнено(СсылкаНаСчетФактуру) Тогда
    // Удаляем префиксы и лидирующие нули для отображения в печатной форме
    НомерНаПечать = ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(СсылкаНаСчетФактуру.Номер);
КонецЕсли;

В типовых конфигурациях (таких как «1С:Бухгалтерия», «1С:ERP» или «1С:Управление торговлей») также присутствуют специализированные функции в общих модулях учета НДС (например, УчетНДС), позволяющие получить связанный счет-фактуру одной строкой кода.

← На главную