Как ограничить наименование контрагента

1. user2070470 12.04.24 14:40 Сейчас в теме
Есть стандартный инструмент (код) для ограничения наименования контрагента физического лица кириллицей с заглавной буквы, без цифр и спецсимволов?
По теме из базы знаний
Найденные решения
3. GeraltSnow 172 12.04.24 16:13 Сейчас в теме
Функция НайтиНедопустимыеСимволы(СтрокаДляПроверки) Экспорт
	
	НедопустимыеСимволы = Новый Массив;
		
	ДиапазоныДопустимыхСимволов = Новый Массив;
	
	ДиапазоныДопустимыхСимволов.Добавить(Новый Структура("Мин, Макс", 1040, 1103)); // Кириллица
	ДиапазоныДопустимыхСимволов.Добавить(Новый Структура("Мин, Макс", 1025, 1025)); // Ё
	ДиапазоныДопустимыхСимволов.Добавить(Новый Структура("Мин, Макс", 1105, 1105)); // ё
	ДиапазоныДопустимыхСимволов.Добавить(Новый Структура("Мин, Макс", 32, 32)); // пробел

	ДлинаСтроки = СтрДлина(СтрокаДляПроверки);
	
	Для Позиция = 1 По ДлинаСтроки Цикл
		
		СимволДляПроверки = Сред(СтрокаДляПроверки, Позиция, 1);
		
		КодСимвола = КодСимвола(СимволДляПроверки);
		
		ЭтоДопустимыйСимвол = Ложь;
		
		Для Каждого Диапазон Из ДиапазоныДопустимыхСимволов Цикл
			Если КодСимвола >= Диапазон.Мин И КодСимвола <= Диапазон.Макс Тогда
				ЭтоДопустимыйСимвол = Истина;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		Если НЕ ЭтоДопустимыйСимвол Тогда
			НедопустимыеСимволы.Добавить(Новый Структура("Позиция, Символ", Позиция, СимволДляПроверки));
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат НедопустимыеСимволы;   
	
КонецФункции
Показать
user1671936; user1837694; +2 Ответить
6. GeraltSnow 172 15.04.24 12:37 Сейчас в теме
(5) (4)

Код сам по себе не начнет работать, если не передать в него данные и не обработать результат выполнения.

Можно сделать вот так, тогда при попытке записи контрагента через форму справочника будет происходить отказ записи с уведомлением пользователю:

//Модуль формы справочника Контрагенты
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)

	НедопустимыеСимволы = НайтиНедопустимыеСимволы(Объект.Наименование); //тип Массив
	
	Если НедопустимыеСимволы.Количество() <> 0 Тогда
		Отказ = Истина;  //запись не пройдет
		ВызватьИсключение "Найдены недопустимые символы в наименовании контрагента!" //пользователь увидит это сообщение
	КонецЕсли;

КонецПроцедуры

Функция НайтиНедопустимыеСимволы(СтрокаДляПроверки)
...
КонецФункции
Показать


И ещё важное уточнение - если просто добавить процедуру ПередЗаписью(Отказ, ПараметрыЗаписи) в код модуля формы, то ничего не заработает. Нужно установить её как обработчик соответствующего события формы.
user1671936; user2070470; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. YozZzhik 12.04.24 15:13 Сейчас в теме
Стандартными методами нельзя ограничить ввод цифр и спец знаков. Нужно писать свою функцию, например, в событии ИзменениеТекстаРедактирования
3. GeraltSnow 172 12.04.24 16:13 Сейчас в теме
Функция НайтиНедопустимыеСимволы(СтрокаДляПроверки) Экспорт
	
	НедопустимыеСимволы = Новый Массив;
		
	ДиапазоныДопустимыхСимволов = Новый Массив;
	
	ДиапазоныДопустимыхСимволов.Добавить(Новый Структура("Мин, Макс", 1040, 1103)); // Кириллица
	ДиапазоныДопустимыхСимволов.Добавить(Новый Структура("Мин, Макс", 1025, 1025)); // Ё
	ДиапазоныДопустимыхСимволов.Добавить(Новый Структура("Мин, Макс", 1105, 1105)); // ё
	ДиапазоныДопустимыхСимволов.Добавить(Новый Структура("Мин, Макс", 32, 32)); // пробел

	ДлинаСтроки = СтрДлина(СтрокаДляПроверки);
	
	Для Позиция = 1 По ДлинаСтроки Цикл
		
		СимволДляПроверки = Сред(СтрокаДляПроверки, Позиция, 1);
		
		КодСимвола = КодСимвола(СимволДляПроверки);
		
		ЭтоДопустимыйСимвол = Ложь;
		
		Для Каждого Диапазон Из ДиапазоныДопустимыхСимволов Цикл
			Если КодСимвола >= Диапазон.Мин И КодСимвола <= Диапазон.Макс Тогда
				ЭтоДопустимыйСимвол = Истина;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		Если НЕ ЭтоДопустимыйСимвол Тогда
			НедопустимыеСимволы.Добавить(Новый Структура("Позиция, Символ", Позиция, СимволДляПроверки));
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат НедопустимыеСимволы;   
	
