В процессе разработки печатных форм и формирования управленческих отчетов в системе «1С:Предприятие» программисты часто сталкиваются с необходимостью склонения наименований товаров или оборудования. Стандартная функция платформы ПолучитьСклоненияСтроки отлично справляется с ФИО, но при работе с техническими терминами возникают трудности. Например, строка «Электродвигатель ТЕ-006» в родительном падеже может превратиться в «Электродвигателя ТЕХ-006», так как алгоритм ошибочно принимает аббревиатуру «ТЕ» за сокращение слова и пытается его «нормализовать». В этой статье мы подробно разберем, как обойти это ограничение и добиться корректного результата.
Прежде всего, проанализируем ситуацию: почему платформа ведет себя именно так? Встроенный механизм склонения, доступный начиная с версии 8.3.13, базируется на сложных лингвистических алгоритмах. Когда система встречает короткие буквенные сочетания, она сопоставляет их со словарем исключений и общепринятых сокращений. В случае с «ТЕ-006» платформа видит дефис и буквенный код, который она интерпретирует как часть слова, требующую расшифровки или склонения. Чтобы этого избежать, нам нужно научить программу отличать обычные слова от технических кодов и аббревиатур.
Самый простой и эффективный способ — это разделить наименование на отдельные слова и склонять только те из них, которые действительно являются именами существительными. Рассмотрим алгоритм, предложенный участниками сообщества, который базируется на анализе регистра букв.
Логика проста: если слово написано заглавными буквами (или содержит цифры), мы считаем его аббревиатурой или артикулом и оставляем в исходном виде. Рассмотрим пример кода:
Функция ПолучитьСклоненияСтрокиБезАббревиатур(СклоняемаяСтрока, ФорматПадежа) Экспорт
МассивСлов = СтрРазделить(СклоняемаяСтрока, " ");
Результат = "";
Для каждого Элемент Из МассивСлов Цикл
// Проверяем, не является ли слово аббревиатурой (2 и более заглавные буквы в начале)
Если Лев(Элемент, 2) = ВРег(Лев(Элемент, 2)) Тогда
// Это аббревиатура или артикул, добавляем как есть
Результат = Результат + " " + Элемент;
Иначе
// Это обычное слово, пробуем его просклонять
МассивСклонений = ПолучитьСклоненияСтроки(Элемент, , ФорматПадежа);
Если МассивСклонений.Количество() > 0 Тогда
Результат = Результат + " " + МассивСклонений[0];
Иначе
Результат = Результат + " " + Элемент;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат СокрЛП(Результат);
КонецФункции
Данный подход позволяет сохранить «ТЕ-006» в исходном виде, при этом слово «Электродвигатель» будет успешно преобразовано в «Электродвигателя».
Проанализируем ситуацию с точки зрения правил русского языка. В технических наименованиях часто используется конструкция «Родовое слово + Собственное имя/Марка». Согласно правилам, если перед маркой стоит определяющее слово (двигатель, станок, автомобиль), то само название марки (приложение) часто не склоняется. Например: «двигателя ТЕ-006», «автомобиля ВАЗ».
Следовательно, мы можем упростить задачу: склонять только первое слово в строке номенклатуры, если оно не является числом. Это решает проблему в 90% случаев складского учета. Рассмотрим реализацию этой идеи:
МассивСлов = СтрРазделить(НаименованиеНоменклатуры, " ");
Если МассивСлов.Количество() > 0 Тогда
ПервоеСлово = МассивСлов[0];
ОстатокСтроки = СтрЗаменить(НаименованиеНоменклатуры, ПервоеСлово, "");
РезультатСклонения = ПолучитьСклоненияСтроки(ПервоеСлово, , "ПД=Родительный");
ИтоговаяСтрока = РезультатСклонения[0] + ОстатокСтроки;
КонецЕсли;
Выясним еще одну интересную особенность платформы: встроенная функция 1С часто игнорирует текст, заключенный в кавычки. Если формат хранения данных позволяет или если мы можем временно модифицировать строку перед склонением, это станет отличным решением.
Рассмотрим пошагово:
ПолучитьСклоненияСтроки.Однако стоит помнить, что в справочнике номенклатуры кавычки могут уже присутствовать, поэтому данный метод требует осторожной работы с функцией СтрЗаменить.
Для более сложных случаев, когда наименование выглядит как «Двигатель УЕ-50 головного устройства ДОГ-40», простого разделения по пробелам может быть недостаточно. Здесь на помощь приходят регулярные выражения. С их помощью мы можем выделить все токены, состоящие из смеси цифр, дефисов и заглавных букв.
Проанализируем ситуацию: нам нужно создать «маску» строки. Мы заменяем все технические коды на уникальные маркеры (например, «{1}», «{2}»), склоняем оставшийся текст, а затем возвращаем коды на свои места. Это гарантирует, что ни один артикул не будет изменен лингвистическим движком платформы.
В профессиональных конфигурациях, где точность печатных форм критически важна (например, в авиастроении или медицине), полагаться только на алгоритмы нельзя. Рассмотрим архитектурное решение, используемое в Библиотеке стандартных подсистем (БСП).
Создается регистр сведений СклоненияПредставленийОбъектов. При формировании печатной формы система сначала обращается к этому регистру. Если пользователь один раз вручную указал правильное склонение для сложной позиции номенклатуры, программа запомнит его и будет использовать всегда. Это «золотой стандарт» разработки, так как он сочетает автоматизацию и возможность ручного контроля.
Подводя итог, можно выделить несколько ключевых рекомендаций для разработчика:
ТЕ-006), с вероятностью 99% его склонять не нужно.ПолучитьСклоненияСтроки постоянно совершенствуются, и то, что некорректно работало в 8.3.13, может быть исправлено в свежих релизах.Выясним причину большинства ошибок: они возникают тогда, когда мы пытаемся склонить всю строку целиком. Разбивая задачу на части и изолируя техническую информацию, мы получаем полный контроль над формированием текста и гарантируем корректность документов.