Как извлечь число и подстроку из наименования или комментария номенклатуры в 1С 7.7

Программист 1С v7.7 1С:Комплексная автоматизация Управленческий учет Торговля и дистрибуция
← На главную

При формировании внешних печатных форм нередко возникает задача вывести параметры товара, которых нет в виде отдельных реквизитов, но они зафиксированы в текстовых полях — наименовании или комментарии номенклатуры. Классический пример — указание количества единиц поставки (вложимости), когда в наименовании товара содержится технологическая приписка в квадратных скобках, например [6;] или [40;5], где первым числом до точки с запятой является вложимость в заводскую упаковку.

Разберем, почему стандартные подходы из платформы 1С 8 не работают в версии 7.7, выясним причину распространенных ошибок при парсинге строк и рассмотрим надежные варианты решения этой задачи.

Особенности работы со строками в платформе 1С 7.7

Программисты, привыкшие к платформе 1С:Предприятие 8, часто пытаются применить функцию СтрНайти(), однако в платформе 1С 7.7 такой функции нет. Для поиска символов в строке используется функция Найти(ГдеИскать, ЧтоИскать).

Проанализируем важные ограничения функции Найти() в 1С 7.7:

  1. Функция всегда выполняет поиск только с начала строки и не принимает третий параметр (начальную позицию поиска).
  2. Если символ ; встретится в строке наименования до открывающей скобки [, поиск через Найти(Наименование, ";") вернет позицию первого знака препинания, что приведет к некорректным расчетам.
  3. При вырезании подстроки функцией Сред() необходимо точно контролировать смещение индекса. Если передать начальную позицию символа [, в результирующую строку попадет сама открывающая скобка (например, "[6"). При попытке преобразовать такую строку в число с помощью функции Число() платформа 1С 7.7 вернет значение 0, так как первый нечисловой символ сразу прекращает преобразование.

Решение 1. Пошаговое отсечение строки штатными функциями

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

Посмотрим на пример реализации:


Функция ПолучитьВложимостьИзСтроки(СтрНаименование)
    Перем ПозНачала, Хвост, ПозРазделителя, ЗначениеСтр;
    
    // Ищем открывающую скобку
    ПозНачала = Найти(СтрНаименование, "[");
    Если ПозНачала = 0 Тогда
        Возврат 0;
    КонецЕсли;
    
    // Отсекаем все символы до скобки включительно
    Хвост = Сред(СтрНаименование, ПозНачала + 1);
    
    // В оставшейся части ищем точку с запятой
    ПозРазделителя = Найти(Хвост, ";");
    Если ПозРазделителя = 0 Тогда
        // Если точки с запятой нет, ищем закрывающую скобку
        ПозРазделителя = Найти(Хвост, "]");
    КонецЕсли;
    
    Если ПозРазделителя > 1 Тогда
        // Забираем часть строки до разделителя
        ЗначениеСтр = СокрЛП(Лев(Хвост, ПозРазделителя - 1));
        Возврат Число(ЗначениеСтр);
    КонецЕсли;
    
    Возврат 0;
КонецФункции

Разберем логику работы этой функции: вызов Сред(СтрНаименование, ПозНачала + 1) сдвигает позицию на один символ вправо, полностью исключая символ [ из дальнейшего анализа. Поиск точки с запятой осуществляется уже в изолированной правой части, благодаря чему любые посторонние знаки перед скобкой игнорируются.

Решение 2. Использование регулярных выражений через COM-объект

Если формат наименований может варьироваться (наличие пробелов, дополнительных параметров или мусора внутри скобок), строковые функции становятся громоздкими. В среде Windows для 1С 7.7 удобно применить объект VBScript.RegExp.

Посмотрим, как извлечь число с помощью регулярного выражения:


Функция ПолучитьВложимостьРег(СтрНаименование)
    Перем Рег, Совпадения;
    
    Рег = СоздатьОбъект("VBScript.RegExp");
    Рег.IgnoreCase = 1;
    Рег.Global = 0;
    // Шаблон ищет цифры сразу после открывающей скобки перед точкой с запятой
    Рег.Pattern = "\[\s*(\d+)";
    
    Если Рег.Test(СтрНаименование) = 1 Тогда
        Совпадения = Рег.Execute(СтрНаименование);
        Возврат Число(Совпадения.Item(0).SubMatches.Item(0));
    КонецЕсли;
    
    Возврат 0;
КонецФункции

Данный подход гарантирует извлечение первого блока цифр внутри квадратных скобок независимо от того, какие еще символы присутствуют в строке.

Решение 3. Извлечение параметров из многострочного комментария

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

Проанализируем алгоритм построчного чтения многострочного текста в 1С 7.7 с помощью функций СтрЧислоСтрок() и СтрПолучитьСтроку():


Функция ПолучитьОбъемИзКомментария(ТекстКомментария)
    Перем ВсегоСтрок, Ном, ТекСтрока, ПозМетки, ДлинаМетки;
    
    Метка = "Объем:";
    ДлинаМетки = СтрДлина(Метка);
    ВсегоСтрок = СтрЧислоСтрок(ТекстКомментария);
    
    Для Ном = 1 По ВсегоСтрок Цикл
        ТекСтрока = СокрЛП(СтрПолучитьСтроку(ТекстКомментария, Ном));
        ПозМетки = Найти(ВРег(ТекСтрока), ВРег(Метка));
        
        Если ПозМетки > 0 Тогда
            // Извлекаем текст от конца метки до конца текущей строки
            Возврат СокрЛП(Сред(ТекСтрока, ПозМетки + ДлинаМетки));
        КонецЕсли;
    КонецЦикла;
    
    Возврат "";
КонецФункции

Обратите внимание: если у функции Сред() опущен третий параметр (длина подстроки), в 1С 7.7 возвращается вся оставшаяся часть строки до самого конца, что упрощает забор значения параметра.

Архитектурная альтернатива: отказ от парсинга строк

Хранение бизнес-данных внутри наименования номенклатуры или комментария — крайне ненадежный подход, уязвимый к человеческому фактору (опечатки, случайные пробелы, забытые скобки). В типовой конфигурации «Комплексная 4.5» для платформы 1С 7.7 предусмотрены штатные инструменты учета вложимости и упаковок:

  1. Подчиненный справочник «Единицы»: даже если базовая единица номенклатуры — штуки, в справочник подчиненных единиц измерений можно добавить упаковку или коробку. Реквизит Коэффициент подчиненной единицы жестко фиксирует количество базовых единиц (вложимость). В печатной форме достаточно получить коэффициент нужной единицы, не разбирая текст.
  2. Механизм дополнительных свойств номенклатуры: для хранения нестандартных характеристик товара (вложимость, объем, вес) рекомендуется использовать встроенный механизм свойств, не модифицируя структуру конфигурации.

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

← На главную