КонецФункции
Показать
user1671936; user1837694; +2 Ответить
5. user2070470 15.04.24 09:58 Сейчас в теме
(3) Для рабочей базы создал внешнюю обработку, в её модуле объекта разместил по шаблону с ИТС СведенияОВнешнейОбработке

 Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();    
    ПараметрыРегистрации.Версия = "1.0";  
    
    Команда = ПараметрыРегистрации.Команды.Добавить();
    Команда.Представление = НСтр("ru = 'Ограничение Наименования Контрагента'"); 
    Команда.Идентификатор = "ОграничениеНаименованияКонтрагента";   
    Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();       
    Команда.ПоказыватьОповещение = Истина;
    
        Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина); 
        ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
    
    Возврат ПараметрыРегистрации; 
КонецФункции
Показать


и разместил указанный вами код.
Саму обработку разместил в справочник Контрагенты. Но в режиме предприятия всё по-прежнему вносится латиницей. Почему внешняя обработка не срабатывает, что я делаю не так?
Прикрепленные файлы:
ОграничениеНаименованияКонтрагента.epf
6. GeraltSnow 172 15.04.24 12:37 Сейчас в теме
(5) (4)

Код сам по себе не начнет работать, если не передать в него данные и не обработать результат выполнения.

Можно сделать вот так, тогда при попытке записи контрагента через форму справочника будет происходить отказ записи с уведомлением пользователю:

//Модуль формы справочника Контрагенты
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)

	НедопустимыеСимволы = НайтиНедопустимыеСимволы(Объект.Наименование); //тип Массив
	
	Если НедопустимыеСимволы.Количество() <> 0 Тогда
		Отказ = Истина;  //запись не пройдет
		ВызватьИсключение "Найдены недопустимые символы в наименовании контрагента!" //пользователь увидит это сообщение
	КонецЕсли;

КонецПроцедуры

Функция НайтиНедопустимыеСимволы(СтрокаДляПроверки)
...
КонецФункции
Показать


И ещё важное уточнение - если просто добавить процедуру ПередЗаписью(Отказ, ПараметрыЗаписи) в код модуля формы, то ничего не заработает. Нужно установить её как обработчик соответствующего события формы.
user1671936; user2070470; +2 Ответить
4. user1837694 12.04.24 19:41 Сейчас в теме
(2) Спасибо. Странно, что это до сих пор не реализовано, например, через свойства.
(3) GeraltSnow, данную функцию я пробовал разместить после процедуры ПередЗаписью(Отказ) в на форме элемента и модуле объекта. Но в режиме предприятия всё по-прежнему вносится латиницей. Почему не сработало исключение, что я делаю не так?
7. user2070470 15.04.24 14:13 Сейчас в теме
На локалке код пашет. Почему-то не пашет на рабочей серверной БП Корп, а через внешнюю обработку не получилось. Разве это нельзя как-то задать в меню Свойства: Поле?
8. user2070470 15.04.24 18:22 Сейчас в теме
(6) Т.е., как я понял, мне надо отказаться от использования внешней обработки.
На форме элемента добавил код в Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) и разместил Функцию НайтиНедопустимыеСимволы(СтрокаДляПроверки) Экспорт ПКМ > добавить в расширение &Вместо("НайтиНедопустимыеСимволы")
Или можно обойтись без доработки?
Что тогда обработчик соответствующего события формы?
Прикрепленные файлы:
9. user2070470 16.04.24 12:02 Сейчас в теме
Всё получилось! GeraltSnow, спасибо за рабочий код.
10. user2070470 16.04.24 15:39 Сейчас в теме
А как по условию обратиться в справочнике контрагенты к строке наименования Юр/ФизЛица ?

Пробую в ФормеЭлемента:
Объект.НаименованиеПолное = "";	
Если Объект.НаименованиеПолное = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо Тогда
[условие недопустимых символов физлица]
		Иначе	
