Я задаю через функцию проверку поля Фамилия (это реквизит справочника) на то чтобы оно было не пустым и содержало бы только буквы. Но мне 1с сообщает что фактических параметров слишком много.

```1c
    Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    Если ПустаяСтрока(Объект.Фамилия) Тогда
    СообщитьПользователю("Объект.Фамилия", "Заполните поле Фамилия", Отказ)
    ИначеЕсли ПроверитьФамилию(Отказ, Объект.Фамилия) = Ложь Тогда
    Сообщить("ерундааа!");
    Отказ = Истина;

    КонецЕсли;
```

И функция (пока тестовая, так как я пытаюсь разобраться) :

```1c
    &НаКлиенте
    Функция ПроверитьФамилию()

    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.Global = Истина;
    RegExp.IgnoreCase = Истина;
    ИсходнаяСтрока = объект.Фамилия; //ПолеФамилия - строка
    RegExp.Pattern = "+ИсходнаяСтрока+" + "[а-яА-Я]";
    Matches = RegExp.Execute(ИсходнаяСтрока);
    Результат = Matches.Count;

    КонецФункции // ПроверитьПолеФамилия()
```

Сообщение об ошибках:

{Справочник.Пользователи.Форма.Регистрация.Форма(31,28)}: Слишком много фактических параметров (ПроверитьФамилию)
ИначеЕсли ПроверитьФамилию(<<?>>Объект.Фамилия) = Ложь Тогда (Проверка: Тонкий клиент)
---
Посмотрите мою. логику. Если Вам так подойдёт. Что я исправила -
RegExp.Pattern = ""+ИсходнаяСтрока+"" + "[а-яА-Я]" на
RegExp.Pattern = "[а-яА-Я]";
По логике, Вам надо проверить на соответствие буквам. Значит, мы находит, сколько букв и сколько символов. Если нет равенства, то есть какие-то дополнительные символы - знаки, цифры и т.д.
---
https://infostart.ru/public/464971/
---
У Вас функция определена без параметров:

```1c
    &НаКлиенте
    Функция ПроверитьФамилию()
```

А вызываете с двумя параметрами -

```1c
    ИначеЕсли ПроверитьФамилию(Отказ, Объект.Фамилия) = Ложь Тогда
```
---
эти же самые параметры должны быть и здесь ? Тип чтобы вышло так.

```1c
    &НаКлиенте
    Функция ПроверитьФамилию()
```

Поправил, но не срабатывает.

```1c
    &НаКлиенте
    Функция ПроверитьФамилию(Отказ, Фамилия)

    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.Global = Истина;
    RegExp.IgnoreCase = Истина;
    ИсходнаяСтрока = объект.Фамилия; //ПолеНаименование - строка
    RegExp.Pattern = "+ИсходнаяСтрока+" + "[а-яА-Я]";
    Matches = RegExp.Execute(ИсходнаяСтрока);
    Результат = Matches.Count;

    КонецФункции // ПроверитьПолеФамилия()
```
---
В функции никак не обрабатывается
```1c
    Отказ
```
. Я не знакома с RegExp, но чисто по логике кода, я думаю, надо определить функцию от одного параметра
```1c
    Объект
```
:

```1c
    &НаКлиенте
    Функция ПроверитьФамилию(Объект)
```

И вызов делать
```1c
    ИначеЕсли ПроверитьФамилию(Объект) = Ложь
```
---
Это в первом приближении. Далее что делает Matches.Count? Он возвращает число?
---
Я щас как ёжик в тумане. Туплю чутка поэтому и код постоянно меняется, пока я всё доконца не пойму.
Сейчас я исправил код и пока что если в реквизите что угодно, но не буквы, то выдается ошибка.
Не хватает ошибки теперь в случае когда есть буквы и цифры.
Т.е. реквизит Фамилия содержать должен только буквы.

