Корректное заполнение справочника Контрагенты — залог отсутствия ошибок в регламентированной отчетности и удобства поиска в базе. Часто возникает задача запретить ввод цифр, латиницы или спецсимволов в поле наименования, особенно если речь идет о физических лицах. В рамках данной статьи мы разберем, как реализовать проверку наименования, разделим логику для юридических и физических лиц, а также научим систему автоматически исправлять регистр символов.
Прежде всего, нам необходимо определиться, где именно должна происходить проверка. Если мы разместим код только в модуле формы, проверка сработает при ручном вводе пользователем, но может быть проигнорирована при программном создании контрагента (например, при загрузке из Excel или через веб-сервис). Проанализируем ситуацию: для гарантированного результата лучше всего использовать модуль объекта или расширение, перехватывающее событие ПередЗаписью.
Рассмотрим основные критерии проверки:
В современных конфигурациях 1С (БП 3.0, УТ 11, ERP) самый элегантный способ проверки — использование общего модуля СтроковыеФункцииКлиентСервер. Разберем по шагам, как написать обработчик в модуле формы или в расширении.
Посмотрим на пример кода, который разделяет проверку в зависимости от типа контрагента:
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Определяем тип контрагента (ЮрЛицо или ФизЛицо)
ТипКонтрагента = ТекущийОбъект.ЮридическоеФизическоеЛицо;
ФизЛицоПредопределенное = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо");
Если ТипКонтрагента = ФизЛицоПредопределенное Тогда
// Проверяем, что в строке только кириллица
// Второй параметр Ложь означает, что пробелы допустимы
РезультатПроверки = СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(ТекущийОбъект.Наименование, Ложь, "-");
Если Не РезультатПроверки Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Наименование физлица должно содержать только русские буквы!", , "Объект.Наименование");
Отказ = Истина;
КонецЕсли;
// Автоматически исправляем регистр: первая буква заглавная
ТекущийОбъект.Наименование = ТРег(ТекущийОбъект.Наименование);
ТекущийОбъект.НаименованиеПолное = ТРег(ТекущийОбъект.НаименованиеПолное);
Иначе
// Логика для Юридических лиц: допускаем латиницу и цифры
ДопустимыеСимволы = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-""";
РезультатПроверки = СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(ТекущийОбъект.Наименование, Ложь, ДопустимыеСимволы);
Если Не РезультатПроверки Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Наименование содержит недопустимые спецсимволы!", , "Объект.Наименование");
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Если ваша конфигурация не использует БСП или вам нужен максимально жесткий контроль, можно создать собственную функцию перебора символов. Выясним причину популярности этого метода: он позволяет точно задать диапазоны Unicode для кириллицы (коды 1040–1103) и отдельно обработать букву "Ё".
Проанализируем функцию, которая находит все недопустимые знаки:
Функция НайтиНедопустимыеСимволы(СтрокаДляПроверки) Экспорт
НедопустимыеСимволы = Новый Массив;
Диапазоны = Новый Массив;
// Добавляем разрешенные диапазоны
Диапазоны.Добавить(Новый Структура("Мин, Макс", 1040, 1103)); // Основная кириллица
Диапазоны.Добавить(Новый Структура("Мин, Макс", 1025, 1025)); // Буква Ё
Диапазоны.Добавить(Новый Структура("Мин, Макс", 1105, 1105)); // Буква ё
Диапазоны.Добавить(Новый Структура("Мин, Макс", 32, 32)); // Пробел
Диапазоны.Добавить(Новый Структура("Мин, Макс", 45, 45)); // Дефис
Для Позиция = 1 По СтрДлина(СтрокаДляПроверки) Цикл
СимволДляПроверки = Сред(СтрокаДляПроверки, Позиция, 1);
КодСимвола = КодСимвола(СимволДляПроверки);
ЭтоДопустимый = Ложь;
Для Каждого Диапазон Из Диапазоны Цикл
Если КодСимвола >= Диапазон.Мин И КодСимвола <= Диапазон.Макс Тогда
ЭтоДопустимый = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ ЭтоДопустимый Тогда
НедопустимыеСимволы.Добавить(СимволДляПроверки);
КонецЕсли;
КонецЦикла;
Возврат НедопустимыеСимволы;
КонецФункции
Эту функцию удобно вызывать в событии ПередЗаписью модуля объекта. Если массив возвращаемых символов не пуст, мы выводим пользователю предупреждение со списком "запрещенки".
Для опытных разработчиков наиболее лаконичным решением будет использование объекта VBScript.RegExp. Посмотрим на пример проверки ФИО, где фамилия, имя и отчество должны начинаться с большой буквы и содержать только кириллицу:
Функция НаименованиеСоответствуетТребованиям(Текст)
RegExp = Новый COMОбъект("VBScript.RegExp");
// Патерн: только кириллица, слова с большой буквы, допускается дефис
RegExp.Pattern = "^[А-ЯЁ][а-яё]+(\s[А-ЯЁ][а-яё]+)*$";
RegExp.IgnoreCase = Ложь;
RegExp.Global = Истина;
Возврат RegExp.Test(Текст);
КонецФункции
Важный нюанс: использование COM-объектов на сервере под управлением Linux невозможно. Если ваша база работает на Linux-сервере, придерживайтесь Варианта 1 с функциями БСП.
При реализации ограничений важно не "перегнуть палку". Например, фамилии могут быть двойными (Салтыков-Щедрин), а значит, дефис должен быть в списке исключений. Также часто пользователи копируют текст из Word, где вместо обычного пробела может стоять "неразрывный пробел" (код 160). Перед началом проверки рекомендуется выполнить очистку строки:
// Заменяем неразрывные пробелы на обычные
ТекстДляПроверки = СтрЗаменить(Объект.Наименование, Символ(160), " ");
// Убираем лишние пробелы в начале и конце
ТекстДляПроверки = СокрЛП(ТекстДляПроверки);
Использование встроенной функции ТРег() позволяет принудительно устанавливать Титульный Регистр. Мы рекомендуем делать это в событии ПриИзменении на форме, чтобы пользователь сразу видел результат работы алгоритма. Это повышает лояльность сотрудников к системе: программа не просто "ругается" на ошибки, а помогает их исправлять.
Резюмируя, отметим, что наиболее стабильным решением для платформы 8.3 является использование СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке внутри расширения. Это сохраняет конфигурацию на поддержке и гарантирует чистоту данных в справочнике Контрагенты.