При разработке в среде 1С:Предприятие часто возникает задача автоматизации рутинного ввода данных. Одной из таких задач является автоматическое заполнение поля ПолноеНаименование на основе введенного пользователем краткого наименования. Например, при вводе "ИП Иванов А.А." система должна автоматически подставить "Индивидуальный Предприниматель Иванов А.А.". В этой статье мы подробно разберем, как реализовать такой механизм, какие ошибки часто совершают новички и как сделать код надежным и универсальным.
Рассмотрим типичную ошибку начинающего разработчика. В первом сообщении темы предложен код, где для каждой аббревиатуры используется отдельная переменная и функция СтрЗаменить, после чего результат последовательно присваивается одному и тому же реквизиту. Проанализируем ситуацию: когда мы пишем несколько строк вида Объект.ПолноеНаименование = РезультатЗамены, в реквизите останется только результат последней выполненной операции. Все предыдущие значения будут просто перезаписаны.
Кроме того, использование простой функции СтрЗаменить таит в себе опасность. Представим, что у нас есть клиент с названием "ООО ВОООЛЬТ". Если мы просто заменим "ООО" на "Общество с ограниченной ответственностью", мы получим некорректную строку: "Общество с ограниченной ответственностью ВОбщество с ограниченной ответственностьюЛЬТ". Программа заменила сочетание букв внутри самого названия компании. Чтобы этого избежать, нам нужно научить систему искать только отдельные слова.
Один из самых надежных способов — это разбиение строки на массив слов с последующим анализом каждого слова. Рассмотрим, как это работает. Мы используем пробел в качестве разделителя, проверяем каждое слово на соответствие нашим аббревиатурам и, если находим совпадение, заменяем его на расшифровку.
Давайте разберем по шагам реализацию через объект Соответствие и функцию СтрРазделить:
&НаКлиенте
Процедура НаименованиеПриИзменении(Элемент)
// Создаем карту соответствий аббревиатур и их полных значений
Аббревиатуры = Новый Соответствие;
Аббревиатуры.Вставить("ООО", "Общество с ограниченной ответственностью");
Аббревиатуры.Вставить("ПАО", "Публичное акционерное общество");
Аббревиатуры.Вставить("ЗАО", "Закрытое акционерное общество");
Аббревиатуры.Вставить("ИП", "Индивидуальный предприниматель");
Аббревиатуры.Вставить("НАО", "Непубличное акционерное общество");
// Разбиваем строку наименования на массив слов по пробелу
НаименованиеМассив = СтрРазделить(Объект.Наименование, " ");
// Перебираем каждое слово в массиве
Для к = 0 По НаименованиеМассив.ВГраница() Цикл
// Приводим слово к верхнему регистру для корректного поиска
СловоВРег = ВРег(НаименованиеМассив[к]);
// Пытаемся получить расшифровку из нашего соответствия
Расшифровка = Аббревиатуры.Получить(СловоВРег);
Если Расшифровка <> Неопределено Тогда
// Если нашли совпадение, заменяем элемент массива на расшифровку
НаименованиеМассив[к] = Расшифровка;
// Прерываем цикл, так как организационная форма обычно одна
Прервать;
КонецЕсли;
КонецЦикла;
// Собираем массив обратно в строку и записываем в полное наименование
Объект.ПолноеНаименование = СтрСоединить(НаименованиеМассив, " ");
КонецПроцедуры
Этот метод хорош тем, что он корректно обрабатывает аббревиатуру в любом месте строки (в начале или в конце) и не портит названия, содержащие похожие сочетания букв внутри слов.
Если в вашей учетной политике принято, что аббревиатура всегда идет первым словом (например, "ООО Ромашка"), можно использовать более легкий способ — проверку левых символов строки. Это работает быстрее, так как не требует разбиения всей строки на массив. Посмотрим на пример кода, предложенный в обсуждении:
&НаКлиенте
Процедура НаименованиеПриИзменении(Элемент)
// Устанавливаем значение по умолчанию, если замена не сработает
Объект.ПолноеНаименование = Объект.Наименование;
// Берем первые 4 символа (например, "ООО ")
ПервыеСимволы = Лев(Объект.Наименование, 4);
Аббревиатуры = Новый Соответствие;
Аббревиатуры.Вставить("ООО ", "Общество с ограниченной ответственностью ");
Аббревиатуры.Вставить("ПАО ", "Публичное акционерное общество ");
Аббревиатуры.Вставить("ИП ", "Индивидуальный предприниматель ");
// Используем метод Получить() напрямую, чтобы избежать лишних циклов
ПолнаяФорма = Аббревиатуры.Получить(ПервыеСимволы);
Если ПолнаяФорма <> Неопределено Тогда
// Заменяем только первое вхождение аббревиатуры с пробелом
Объект.ПолноеНаименование = СтрЗаменить(Объект.Наименование, ПервыеСимволы, ПолнаяФорма);
ИначеЕсли Лев(Объект.Наименование, 3) = "ИП " Тогда
// Отдельная обработка для коротких аббревиатур
Объект.ПолноеНаименование = СтрЗаменить(Объект.Наименование, "ИП ", "Индивидуальный предприниматель ");
КонецЕсли;
КонецПроцедуры
Важный нюанс: при таком подходе всегда добавляйте пробел в ключ поиска ("ООО "), чтобы не "зацепить" названия, начинающиеся на эти буквы.
Для максимально гибкого поиска, учитывающего границы слов, кавычки и различные регистры, профессионалы используют регулярные выражения. До версии платформы 8.3.23 это реализовывалось через COM-объект VBScript.RegExp, который работает только под Windows. Однако в новых версиях платформы появился встроенный объект РегулярноеВыражение, работающий на всех ОС.
Проанализируем пример использования шаблона для поиска аббревиатуры как отдельного слова:
// Пример шаблона для поиска ООО как отдельного слова
Шаблон = "(^|\s|""|«)ООО($|\s|""|»)";
Этот шаблон говорит системе: "Найди ООО, перед которым либо начало строки, либо пробел, либо кавычка, и после которого либо конец строки, либо пробел, либо кавычка". Это самый точный метод, исключающий любые ошибки автоматической замены.
Несмотря на то, что написание собственного парсера — отличная практика для программиста, в реальных бизнес-проектах стоит рассмотреть более продвинутые методы:
РаботаСКонтрагентами или аналогичных.СокрЛП(), чтобы лишние пробелы в начале или конце строки не ломали вашу логику.Выясним причину, почему так важно правильно заполнять полное наименование. Согласно законодательству, в первичных документах (счетах-фактурах, актах) должно фигурировать именно полное юридическое наименование организации. Ошибки в этом поле могут привести к проблемам с налоговой проверкой у ваших клиентов, поэтому автоматизация данного процесса — это не только удобство, но и вопрос безопасности бизнеса.
Подводя итог, проанализируем ситуацию: для простых задач достаточно метода со СтрРазделить, а для сложных систем с высокими требованиями к качеству данных лучше использовать регулярные выражения или интеграцию с внешними сервисами заполнения по ИНН.