```1c
    &НаКлиенте
    Функция ПроверитьФамилию(Отказ, Фамилия)

    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.Global = Истина;
    RegExp.IgnoreCase = Истина;
    ИсходнаяСтрока = "+ИсходнаяСтрока+" +объект.Фамилия; //ПолеФамилия - строка
    RegExp.Pattern = "[а-яА-Я]";
    Если RegExp.Test(Фамилия) Тогда
    Возврат Истина;
    Иначе
    Возврат Ложь;
    КонецЕсли;

    КонецФункции // ПроверитьПолеФамилия()
```

Пока что работает так:
---
Я сейчас посмотрела, получается, Matches.Count выводит количество символов, соответствующих шаблону.

```1c
    Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    Если ПустаяСтрока(Объект.Фамилия) Тогда
    СообщитьПользователю("Объект.Фамилия", "Заполните поле Фамилия", Отказ)
    ИначеЕсли ПроверитьФамилию(Объект) = Ложь Тогда
    Сообщить("ерундааа!");
    Отказ = Истина;

    КонецЕсли;
```

```1c
    &НаКлиенте
    Функция ПроверитьФамилию(Объект)

    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.Global = Истина;
    RegExp.IgnoreCase = Истина;
    Фамилия = Объект.Фамилия;
    RegExp.Pattern = "[а-яА-Я]";
    Matches = RegExp.Execute(Фамилия);
    КоличествоБукв = Matches.Count;
    КоличествоСимволов = СтрДлина(Фамилия);
    Если КоличествоБукв<>КоличествоСимволов Тогда
    Результат = Ложь;
    Иначе
    Результат = Истина;
    КонецЕсли;

    КонецФункции // ПроверитьПолеФамилия()
```
---
Так и оставить ?
---
А также такое замечание - у Вас функция возвращает количество соответствий шаблону. Например, Иванов - 6. Но это если исправить шаблон. А Вы, обращаясь к функции, анализируете на ложь...
---
Посмотрите мою. логику. Если Вам так подойдёт. Что я исправила -
RegExp.Pattern = ""+ИсходнаяСтрока+"" + "[а-яА-Я]" на
RegExp.Pattern = "[а-яА-Я]";
По логике, Вам надо проверить на соответствие буквам. Значит, мы находит, сколько букв и сколько символов. Если нет равенства, то есть какие-то дополнительные символы - знаки, цифры и т.д.
---
Ну Вы проверьте, как работает. На мой взгляд так и надо оставить).
---
Отлично работает, я вот изначально хотел проверять регулярным выражением фамилию, имя, отчество. Стоит ли на каждое поле делать функцию ? Так как проверка у всех полей одинакова - должны быть только буквы.
---
Добавьте тогда в функцию проверку на имя и на отчество.
---
Функция не работает если вместе с буквами есть спец символы или цифры.

У меня работает всё. Поправил снова.

```1c
    &НаКлиенте
    Функция ПроверитьФамилию(Отказ, Фамилия)

    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.Global = Истина;
    RegExp.IgnoreCase = Истина;
    Фамилия = Объект.Фамилия; //ПолеФамилия - строка
    RegExp.Pattern = "[а-яА-Я]";
    Matches = RegExp.Execute(Фамилия);
    КоличествоБукв = Matches.Count;
    КоличествоСимволов = СтрДлина(Фамилия);
    Если КоличествоБукв<>КоличествоСимволов Тогда
    Результат = Ложь;
    Иначе
    Результат = Истина;
    КонецЕсли;
    Если RegExp.Test(Результат) Тогда
    Возврат Истина;
    Иначе
    Возврат Ложь;
    КонецЕсли;
    КонецФункции // ПроверитьПолеФамилия()
```

Но вашу логику я понял. Поэтому объединил всё лучшее)
---
Да, надо добавить
Возврат Результат;
Упустила

```1c
    &НаКлиенте
    Функция ПроверитьФамилию(Объект)

    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.Global = Истина;
    RegExp.IgnoreCase = Истина;
    Фамилия = Объект.Фамилия;
    RegExp.Pattern = "[а-яА-Я]";
    Matches = RegExp.Execute(Фамилия);
    КоличествоБукв = Matches.Count;
    КоличествоСимволов = СтрДлина(Фамилия);
    Если КоличествоБукв<>КоличествоСимволов Тогда
    Результат = Ложь;
    Иначе
    Результат = Истина;
    КонецЕсли;

    Возврат Результат;

    КонецФункции
```
---
но будет тогда результат1, результат2, результат3 ?
---
Зависит от задачи. Возможно, достаточно выводить сразу по всем трём полям, ок/не ок. Если нужно по каждому полю, то тогда отдельно надо расписывать.
---
Я пока представляю себе это вот так:

```1c
    &НаКлиенте
    Функция ПроверитьФамилиюИмяОтчество(Отказ, Фамилия, Имя, Отчество)

    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.Global = Истина;
    RegExp.IgnoreCase = Истина;
    Фамилия = Объект.Фамилия; //ПолеФамилия - строка
    RegExp.Pattern = "[а-яА-Я]"; //Проверяем на соответвствие буквам, т.е. должны быть только и только буквы
    Matches = RegExp.Execute(Фамилия); //если есть цифры, спец символы вместе/раздельно букв
    КоличествоБукв = Matches.Count; //то сообщим пользователю об ошибке.
    КоличествоСимволов = СтрДлина(Фамилия); //Сначала находим, сколько букв и сколько символов.

    Имя = Объект.Имя; //ПолеФамилия - строка
    RegExp.Pattern = "[а-яА-Я]"; //Проверяем на соответвствие буквам, т.е. должны быть только и только буквы
    Matches = RegExp.Execute(Имя); //если есть цифры, спец символы вместе/раздельно букв
    КоличествоБукв = Matches.Count; //то сообщим пользователю об ошибке.
    КоличествоСимволов = СтрДлина(Имя); //Сначала находим, сколько букв и сколько символов.

    Фамилия = Объект.Отчество; //ПолеФамилия - строка
    RegExp.Pattern = "[а-яА-Я]"; //Проверяем на соответвствие буквам, т.е. должны быть только и только буквы
    Matches = RegExp.Execute(Отчество); //если есть цифры, спец символы вместе/раздельно букв
    КоличествоБукв = Matches.Count; //то сообщим пользователю об ошибке.
    КоличествоСимволов = СтрДлина(Отчество); //Сначала находим, сколько букв и сколько символов.
    Если КоличествоБукв<>КоличествоСимволов Тогда //Если нет равенства, то есть какие-то дополнительные символы - знаки, цифры и т.д.
    Результат = Ложь;
    Иначе
    Результат = Истина;
    КонецЕсли;
    Если RegExp.Test(Результат) Тогда
    Возврат Истина;
    Иначе
    Возврат Ложь;
    КонецЕсли;
    КонецФункции
```
---
Вы можете в функцию добавить проверку имени и отчества:

```1c
    &НаКлиенте
    Функция ПроверитьФИО(Объект)

    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.Global = Истина;
    RegExp.IgnoreCase = Истина;
    Фамилия = Объект.Фамилия;
    Имя = Объект.Имя;
    Отчество = Объект.Отчество;
    ФИО = Фамилия + Имя + Отчество;
    RegExp.Pattern = "[а-яА-Я]";
    Matches = RegExp.Execute(ФИО);
    КоличествоБукв = Matches.Count;
    КоличествоСимволов = СтрДлина(ФИО);
    Если КоличествоБукв<>КоличествоСимволов Тогда
    Результат = Ложь;
    Иначе
    Результат = Истина;
    КонецЕсли;

    Возврат Результат;
    КонецФункции
```

Как-то так. Ну или можно еще предусмотреть, вдруг лишний пробел стоит)).
---
Не совсем так, я проверяю все поле по отдельности.
---
Хорошо, всё зависит от задачи. Можно и так сделать. Я думаю, Вы теперь справитесь!)
---
Тогда мне говорят будто не хватает параметров:

```1c
    {Справочник.Пользователи.Форма.Регистрация.Форма(31,11)}: Недостаточно фактических параметров (ПроверитьФамилиюИмяОтчество)
    ИначеЕсли <<?>>ПроверитьФамилиюИмяОтчество(Отказ, Объект.Фамилия) = Ложь Тогда (Проверка: Тонкий клиент)
    {Справочник.Пользователи.Форма.Регистрация.Форма(37,11)}: Недостаточно фактических параметров (ПроверитьФамилиюИмяОтчество)
    ИначеЕсли <<?>>ПроверитьФамилиюИмяОтчество(Отказ, Объект.Имя) = Ложь Тогда (Проверка: Тонкий клиент)
    {Справочник.Пользователи.Форма.Регистрация.Форма(43,11)}: Недостаточно фактических параметров (ПроверитьФамилиюИмяОтчество)
    ИначеЕсли <<?>>ПроверитьФамилиюИмяОтчество(Отказ, Объект.Отчество) = Ложь Тогда (Проверка: Тонкий клиент)
```

```1c
    Если ПустаяСтрока(Объект.Фамилия) Тогда
    СообщитьПользователю("Объект.Фамилия", "Заполните поле Фамилия", Отказ)
    ИначеЕсли ПроверитьФамилиюИмяОтчество(Отказ, Объект.Фамилия) = Ложь Тогда
    Сообщить("В поле Фамилия недопустимы цифры и специальные символы!");
    Отказ = Истина;
    КонецЕсли;
    Если ПустаяСтрока(Объект.Имя) Тогда
    СообщитьПользователю("Объект.Имя", "Заполните поле Имя", Отказ)
    ИначеЕсли ПроверитьФамилиюИмяОтчество(Отказ, Объект.Имя) = Ложь Тогда
    Сообщить("В поле Имя недопустимы цифры и специальные символы!");
    Отказ = Истина;
    КонецЕсли;
    Если ПустаяСтрока(Объект.Отчество) Тогда
    СообщитьПользователю("Объект.Отчество", "Заполните поле Отчество", Отказ)
    ИначеЕсли ПроверитьФамилиюИмяОтчество(Отказ, Объект.Отчество) = Ложь Тогда
    Сообщить("В поле Отчество недопустимы цифры и специальные символы!");
    Отказ = Истина;
    КонецЕсли;
```
---
Я немного запуталась. Выложите весь код, включая функцию.
---
Пожалуйста:

```1c
    &НаКлиенте
    Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    Если ПустаяСтрока(Объект.Фамилия) Тогда
    СообщитьПользователю("Объект.Фамилия", "Заполните поле Фамилия", Отказ)
    ИначеЕсли ПроверитьФамилиюИмяОтчество(Отказ, Объект.Фамилия) = Ложь Тогда
    Сообщить("В поле Фамилия недопустимы цифры и специальные символы!");
    Отказ = Истина;
    КонецЕсли;
    Если ПустаяСтрока(Объект.Имя) Тогда
    СообщитьПользователю("Объект.Имя", "Заполните поле Имя", Отказ)
    ИначеЕсли ПроверитьФамилиюИмяОтчество(Отказ, Объект.Имя) = Ложь Тогда
    Сообщить("В поле Имя недопустимы цифры и специальные символы!");
    Отказ = Истина;
    КонецЕсли;
    Если ПустаяСтрока(Объект.Отчество) Тогда
    СообщитьПользователю("Объект.Отчество", "Заполните поле Отчество", Отказ)
    ИначеЕсли ПроверитьФамилиюИмяОтчество(Отказ, Объект.Отчество) = Ложь Тогда
    Сообщить("В поле Отчество недопустимы цифры и специальные символы!");
    Отказ = Истина;
    КонецЕсли;
    Если ПустаяСтрока(Объект.Почта) Тогда
    СообщитьПользователю("Объект.Почта", "Заполните поле Почта", Отказ)
    ИначеЕсли
    ПроверкаПочты(Отказ, Объект.Почта) = Ложь Тогда
    Сообщить("Некорректный адрес почты!");
    Отказ = Истина;
    КонецЕсли;
    Если ПустаяСтрока(Объект.Пароль) Тогда
    СообщитьПользователю("Объект.Пароль", "Заполните поле Пароль", Отказ)
    КонецЕсли;
    Если ПустаяСтрока(Объект.Телефон) Тогда
    СообщитьПользователю("Объект.Телефон", "Заполните поле Телефон", Отказ)
    КонецЕсли;
    Объект.Фамилия = Объект.Фамилия+Объект.ОкончанияФамилий;
    Объект.Отчество = Объект.Отчество+Объект.ОкончаниеОтчества;
    Объект.Наименование = Объект.Фамилия+Объект.ОкончанияФамилий+" "+Объект.Имя+" "+Объект.Отчество+Объект.ОкончаниеОтчества;
    КонецПроцедуры

    &НаКлиенте
    Функция ПроверитьФамилиюИмяОтчество(Отказ, Фамилия, Имя, Отчество)

    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.Global = Истина;
    RegExp.IgnoreCase = Истина;
    Фамилия = Объект.Фамилия; //ПолеФамилия - строка
    RegExp.Pattern = "[а-яА-Я]"; //Проверяем на соответвствие буквам, т.е. должны быть только и только буквы
    Matches = RegExp.Execute(Фамилия); //если есть цифры, спец символы вместе/раздельно букв
    КоличествоБукв = Matches.Count; //то сообщим пользователю об ошибке.
    КоличествоСимволов = СтрДлина(Фамилия); //Сначала находим, сколько букв и сколько символов.

    Имя = Объект.Имя; //ПолеФамилия - строка
    RegExp.Pattern = "[а-яА-Я]"; //Проверяем на соответвствие буквам, т.е. должны быть только и только буквы
    Matches = RegExp.Execute(Имя); //если есть цифры, спец символы вместе/раздельно букв
    КоличествоБукв = Matches.Count; //то сообщим пользователю об ошибке.
    КоличествоСимволов = СтрДлина(Имя); //Сначала находим, сколько букв и сколько символов.

    Фамилия = Объект.Отчество; //ПолеФамилия - строка
    RegExp.Pattern = "[а-яА-Я]"; //Проверяем на соответвствие буквам, т.е. должны быть только и только буквы
    Matches = RegExp.Execute(Отчество); //если есть цифры, спец символы вместе/раздельно букв
    КоличествоБукв = Matches.Count; //то сообщим пользователю об ошибке.
    КоличествоСимволов = СтрДлина(Отчество); //Сначала находим, сколько букв и сколько символов.
    Если КоличествоБукв<>КоличествоСимволов Тогда //Если нет равенства, то есть какие-то дополнительные символы - знаки, цифры и т.д.
    Результат = Ложь;
    Иначе
    Результат = Истина;
    КонецЕсли;
    Если RegExp.Test(Результат) Тогда
    Возврат Истина;
    Иначе
    Возврат Ложь;
    КонецЕсли;
    КонецФункции // ПроверитьПолеФамилиюИмяОтчество()
```
---
```1c
    &НаКлиенте
    Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    Фамилия = Объект.Фамилия;
    Имя = Объект.Имя;
    Отчество = Объект.Отчество;
    Если ПустаяСтрока(Фамилия) Тогда
    СообщитьПользователю("Объект.Фамилия", "Заполните поле Фамилия", Отказ)
    ИначеЕсли ПроверитьФамилиюИмяОтчество(Фамилия) = Ложь Тогда
    Сообщить("В поле Фамилия недопустимы цифры и специальные символы!");
    Отказ = Истина;
    КонецЕсли;
    Если ПустаяСтрока(Имя) Тогда
    СообщитьПользователю("Объект.Имя", "Заполните поле Имя", Отказ)
    ИначеЕсли ПроверитьФамилиюИмяОтчество(Имя) = Ложь Тогда
    Сообщить("В поле Имя недопустимы цифры и специальные символы!");
    Отказ = Истина;
    КонецЕсли;
    Если ПустаяСтрока(Отчество) Тогда
    СообщитьПользователю("Объект.Отчество", "Заполните поле Отчество", Отказ)
    ИначеЕсли ПроверитьФамилиюИмяОтчество(Отчество) = Ложь Тогда
    Сообщить("В поле Отчество недопустимы цифры и специальные символы!");
    Отказ = Истина;
    КонецЕсли;
    Если ПустаяСтрока(Объект.Почта) Тогда
    СообщитьПользователю("Объект.Почта", "Заполните поле Почта", Отказ)
    ИначеЕсли
    ПроверкаПочты(Отказ, Объект.Почта) = Ложь Тогда
    Сообщить("Некорректный адрес почты!");
    Отказ = Истина;
    КонецЕсли;
    Если ПустаяСтрока(Объект.Пароль) Тогда
    СообщитьПользователю("Объект.Пароль", "Заполните поле Пароль", Отказ)
    КонецЕсли;
    Если ПустаяСтрока(Объект.Телефон) Тогда
    СообщитьПользователю("Объект.Телефон", "Заполните поле Телефон", Отказ)
    КонецЕсли;
    Объект.Фамилия = Объект.Фамилия+Объект.ОкончанияФамилий;
    Объект.Отчество = Объект.Отчество+Объект.ОкончаниеОтчества;
    Объект.Наименование = Объект.Фамилия+Объект.ОкончанияФамилий+" "+Объект.Имя+" "+Объект.Отчество+Объект.ОкончаниеОтчества;
    КонецПроцедуры

    &НаКлиенте
    Функция ПроверитьФамилиюИмяОтчество(СтрокаАнализа)

    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.Global = Истина;
    RegExp.IgnoreCase = Истина;
    RegExp.Pattern = "[а-яА-Я]"; //Проверяем на соответвствие буквам, т.е. должны быть только и только буквы
    Matches = RegExp.Execute(СтрокаАнализа); //если есть цифры, спец символы вместе/раздельно букв
    КоличествоБукв = Matches.Count; //то сообщим пользователю об ошибке.
    КоличествоСимволов = СтрДлина(СтрокаАнализа); //Сначала находим, сколько букв и сколько символов.

    Если КоличествоБукв<>КоличествоСимволов Тогда //Если нет равенства, то есть какие-то дополнительные символы - знаки, цифры и т.д.
    Результат = Ложь;
    Иначе
    Результат = Истина;
    КонецЕсли;
    Возврат Результат;
    КонецФункции // ПроверитьПолеФамилиюИмяОтчество()
```
---
А что за конфигурация? Для чего эти строки?

