Как ограничить наименование контрагента
По теме из базы знаний
- Обновление реквизитов контрагентов из ЕГРЮЛ по ИНН или наименованию для БП 2.0
- Решение разработчика в зависимости от опыта работы. Как ограничить отображаемый пользователю список и ничего не потерять
- Интеграции с сервером SQL. Быстро и просто
- Встраивание форм 1С на страницы сайта
- Как перенести информацию из текстового поля в поля ссылочного типа
Найденные решения
Функция НайтиНедопустимыеСимволы(СтрокаДляПроверки) Экспорт
НедопустимыеСимволы = Новый Массив;
ДиапазоныДопустимыхСимволов = Новый Массив;
ДиапазоныДопустимыхСимволов.Добавить(Новый Структура("Мин, Макс", 1040, 1103)); // Кириллица
ДиапазоныДопустимыхСимволов.Добавить(Новый Структура("Мин, Макс", 1025, 1025)); // Ё
ДиапазоныДопустимыхСимволов.Добавить(Новый Структура("Мин, Макс", 1105, 1105)); // ё
ДиапазоныДопустимыхСимволов.Добавить(Новый Структура("Мин, Макс", 32, 32)); // пробел
ДлинаСтроки = СтрДлина(СтрокаДляПроверки);
Для Позиция = 1 По ДлинаСтроки Цикл
СимволДляПроверки = Сред(СтрокаДляПроверки, Позиция, 1);
КодСимвола = КодСимвола(СимволДляПроверки);
ЭтоДопустимыйСимвол = Ложь;
Для Каждого Диапазон Из ДиапазоныДопустимыхСимволов Цикл
Если КодСимвола >= Диапазон.Мин И КодСимвола <= Диапазон.Макс Тогда
ЭтоДопустимыйСимвол = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ ЭтоДопустимыйСимвол Тогда
НедопустимыеСимволы.Добавить(Новый Структура("Позиция, Символ", Позиция, СимволДляПроверки));
КонецЕсли;
КонецЦикла;
Возврат НедопустимыеСимволы;
КонецФункции
Показать
(5) (4)
Код сам по себе не начнет работать, если не передать в него данные и не обработать результат выполнения.
Можно сделать вот так, тогда при попытке записи контрагента через форму справочника будет происходить отказ записи с уведомлением пользователю:
И ещё важное уточнение - если просто добавить процедуру ПередЗаписью(Отказ, ПараметрыЗаписи) в код модуля формы, то ничего не заработает. Нужно установить её как обработчик соответствующего события формы.
Код сам по себе не начнет работать, если не передать в него данные и не обработать результат выполнения.
Можно сделать вот так, тогда при попытке записи контрагента через форму справочника будет происходить отказ записи с уведомлением пользователю:
//Модуль формы справочника Контрагенты
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
НедопустимыеСимволы = НайтиНедопустимыеСимволы(Объект.Наименование); //тип Массив
Если НедопустимыеСимволы.Количество() <> 0 Тогда
Отказ = Истина; //запись не пройдет
ВызватьИсключение "Найдены недопустимые символы в наименовании контрагента!" //пользователь увидит это сообщение
КонецЕсли;
КонецПроцедуры
Функция НайтиНедопустимыеСимволы(СтрокаДляПроверки)
...
КонецФункции
ПоказатьИ ещё важное уточнение - если просто добавить процедуру ПередЗаписью(Отказ, ПараметрыЗаписи) в код модуля формы, то ничего не заработает. Нужно установить её как обработчик соответствующего события формы.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Функция НайтиНедопустимыеСимволы(СтрокаДляПроверки) Экспорт
НедопустимыеСимволы = Новый Массив;
ДиапазоныДопустимыхСимволов = Новый Массив;
ДиапазоныДопустимыхСимволов.Добавить(Новый Структура("Мин, Макс", 1040, 1103)); // Кириллица
ДиапазоныДопустимыхСимволов.Добавить(Новый Структура("Мин, Макс", 1025, 1025)); // Ё
ДиапазоныДопустимыхСимволов.Добавить(Новый Структура("Мин, Макс", 1105, 1105)); // ё
ДиапазоныДопустимыхСимволов.Добавить(Новый Структура("Мин, Макс", 32, 32)); // пробел
ДлинаСтроки = СтрДлина(СтрокаДляПроверки);
Для Позиция = 1 По ДлинаСтроки Цикл
СимволДляПроверки = Сред(СтрокаДляПроверки, Позиция, 1);
КодСимвола = КодСимвола(СимволДляПроверки);
ЭтоДопустимыйСимвол = Ложь;
Для Каждого Диапазон Из ДиапазоныДопустимыхСимволов Цикл
Если КодСимвола >= Диапазон.Мин И КодСимвола <= Диапазон.Макс Тогда
ЭтоДопустимыйСимвол = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ ЭтоДопустимыйСимвол Тогда
НедопустимыеСимволы.Добавить(Новый Структура("Позиция, Символ", Позиция, СимволДляПроверки));
КонецЕсли;
КонецЦикла;
Возврат НедопустимыеСимволы;
КонецФункции
Показать
(3) Для рабочей базы создал внешнюю обработку, в её модуле объекта разместил по шаблону с ИТС СведенияОВнешнейОбработке
и разместил указанный вами код.
Саму обработку разместил в справочник Контрагенты. Но в режиме предприятия всё по-прежнему вносится латиницей. Почему внешняя обработка не срабатывает, что я делаю не так?
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
ПараметрыРегистрации.Версия = "1.0";
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = 'Ограничение Наименования Контрагента'");
Команда.Идентификатор = "ОграничениеНаименованияКонтрагента";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Команда.ПоказыватьОповещение = Истина;
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина);
ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
Возврат ПараметрыРегистрации;
КонецФункции
Показатьи разместил указанный вами код.
Саму обработку разместил в справочник Контрагенты. Но в режиме предприятия всё по-прежнему вносится латиницей. Почему внешняя обработка не срабатывает, что я делаю не так?
Прикрепленные файлы:
ОграничениеНаименованияКонтрагента.epf
(5) (4)
Код сам по себе не начнет работать, если не передать в него данные и не обработать результат выполнения.
Можно сделать вот так, тогда при попытке записи контрагента через форму справочника будет происходить отказ записи с уведомлением пользователю:
И ещё важное уточнение - если просто добавить процедуру ПередЗаписью(Отказ, ПараметрыЗаписи) в код модуля формы, то ничего не заработает. Нужно установить её как обработчик соответствующего события формы.
Код сам по себе не начнет работать, если не передать в него данные и не обработать результат выполнения.
Можно сделать вот так, тогда при попытке записи контрагента через форму справочника будет происходить отказ записи с уведомлением пользователю:
//Модуль формы справочника Контрагенты
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
НедопустимыеСимволы = НайтиНедопустимыеСимволы(Объект.Наименование); //тип Массив
Если НедопустимыеСимволы.Количество() <> 0 Тогда
Отказ = Истина; //запись не пройдет
ВызватьИсключение "Найдены недопустимые символы в наименовании контрагента!" //пользователь увидит это сообщение
КонецЕсли;
КонецПроцедуры
Функция НайтиНедопустимыеСимволы(СтрокаДляПроверки)
...
КонецФункции
ПоказатьИ ещё важное уточнение - если просто добавить процедуру ПередЗаписью(Отказ, ПараметрыЗаписи) в код модуля формы, то ничего не заработает. Нужно установить её как обработчик соответствующего события формы.
(2) Спасибо. Странно, что это до сих пор не реализовано, например, через свойства.
(3) GeraltSnow, данную функцию я пробовал разместить после процедуры ПередЗаписью(Отказ) в на форме элемента и модуле объекта. Но в режиме предприятия всё по-прежнему вносится латиницей. Почему не сработало исключение, что я делаю не так?
(3) GeraltSnow, данную функцию я пробовал разместить после процедуры ПередЗаписью(Отказ) в на форме элемента и модуле объекта. Но в режиме предприятия всё по-прежнему вносится латиницей. Почему не сработало исключение, что я делаю не так?
(6) Т.е., как я понял, мне надо отказаться от использования внешней обработки.
На форме элемента добавил код в Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) и разместил Функцию НайтиНедопустимыеСимволы(СтрокаДляПроверки) Экспорт ПКМ > добавить в расширение &Вместо("НайтиНедопустимыеСимволы")
Или можно обойтись без доработки?
Что тогда обработчик соответствующего события формы?
На форме элемента добавил код в Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) и разместил Функцию НайтиНедопустимыеСимволы(СтрокаДляПроверки) Экспорт ПКМ > добавить в расширение &Вместо("НайтиНедопустимыеСимволы")
Или можно обойтись без доработки?
Что тогда обработчик соответствующего события формы?
Прикрепленные файлы:
А как по условию обратиться в справочнике контрагенты к строке наименования Юр/ФизЛица ?
Пробую в ФормеЭлемента:
Пишет: Переменная не определена (Перечисления)
Пробую в ФормеЭлемента:
Объект.НаименованиеПолное = "";
Если Объект.НаименованиеПолное = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо Тогда
[условие недопустимых символов физлица]
Иначе
[условие недопустимых символов юрлица]
КонецЕсли;
Пишет: Переменная не определена (Перечисления)
Это может кому-то пригодиться, потому-что должно быть распространённой задачей. Целиком рабочий код на ограничения написания в имени спецсимволов, цифр и латиницы у ЮЛ и на ограничения написания в имени спецсимволов у ФЛ выглядит так:
Не знаю где здесь вписать для ФЛ условие на титульный регистр ТРег()
Если Объект.НаименованиеПолное = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо") Тогда
РезультатПроверкиФЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(Объект.Наименование, Ложь, "-");
Если Не РезультатПроверкиФЛ Тогда
Сообщить("В наименовании есть недопустимые символы");
Отказ = Истина;
КонецЕсли;
Иначе
РезультатПроверкиЮЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(Объект.Наименование, Ложь, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456 789-");
Если Не РезультатПроверкиЮЛ Тогда
Сообщить("В наименовании есть недопустимые символы");
Отказ = Истина;
КонецЕсли;
КонецЕсли;
ПоказатьНе знаю где здесь вписать для ФЛ условие на титульный регистр ТРег()
(12)
Восхитительно.
Всё, как и планировалось. Взаимообучение, перекрестное опыление, инцухт, инцест, деградация и вырождение с щепоткой "нам все должны".
И да, абонементики, абонементики покупаем! Немедленно идите к своему руководителю и скажите ему, что он должен вам купить!
Это может кому-то пригодиться, потому-что должно быть распространённой задачей. Целиком рабочий код на ограничения написания в имени спецсимволов, цифр и латиницы у ЮЛ и на ограничения написания в имени спецсимволов у ФЛ выглядит так:
Если Объект.НаименованиеПолное = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо") Тогда
Восхитительно.
Всё, как и планировалось. Взаимообучение, перекрестное опыление, инцухт, инцест, деградация и вырождение с щепоткой "нам все должны".
И да, абонементики, абонементики покупаем! Немедленно идите к своему руководителю и скажите ему, что он должен вам купить!
(14) Если я пишу:
то Переменная не определена (ЮрФизЛицо)
Я должен как-то задать условие для строки Объект.НаименованиеПолное
Как это можно сделать?
Абонементку купил за свои. Но странно, что для такой, казалось бы распространённой задачи, решений нет.
ЮрФизЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо")
то Переменная не определена (ЮрФизЛицо)
Я должен как-то задать условие для строки Объект.НаименованиеПолное
Как это можно сделать?
Абонементку купил за свои. Но странно, что для такой, казалось бы распространённой задачи, решений нет.
Есть:
1. ФЛ и ЮЛ как
Иначе
2.Строка
Как в зависимости от того, ФЛ это или ЮЛ, внести в строку
3. соответствующие результаты проверки (думаю, через условный оператор Если -Тогда - Иначе)
для ФЛ:
для ЮЛ:
Для меня основной вопрос, как соотнести строку к то ФЛ то ЮЛ ?
Извините, у меня проблемы с логикой.
1. ФЛ и ЮЛ как
[1C]ЮрФизЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо")[/1C]
Иначе
[1C]ЮрФизЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо")[/1C]
2.Строка
[1C]Объект.НаименованиеПолное[/1C]
Как в зависимости от того, ФЛ это или ЮЛ, внести в строку
3. соответствующие результаты проверки (думаю, через условный оператор Если -Тогда - Иначе)
для ФЛ:
[1C]РезультатПроверкиФЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(ЭтотОбъект.Наименование, Ложь, "-");[/1C]
для ЮЛ:
[1C]РезультатПроверкиЮЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(ЭтотОбъект.Наименование, Ложь, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-");[/1C]
Для меня основной вопрос, как соотнести строку к то ФЛ то ЮЛ ?
Извините, у меня проблемы с логикой.
С учетом всех замечаний сделал такой вот код в виде функции в расширении
&НаСервере
&Вместо("ПроверкаНаименования")
Функция ДК1_ПроверкаНаименования()
с функции на ФормеЭлемента:
В расширении в
&НаСервере
Процедура ДК1_ПередЗаписьюНаСервереПеред(Отказ, ТекущийОбъект, ПараметрыЗаписи)
добавил
Кажется, что с логикой разобрался, но код также не рабочий.
&НаСервере
&Вместо("ПроверкаНаименования")
Функция ДК1_ПроверкаНаименования()
с функции на ФормеЭлемента:
&НаСервере
&Вместо("ПроверкаНаименования")
Функция ДК1_ПроверкаНаименования()
РезультатПроверки = Ложь;
Если Объект.ЮридическоеФизическоеЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо") Тогда
РезультатПроверкиФЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(Объект.Наименование, Ложь, "-");
Если Не РезультатПроверкиФЛ Тогда
Сообщить("В наименовании ФЛ недопустимые символы");
Отказ = Истина;
КонецЕсли;
Иначе
РезультатПроверкиЮЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(Объект.Наименование, Ложь, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456 789-");
Если Не РезультатПроверкиЮЛ Тогда
Сообщить("В наименовании ЮЛ недопустимые символы");
Отказ = Истина;
КонецЕсли;
Возврат РезультатПроверки;
Результат = ПродолжитьВызов();
Возврат Результат;
КонецФункции;
ПоказатьВ расширении в
&НаСервере
Процедура ДК1_ПередЗаписьюНаСервереПеред(Отказ, ТекущийОбъект, ПараметрыЗаписи)
добавил
Результат = ПроверкаНаименования()
Кажется, что с логикой разобрался, но код также не рабочий.
Странно, что цикл отдельно работает:
А с условным оператором Если нет.
Можно как-то за деньги решить этот вопрос?
РезультатПроверкиФЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(Объект.Наименование, Ложь, "-");
Если Не РезультатПроверкиФЛ Тогда
Сообщить("В наименовании ФЛ недопустимые символы");
Отказ = Истина;
КонецЕсли;
А с условным оператором Если нет.
Можно как-то за деньги решить этот вопрос?
РезультатПроверки = Ложь
РезультатПроверкиФЛ = ...
РезультатПроверкиЮЛ = ...
Возврат РезультатПроверки
И какой в этом смысл?
И плюс к этому в теле функции значение переменной отказ устанавливается в ложь. Это тоже бессмыслица, поскольку она находится вне области видимости функции.
РезультатПроверкиФЛ = ...
РезультатПроверкиЮЛ = ...
Возврат РезультатПроверки
И какой в этом смысл?
И плюс к этому в теле функции значение переменной отказ устанавливается в ложь. Это тоже бессмыслица, поскольку она находится вне области видимости функции.
Наконец-то! Вот рабочий код в процедуре ПередЗаписью:
Но у него 2 недостатка:
- Нет запрета на спецсимволы;
- Не задан титульный регистр у физлиц:
Это поправимо?
Если Объект.ЮридическоеФизическоеЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо") Тогда
РезультатПроверкиФЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(Объект.Наименование, Ложь);
Если Не РезультатПроверкиФЛ Тогда
Сообщить("В наименовании ФЛ недопустимые символы");
Отказ = Истина;
КонецЕсли;
КонецЕсли;
Если Объект.ЮридическоеФизическоеЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо") Тогда
РезультатПроверкиЮЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоЛатиницаВСтроке(Объект.Наименование, Ложь, "абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШ ЩЪЫЬЭЮЯ");
Если Не РезультатПроверкиЮЛ Тогда
Сообщить("В наименовании ЮЛ недопустимые символы");
Отказ = Истина;
КонецЕсли;
КонецЕсли;
ПоказатьНо у него 2 недостатка:
- Нет запрета на спецсимволы;
- Не задан титульный регистр у физлиц:
Результат = ТРег()
Это поправимо?
2 недостатка исправлены:
- Запрет на спецсимволы сделал без массива, перечислением:
- Задан титульный регистр у физлиц:
Хочу особо поблагодарить GeraltSnow за участие и подсказки.
- Запрет на спецсимволы сделал без массива, перечислением:
Если Найти (Объект.Наименование, "!") >0 ИЛИ Найти (Объект.Наименование, "@") >0 ИЛИ Найти (Объект.Наименование, "#") >0 ИЛИ Найти (Объект.Наименование, "$") >0 ИЛИ Найти (Объект.Наименование, "%") >0 ИЛИ Найти (Объект.Наименование, "^") >0 ИЛИ Найти (Объект.Наименование, "*") >0 ИЛИ Найти (Объект.Наименование, "_") >0 ИЛИ Найти (Объект.Наименование, "=") >0 ИЛИ Найти (Объект.Наименование, "{") >0 ИЛИ Найти (Объект.Наименование, "}") >0 ИЛИ Найти (Объект.Наименование, "[") >0 ИЛИ Найти (Объект.Наименование, "]") >0 ИЛИ Найти (Объект.Наименование, ";") >0 ИЛИ Найти (Объект.Наименование, "'") >0 ИЛИ Найти (Объект.Наименование, "\") >0 ИЛИ Найти (Объект.Наименование, "<") >0 ИЛИ Найти (Объект.Наименование, ">") >0 ИЛИ Найти (Объект.Наименование, ",") >0 ИЛИ Найти (Объект.Наименование, "?") >0 Тогда
Сообщить("В наименовании ФЛ недопустимые символы");
Отказ = Истина;
КонецЕсли;
- Задан титульный регистр у физлиц:
Объект.Наименование = ТРег(Объект.Наименование);
Объект.НаименованиеПолное = ТРег(Объект.НаименованиеПолное);
Хочу особо поблагодарить GeraltSnow за участие и подсказки.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот