Как правильно склонять строки с аббревиатурами и техническими артикулами в 1С?

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

В процессе разработки печатных форм и формирования управленческих отчетов в системе «1С:Предприятие» программисты часто сталкиваются с необходимостью склонения наименований товаров или оборудования. Стандартная функция платформы ПолучитьСклоненияСтроки отлично справляется с ФИО, но при работе с техническими терминами возникают трудности. Например, строка «Электродвигатель ТЕ-006» в родительном падеже может превратиться в «Электродвигателя ТЕХ-006», так как алгоритм ошибочно принимает аббревиатуру «ТЕ» за сокращение слова и пытается его «нормализовать». В этой статье мы подробно разберем, как обойти это ограничение и добиться корректного результата.

Причина некорректного поведения стандартных функций

Прежде всего, проанализируем ситуацию: почему платформа ведет себя именно так? Встроенный механизм склонения, доступный начиная с версии 8.3.13, базируется на сложных лингвистических алгоритмах. Когда система встречает короткие буквенные сочетания, она сопоставляет их со словарем исключений и общепринятых сокращений. В случае с «ТЕ-006» платформа видит дефис и буквенный код, который она интерпретирует как часть слова, требующую расшифровки или склонения. Чтобы этого избежать, нам нужно научить программу отличать обычные слова от технических кодов и аббревиатур.

Метод 1: Выборочное склонение через разделение строки

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

Логика проста: если слово написано заглавными буквами (или содержит цифры), мы считаем его аббревиатурой или артикулом и оставляем в исходном виде. Рассмотрим пример кода:


Функция ПолучитьСклоненияСтрокиБезАббревиатур(СклоняемаяСтрока, ФорматПадежа) Экспорт
    МассивСлов = СтрРазделить(СклоняемаяСтрока, " ");
    Результат = "";
    
    Для каждого Элемент Из МассивСлов Цикл
        // Проверяем, не является ли слово аббревиатурой (2 и более заглавные буквы в начале)
        Если Лев(Элемент, 2) = ВРег(Лев(Элемент, 2)) Тогда
            // Это аббревиатура или артикул, добавляем как есть
            Результат = Результат + " " + Элемент;
        Иначе
            // Это обычное слово, пробуем его просклонять
            МассивСклонений = ПолучитьСклоненияСтроки(Элемент, , ФорматПадежа);
            Если МассивСклонений.Количество() > 0 Тогда
                Результат = Результат + " " + МассивСклонений[0];
            Иначе
                Результат = Результат + " " + Элемент;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    Возврат СокрЛП(Результат);
КонецФункции

Данный подход позволяет сохранить «ТЕ-006» в исходном виде, при этом слово «Электродвигатель» будет успешно преобразовано в «Электродвигателя».

Метод 2: Использование «Родового слова» в лингвистике

Проанализируем ситуацию с точки зрения правил русского языка. В технических наименованиях часто используется конструкция «Родовое слово + Собственное имя/Марка». Согласно правилам, если перед маркой стоит определяющее слово (двигатель, станок, автомобиль), то само название марки (приложение) часто не склоняется. Например: «двигателя ТЕ-006», «автомобиля ВАЗ».

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


МассивСлов = СтрРазделить(НаименованиеНоменклатуры, " ");
Если МассивСлов.Количество() > 0 Тогда
    ПервоеСлово = МассивСлов[0];
    ОстатокСтроки = СтрЗаменить(НаименованиеНоменклатуры, ПервоеСлово, "");
    
    РезультатСклонения = ПолучитьСклоненияСтроки(ПервоеСлово, , "ПД=Родительный");
    ИтоговаяСтрока = РезультатСклонения[0] + ОстатокСтроки;
КонецЕсли;

Метод 3: Принудительная изоляция с помощью кавычек

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

Рассмотрим пошагово:

  1. Программно находим часть строки, которую не нужно склонять (например, все, что идет после первого слова).
  2. Оборачиваем эту часть в кавычки.
  3. Вызываем ПолучитьСклоненияСтроки.
  4. Удаляем кавычки из результата.

Однако стоит помнить, что в справочнике номенклатуры кавычки могут уже присутствовать, поэтому данный метод требует осторожной работы с функцией СтрЗаменить.

Метод 4: Использование регулярных выражений (RegExp)

Для более сложных случаев, когда наименование выглядит как «Двигатель УЕ-50 головного устройства ДОГ-40», простого разделения по пробелам может быть недостаточно. Здесь на помощь приходят регулярные выражения. С их помощью мы можем выделить все токены, состоящие из смеси цифр, дефисов и заглавных букв.

Проанализируем ситуацию: нам нужно создать «маску» строки. Мы заменяем все технические коды на уникальные маркеры (например, «{1}», «{2}»), склоняем оставшийся текст, а затем возвращаем коды на свои места. Это гарантирует, что ни один артикул не будет изменен лингвистическим движком платформы.

Метод 5: Регистр сведений для ручной корректировки

В профессиональных конфигурациях, где точность печатных форм критически важна (например, в авиастроении или медицине), полагаться только на алгоритмы нельзя. Рассмотрим архитектурное решение, используемое в Библиотеке стандартных подсистем (БСП).

Создается регистр сведений СклоненияПредставленийОбъектов. При формировании печатной формы система сначала обращается к этому регистру. Если пользователь один раз вручную указал правильное склонение для сложной позиции номенклатуры, программа запомнит его и будет использовать всегда. Это «золотой стандарт» разработки, так как он сочетает автоматизацию и возможность ручного контроля.

Практические советы и выводы

Подводя итог, можно выделить несколько ключевых рекомендаций для разработчика:

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

← На главную