```1c
    Объект.Фамилия = Объект.Фамилия+Объект.ОкончанияФамилий;
    Объект.Отчество = Объект.Отчество+Объект.ОкончаниеОтчества;
    Объект.Наименование = Объект.Фамилия+Объект.ОкончанияФамилий+" "+Объект.Имя+" "+Объект.Отчество+Объект.ОкончаниеОтчества;
```
---
Это я формирую Наименование, сделал небольшое удобство - окончания. Они по желанию.
Появляются в зависимости от пола.
---
Ок, не буду вдаваться в детали!) "Облегчите" тогда функцию, чтоб анализировала одну строку и обращайтесь к ней три раза, для проверки фамилии, имени и отчества, как в комментарии 27. Тем более Вы в функции, получается, сравниваете только для отчества соответствие количества символов количеству букв, и в зависимости от этого получаете результат.
---
И поэтому вы использовали параметр СтрокаАнализа ?
---
Да, назвала так нейтрально, так как можно любую строку передать.
---
Вообще можно и функцию переименовать будет как-нибудь, раз задача расширилась, а то вдруг еще расширится, и будете еще какие-то строки проверять!))) Думаю, когда проверите механизм, можно уже всё еще раз просмотреть и оптимизировать).
---
У Вас функция тут определена от четырёх параметров, а вызываете от двух. Поэтому ошибка.
---
Функция должна возвращать результат. У вас она только что-то там внутри себя делает.