Как ограничить наименование контрагента: установка правил ввода и автоматическое форматирование

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

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

Постановка задачи и выбор метода реализации

Прежде всего, нам необходимо определиться, где именно должна происходить проверка. Если мы разместим код только в модуле формы, проверка сработает при ручном вводе пользователем, но может быть проигнорирована при программном создании контрагента (например, при загрузке из Excel или через веб-сервис). Проанализируем ситуацию: для гарантированного результата лучше всего использовать модуль объекта или расширение, перехватывающее событие ПередЗаписью.

Рассмотрим основные критерии проверки:

  1. Для физических лиц: только кириллица, запрет цифр и спецсимволов, автоматическое приведение к титульному регистру (Иванов Иван Иванович).
  2. Для юридических лиц: разрешение на использование кавычек, дефисов и, в ряде случаев, латиницы (для международных брендов).

Вариант 1: Использование функций библиотеки стандартных подсистем (БСП)

В современных конфигурациях 1С (БП 3.0, УТ 11, ERP) самый элегантный способ проверки — использование общего модуля СтроковыеФункцииКлиентСервер. Разберем по шагам, как написать обработчик в модуле формы или в расширении.

Посмотрим на пример кода, который разделяет проверку в зависимости от типа контрагента:


&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    
    // Определяем тип контрагента (ЮрЛицо или ФизЛицо)
    ТипКонтрагента = ТекущийОбъект.ЮридическоеФизическоеЛицо;
    ФизЛицоПредопределенное = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо");
    
    Если ТипКонтрагента = ФизЛицоПредопределенное Тогда
        
        // Проверяем, что в строке только кириллица
        // Второй параметр Ложь означает, что пробелы допустимы
        РезультатПроверки = СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(ТекущийОбъект.Наименование, Ложь, "-");
        
        Если Не РезультатПроверки Тогда
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Наименование физлица должно содержать только русские буквы!", , "Объект.Наименование");
            Отказ = Истина;
        КонецЕсли;
        
        // Автоматически исправляем регистр: первая буква заглавная
        ТекущийОбъект.Наименование = ТРег(ТекущийОбъект.Наименование);
        ТекущийОбъект.НаименованиеПолное = ТРег(ТекущийОбъект.НаименованиеПолное);
        
    Иначе
        // Логика для Юридических лиц: допускаем латиницу и цифры
        ДопустимыеСимволы = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-""";
        РезультатПроверки = СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(ТекущийОбъект.Наименование, Ложь, ДопустимыеСимволы);
        
        Если Не РезультатПроверки Тогда
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Наименование содержит недопустимые спецсимволы!", , "Объект.Наименование");
            Отказ = Истина;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Вариант 2: Универсальная функция проверки через коды символов

Если ваша конфигурация не использует БСП или вам нужен максимально жесткий контроль, можно создать собственную функцию перебора символов. Выясним причину популярности этого метода: он позволяет точно задать диапазоны Unicode для кириллицы (коды 1040–1103) и отдельно обработать букву "Ё".

Проанализируем функцию, которая находит все недопустимые знаки:


Функция НайтиНедопустимыеСимволы(СтрокаДляПроверки) Экспорт
    НедопустимыеСимволы = Новый Массив;
    Диапазоны = Новый Массив;
    
    // Добавляем разрешенные диапазоны
    Диапазоны.Добавить(Новый Структура("Мин, Макс", 1040, 1103)); // Основная кириллица
    Диапазоны.Добавить(Новый Структура("Мин, Макс", 1025, 1025)); // Буква Ё
    Диапазоны.Добавить(Новый Структура("Мин, Макс", 1105, 1105)); // Буква ё
    Диапазоны.Добавить(Новый Структура("Мин, Макс", 32, 32));     // Пробел
    Диапазоны.Добавить(Новый Структура("Мин, Макс", 45, 45));     // Дефис
    
    Для Позиция = 1 По СтрДлина(СтрокаДляПроверки) Цикл
        СимволДляПроверки = Сред(СтрокаДляПроверки, Позиция, 1);
        КодСимвола = КодСимвола(СимволДляПроверки);
        
        ЭтоДопустимый = Ложь;
        Для Каждого Диапазон Из Диапазоны Цикл
            Если КодСимвола >= Диапазон.Мин И КодСимвола <= Диапазон.Макс Тогда
                ЭтоДопустимый = Истина;
                Прервать;
            КонецЕсли;
        КонецЦикла;
        
        Если НЕ ЭтоДопустимый Тогда
            НедопустимыеСимволы.Добавить(СимволДляПроверки);
        КонецЕсли;
    КонецЦикла;
    
    Возврат НедопустимыеСимволы;
КонецФункции

Эту функцию удобно вызывать в событии ПередЗаписью модуля объекта. Если массив возвращаемых символов не пуст, мы выводим пользователю предупреждение со списком "запрещенки".

Вариант 3: Регулярные выражения (RegExp)

Для опытных разработчиков наиболее лаконичным решением будет использование объекта VBScript.RegExp. Посмотрим на пример проверки ФИО, где фамилия, имя и отчество должны начинаться с большой буквы и содержать только кириллицу:


Функция НаименованиеСоответствуетТребованиям(Текст)
    RegExp = Новый COMОбъект("VBScript.RegExp");
    // Патерн: только кириллица, слова с большой буквы, допускается дефис
    RegExp.Pattern = "^[А-ЯЁ][а-яё]+(\s[А-ЯЁ][а-яё]+)*$";
    RegExp.IgnoreCase = Ложь;
    RegExp.Global = Истина;
    Возврат RegExp.Test(Текст);
КонецФункции

Важный нюанс: использование COM-объектов на сервере под управлением Linux невозможно. Если ваша база работает на Linux-сервере, придерживайтесь Варианта 1 с функциями БСП.

Тонкости обработки спецсимволов и регистра

При реализации ограничений важно не "перегнуть палку". Например, фамилии могут быть двойными (Салтыков-Щедрин), а значит, дефис должен быть в списке исключений. Также часто пользователи копируют текст из Word, где вместо обычного пробела может стоять "неразрывный пробел" (код 160). Перед началом проверки рекомендуется выполнить очистку строки:


// Заменяем неразрывные пробелы на обычные
ТекстДляПроверки = СтрЗаменить(Объект.Наименование, Символ(160), " ");
// Убираем лишние пробелы в начале и конце
ТекстДляПроверки = СокрЛП(ТекстДляПроверки);

Использование встроенной функции ТРег() позволяет принудительно устанавливать Титульный Регистр. Мы рекомендуем делать это в событии ПриИзменении на форме, чтобы пользователь сразу видел результат работы алгоритма. Это повышает лояльность сотрудников к системе: программа не просто "ругается" на ошибки, а помогает их исправлять.

Резюмируя, отметим, что наиболее стабильным решением для платформы 8.3 является использование СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке внутри расширения. Это сохраняет конфигурацию на поддержке и гарантирует чистоту данных в справочнике Контрагенты.

← На главную