[условие недопустимых символов юрлица]
КонецЕсли;

Пишет: Переменная не определена (Перечисления)
11. GeraltSnow 172 16.04.24 18:32 Сейчас в теме
(10) Таким образом значение перечисления можно получить только находясь в контексте сервера. В контексте клиента это делается так:

ЮрФизЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо")
user1837694; +1 Ответить
12. user2070470 17.04.24 07:14 Сейчас в теме
Это может кому-то пригодиться, потому-что должно быть распространённой задачей. Целиком рабочий код на ограничения написания в имени спецсимволов, цифр и латиницы у ЮЛ и на ограничения написания в имени спецсимволов у ФЛ выглядит так:
Если Объект.НаименованиеПолное = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо") Тогда 
	РезультатПроверкиФЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(Объект.Наименование, Ложь, "-");  
	Если Не РезультатПроверкиФЛ Тогда
	Сообщить("В наименовании есть недопустимые символы");
	Отказ = Истина;
	
	КонецЕсли;
Иначе
	РезультатПроверкиЮЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(Объект.Наименование, Ложь, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456­789-");
    Если Не РезультатПроверкиЮЛ Тогда
	Сообщить("В наименовании есть недопустимые символы");
	Отказ = Истина;
	КонецЕсли;
КонецЕсли;
Показать

Не знаю где здесь вписать для ФЛ условие на титульный регистр ТРег()
14. user1880116 17.04.24 08:08 Сейчас в теме
(12)
Это может кому-то пригодиться, потому-что должно быть распространённой задачей. Целиком рабочий код на ограничения написания в имени спецсимволов, цифр и латиницы у ЮЛ и на ограничения написания в имени спецсимволов у ФЛ выглядит так:

Если Объект.НаименованиеПолное = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо") Тогда

Восхитительно.

Всё, как и планировалось. Взаимообучение, перекрестное опыление, инцухт, инцест, деградация и вырождение с щепоткой "нам все должны".

И да, абонементики, абонементики покупаем! Немедленно идите к своему руководителю и скажите ему, что он должен вам купить!
13. user2070470 17.04.24 07:52 Сейчас в теме
Предыдущий код оказался нерабочим (((
15. user1880116 17.04.24 08:14 Сейчас в теме
(13) Может быть стоило его проверить, перед тем как гордо писать про "Целиком рабочий код"?
16. user2070470 17.04.24 08:25 Сейчас в теме
(14) Если я пишу:
ЮрФизЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо")

то Переменная не определена (ЮрФизЛицо)
Я должен как-то задать условие для строки Объект.НаименованиеПолное
Как это можно сделать?

Абонементку купил за свои. Но странно, что для такой, казалось бы распространённой задачи, решений нет.
17. user2070470 17.04.24 08:27 Сейчас в теме
(15) Сработала строка без условий, обрадовался раньше времени. Извините.
18. user2070470 17.04.24 09:42 Сейчас в теме
Есть:
1. ФЛ и ЮЛ как
[1C]ЮрФизЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо")[/1C]

Иначе
[1C]ЮрФизЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо")[/1C]

2.Строка
[1C]Объект.НаименованиеПолное[/1C]

Как в зависимости от того, ФЛ это или ЮЛ, внести в строку
3. соответствующие результаты проверки (думаю, через условный оператор Если -Тогда - Иначе)
для ФЛ:
[1C]РезультатПроверкиФЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(ЭтотОбъект.Наименование, Ложь, "-");[/1C]

для ЮЛ:
[1C]РезультатПроверкиЮЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(ЭтотОбъект.Наименование, Ложь, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-");[/1C]

Для меня основной вопрос, как соотнести строку к то ФЛ то ЮЛ ?
Извините, у меня проблемы с логикой.
19. user2070470 17.04.24 14:14 Сейчас в теме
С учетом всех замечаний сделал такой вот код в виде функции в расширении
&НаСервере
&Вместо("ПроверкаНаименования")
Функция ДК1_ПроверкаНаименования()
с функции на ФормеЭлемента:
&НаСервере
&Вместо("ПроверкаНаименования")
Функция ДК1_ПроверкаНаименования()
    РезультатПроверки = Ложь;
    
    Если Объект.ЮридическоеФизическоеЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо") Тогда
        РезультатПроверкиФЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(Объект.Наименование, Ложь, "-");  
            Если Не РезультатПроверкиФЛ Тогда
            Сообщить("В наименовании ФЛ недопустимые символы");
            Отказ = Истина;
            КонецЕсли;

    Иначе 
        РезультатПроверкиЮЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(Объект.Наименование, Ложь, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456­789-");
            Если Не РезультатПроверкиЮЛ Тогда
            Сообщить("В наименовании ЮЛ недопустимые символы");
            Отказ = Истина;
            КонецЕсли;
   
  Возврат РезультатПроверки;

    Результат = ПродолжитьВызов();
    Возврат Результат;
КонецФункции;
Показать


В расширении в
&НаСервере
Процедура ДК1_ПередЗаписьюНаСервереПеред(Отказ, ТекущийОбъект, ПараметрыЗаписи)
добавил
Результат =  ПроверкаНаименования()


Кажется, что с логикой разобрался, но код также не рабочий.
20. user2070470 17.04.24 18:08 Сейчас в теме
Странно, что цикл отдельно работает:
РезультатПроверкиФЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(Объект.Наименование, Ложь, "-");  
            Если Не РезультатПроверкиФЛ Тогда
            Сообщить("В наименовании ФЛ недопустимые символы");
            Отказ = Истина;
            КонецЕсли;

А с условным оператором Если нет.

Можно как-то за деньги решить этот вопрос?
21. GeraltSnow 172 17.04.24 19:28 Сейчас в теме
РезультатПроверки = Ложь
РезультатПроверкиФЛ = ...
РезультатПроверкиЮЛ = ...
Возврат РезультатПроверки

И какой в этом смысл?

И плюс к этому в теле функции значение переменной отказ устанавливается в ложь. Это тоже бессмыслица, поскольку она находится вне области видимости функции.
user2070470; +1 Ответить
22. user2070470 18.04.24 10:46 Сейчас в теме
Наконец-то! Вот рабочий код в процедуре ПередЗаписью:

Если Объект.ЮридическоеФизическоеЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо") Тогда
		РезультатПроверкиФЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(Объект.Наименование, Ложь);  
    		Если Не РезультатПроверкиФЛ Тогда
    		Сообщить("В наименовании ФЛ недопустимые символы");
    		Отказ = Истина;
		КонецЕсли;                                                                                      
КонецЕсли;
		
Если Объект.ЮридическоеФизическоеЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо") Тогда
		РезультатПроверкиЮЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоЛатиницаВСтроке(Объект.Наименование, Ложь, "абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШ­ЩЪЫЬЭЮЯ");
			Если Не РезультатПроверкиЮЛ Тогда
		  	Сообщить("В наименовании ЮЛ недопустимые символы");
			Отказ = Истина;
			КонецЕсли; 
КонецЕсли;
Показать


Но у него 2 недостатка:
- Нет запрета на спецсимволы;
- Не задан титульный регистр у физлиц:
Результат = ТРег()


Это поправимо?
23. user2070470 18.04.24 16:44 Сейчас в теме
2 недостатка исправлены:
- Запрет на спецсимволы сделал без массива, перечислением:
Если Найти (Объект.Наименование, "!") >0 ИЛИ Найти (Объект.Наименование, "@") >0 ИЛИ Найти (Объект.Наименование, "#") >0 ИЛИ Найти (Объект.Наименование, "$") >0 ИЛИ Найти (Объект.Наименование, "%") >0 ИЛИ Найти (Объект.Наименование, "^") >0 ИЛИ Найти (Объект.Наименование, "*") >0 ИЛИ Найти (Объект.Наименование, "_") >0 ИЛИ Найти (Объект.Наименование, "=") >0 ИЛИ Найти (Объект.Наименование, "{") >0 ИЛИ Найти (Объект.Наименование, "}") >0 ИЛИ Найти (Объект.Наименование, "[") >0 ИЛИ Найти (Объект.Наименование, "]") >0 ИЛИ Найти (Объект.Наименование, ";") >0 ИЛИ Найти (Объект.Наименование, "'") >0 ИЛИ Найти (Объект.Наименование, "\") >0 ИЛИ Найти (Объект.Наименование, "<") >0 ИЛИ Найти (Объект.Наименование, ">") >0 ИЛИ Найти (Объект.Наименование, ",") >0 ИЛИ Найти (Объект.Наименование, "?") >0 Тогда
			Сообщить("В наименовании ФЛ недопустимые символы");
    		Отказ = Истина;
		КонецЕсли; 

- Задан титульный регистр у физлиц:
Объект.Наименование = ТРег(Объект.Наименование);
Объект.НаименованиеПолное = ТРег(Объект.НаименованиеПолное);


Хочу особо поблагодарить GeraltSnow за участие и подсказки.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот