По теме из базы знаний
- Алгоритм проверки уникальности и корректности ИНН, КПП при записи контрагента для БП 1.6 и 2.0 через подписку на события
- Проверка дублирования элементов справочников
- Проверка заполненности реквизитов через подписку на событие
- Проверка орфографии средствами Yandex Speller
- Задачи по доработке типовых решений. ЗУП 3.1. Доработка выплаты аванса фиксированной суммой, проверка на отработанное время. Вывод предупреждения как в ЗУП 2.5
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Так
Или так
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Запрос = Новый Запрос("ВЫБРАТЬ
| Контрагенты.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Наименование = &Наименование
| И Контрагенты.Ссылка <> &Ссылка");
Запрос.УстановитьПараметр("Ссылка" , ТекущийОбъект.ССылка);
Запрос.УстановитьПараметр("Наименование", ТекущийОбъект.Наименование);
Отказ = НЕ Запрос.Выполнить().Пустой();
КонецПроцедуры
ПоказатьИли так
&НаСервереБезКонтекста
Процедура ПередЗаписьюНаСервере1(Отказ, Ссылка, Наименование)
Запрос = Новый Запрос("ВЫБРАТЬ
| Контрагенты.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Наименование = &Наименование
| И Контрагенты.Ссылка <> &Ссылка");
Запрос.УстановитьПараметр("Ссылка" , ССылка);
Запрос.УстановитьПараметр("Наименование", Наименование);
Отказ = НЕ Запрос.Выполнить().Пустой();
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ПередЗаписьюНаСервере1(Отказ, Объект.Ссылка, Объект.Наименование);
Если Отказ Тогда
Сообщить("Упс");
КонецЕсли;
КонецПроцедуры
Показать
вообще-то для этого есть специальный обработчик модуля объекта ОбработкаПроверкиЗаполнения, где и следует проверять.
сам код проверки уже привели выше. Только еще дополнить сообщением пользователю, что не правильно.
сам код проверки уже привели выше. Только еще дополнить сообщением пользователю, что не правильно.
(11) в данном случае самое подходящее место модуль объекта справочника контрагента:
Как проверять на наличие в базе такого же контрагента на выбор. Можно и через запрос, особенно, если нужно проверить не только наименование, но и ИНН:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ЭтоНовый() И ЗначениеЗаполнено(Справочники.Контрагенты.НайтиПоНаименованию(Наименование)) Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Такой Контрагент уже есть в базе";
Сообщение.Поле = "Объект.Наименование";
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры
ПоказатьКак проверять на наличие в базе такого же контрагента на выбор. Можно и через запрос, особенно, если нужно проверить не только наименование, но и ИНН:
Функция ЕстьВБазеКонтрагент()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| 1 КАК Поле1
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| (Контрагенты.Наименование = &Наименование
| ИЛИ Контрагенты.ИНН = &ИНН)";
Запрос.УстановитьПараметр("ИНН", ИНН);
Запрос.УстановитьПараметр("Наименование", Наименование);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ЭтоНовый() И ЕстьВБазеКонтрагент() Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Такой Контрагент уже есть в базе";
Сообщение.Поле = "Объект.Наименование";
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры
Показать
(13) с документом сложнее. Если документ просто записывается без проведения, то обработчик ОбработкаПроверкиЗаполнения может не вызываться.
Для этого случая есть в модуле формы документа обработчик ПередЗаписьюНаСервере, или в модуле объекта документа обработчик ПередЗаписью. Они серверные, соответственно все проверки можно сделать в них.
Хотя я и не вижу смысла там делать проверки. Наименования в документе нет, код генерируется (обычно) при записи. Что проверять на дубликат?
Обычно проверка нужна при проведении. И такую проверку можно делать в ОбработкаПроверкиЗаполнения.
Для этого случая есть в модуле формы документа обработчик ПередЗаписьюНаСервере, или в модуле объекта документа обработчик ПередЗаписью. Они серверные, соответственно все проверки можно сделать в них.
Хотя я и не вижу смысла там делать проверки. Наименования в документе нет, код генерируется (обычно) при записи. Что проверять на дубликат?
Обычно проверка нужна при проведении. И такую проверку можно делать в ОбработкаПроверкиЗаполнения.
Процедура ПередЗаписью(Отказ)
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию(Контрагент) ;
Если НайденныйКонтрагент <> Ссылка И НайденныйКонтрагент <> Справочники.Контрагенты.ПустаяСсылка() Тогда
Предупреждение("В базе есть такое Наименование");
Отказ = Истина
КонецЕсли;
КонецПроцедуры
Я так сделал , у меня все работает.
(16) Только учти, что твой код достоверно работает только вслучае новых.)) найтипонаименованию возвращает первый найденный элемент, то есть он может вернуть тебе ссылку на твой справочник (в случае перезаписи) и пройти твою проверку не показав что у тебя их там уже 10к есть таких. И еще учти, что если у тебя уже есть 2 справочника с одинаковым наименованием, то вероятно ты даже пометить на удаление не сможешь. поэтому воткни проверку на новый документ, или делай в запросе и анализируй режим записи.
Я бы таки добавил ещё проверку по ИНН/КПП, иначе в базе могут завестись разные Контрагент, ООО Контрагент, ООО "Контрагент", ООО<два пробела>Контрагент и т.п.
И в организации обязательно должно быть как минимум 1,5 ответственных за справочник контрагентов (и номенклатуры тоже) - основной и заместитель (или админ).
И в организации обязательно должно быть как минимум 1,5 ответственных за справочник контрагентов (и номенклатуры тоже) - основной и заместитель (или админ).
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот