Проверка ПередЗаписью

1. 1Slash1 2 01.12.16 15:11 Сейчас в теме
Помогите!!!

Если есть контрагент с наименованием "А", при попытке создать еще одного контрагента с таким же наименованием "А", система должна выдать предупреждение и не сохранить его.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ditp 92 01.12.16 15:17 Сейчас в теме
упр формы или обычные?
3. 1Slash1 2 01.12.16 15:20 Сейчас в теме
4. v3rter 01.12.16 15:29 Сейчас в теме
Я бы добавил ещё отказ при совпадениии ИНН/КПП и предупреждение на совпадение ИНН без КПП.
5. SkrAn 1 01.12.16 15:31 Сейчас в теме
В модуль объекта, передзаписью():

Если этоновый() и ЗначениеЗаполнено(справочники.Контрагенты.НайтиПоНаименованию(Наименование)) Тогда
	//СообщениеПользователю	
         Отказ=истина;
КонецЕсли;

6. 1Slash1 2 01.12.16 15:31 Сейчас в теме
Можете показать примерно как это сделать в коде..
7. ditp 92 01.12.16 15:38 Сейчас в теме
Так
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	Запрос	= Новый Запрос("ВЫБРАТЬ
	      	               |	Контрагенты.Ссылка
	      	               |ИЗ
	      	               |	Справочник.Контрагенты КАК Контрагенты
	      	               |ГДЕ
	      	               |	Контрагенты.Наименование = &Наименование
	      	               |	И Контрагенты.Ссылка <> &Ссылка");
	Запрос.УстановитьПараметр("Ссылка"		, ТекущийОбъект.ССылка);
	Запрос.УстановитьПараметр("Наименование", ТекущийОбъект.Наименование);
	Отказ	= НЕ Запрос.Выполнить().Пустой();
КонецПроцедуры
Показать

Или так
&НаСервереБезКонтекста
Процедура ПередЗаписьюНаСервере1(Отказ, Ссылка, Наименование)
	Запрос	= Новый Запрос("ВЫБРАТЬ
	      	               |	Контрагенты.Ссылка
	      	               |ИЗ
	      	               |	Справочник.Контрагенты КАК Контрагенты
	      	               |ГДЕ
	      	               |	Контрагенты.Наименование = &Наименование
	      	               |	И Контрагенты.Ссылка <> &Ссылка");
	Запрос.УстановитьПараметр("Ссылка"		, ССылка);
	Запрос.УстановитьПараметр("Наименование", Наименование);
	Отказ	= НЕ Запрос.Выполнить().Пустой();
КонецПроцедуры

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
	ПередЗаписьюНаСервере1(Отказ, Объект.Ссылка, Объект.Наименование);
	Если Отказ Тогда
		Сообщить("Упс");
	КонецЕсли;
КонецПроцедуры
Показать
8. v3rter 01.12.16 15:39 Сейчас в теме
Здесь http://infostart.ru/public/153748/ аналогичное действие, но для документа.
9. 1Slash1 2 01.12.16 15:42 Сейчас в теме
Спасибо , сейчас проверим
10. spacecraft 01.12.16 15:43 Сейчас в теме
вообще-то для этого есть специальный обработчик модуля объекта ОбработкаПроверкиЗаполнения, где и следует проверять.
сам код проверки уже привели выше. Только еще дополнить сообщением пользователю, что не правильно.
11. 1Slash1 2 01.12.16 15:52 Сейчас в теме
Это все нужно прописывать в модуле обьекта , так ?
Извините что спращиваю такие веши, пока не так силен в 1С.
12. spacecraft 01.12.16 16:14 Сейчас в теме
(11) в данном случае самое подходящее место модуль объекта справочника контрагента:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	Если ЭтоНовый() И ЗначениеЗаполнено(Справочники.Контрагенты.НайтиПоНаименованию(Наименование)) Тогда
		Отказ = Истина;
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Такой Контрагент уже есть в базе";
		Сообщение.Поле = "Объект.Наименование"; 
		Сообщение.Сообщить();
	КонецЕсли;
КонецПроцедуры
Показать

Как проверять на наличие в базе такого же контрагента на выбор. Можно и через запрос, особенно, если нужно проверить не только наименование, но и ИНН:
Функция ЕстьВБазеКонтрагент()
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	1 КАК Поле1
		|ИЗ
		|	Справочник.Контрагенты КАК Контрагенты
		|ГДЕ
		|	(Контрагенты.Наименование = &Наименование
		|			ИЛИ Контрагенты.ИНН = &ИНН)";
	
	Запрос.УстановитьПараметр("ИНН", ИНН);
	Запрос.УстановитьПараметр("Наименование", Наименование);
	РезультатЗапроса = Запрос.Выполнить();
	Если РезультатЗапроса.Пустой() Тогда
		Возврат Ложь;
	КонецЕсли;
	Возврат Истина;
КонецФункции

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	Если ЭтоНовый() И ЕстьВБазеКонтрагент() Тогда
		Отказ = Истина;
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Такой Контрагент уже есть в базе";
		Сообщение.Поле = "Объект.Наименование"; 
		Сообщение.Сообщить();
	КонецЕсли;
КонецПроцедуры
Показать
13. 1Slash1 2 01.12.16 16:21 Сейчас в теме
А как можно проверить в документе это?
Например, Документ. ДоговорСКонтрагентом.Как тогда в этом случае?
14. spacecraft 01.12.16 16:50 Сейчас в теме
(13) с документом сложнее. Если документ просто записывается без проведения, то обработчик ОбработкаПроверкиЗаполнения может не вызываться.
Для этого случая есть в модуле формы документа обработчик ПередЗаписьюНаСервере, или в модуле объекта документа обработчик ПередЗаписью. Они серверные, соответственно все проверки можно сделать в них.
Хотя я и не вижу смысла там делать проверки. Наименования в документе нет, код генерируется (обычно) при записи. Что проверять на дубликат?
Обычно проверка нужна при проведении. И такую проверку можно делать в ОбработкаПроверкиЗаполнения.
kabantus; +1 Ответить
15. 1Slash1 2 01.12.16 16:55 Сейчас в теме
Спасибо всем все полуилось.
16. 1Slash1 2 01.12.16 16:58 Сейчас в теме
Процедура ПередЗаписью(Отказ)

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



Я так сделал , у меня все работает.
19. SkrAn 1 01.12.16 22:07 Сейчас в теме
(16) Только учти, что твой код достоверно работает только вслучае новых.)) найтипонаименованию возвращает первый найденный элемент, то есть он может вернуть тебе ссылку на твой справочник (в случае перезаписи) и пройти твою проверку не показав что у тебя их там уже 10к есть таких. И еще учти, что если у тебя уже есть 2 справочника с одинаковым наименованием, то вероятно ты даже пометить на удаление не сможешь. поэтому воткни проверку на новый документ, или делай в запросе и анализируй режим записи.
17. spacecraft 01.12.16 17:09 Сейчас в теме
жесть.
Обработчик модуля объекта? Иначе не будет работать на УФ.
совсем жесть.
Осталось только понять, зачем мы все тут распинались?
18. v3rter 01.12.16 18:00 Сейчас в теме
Я бы таки добавил ещё проверку по ИНН/КПП, иначе в базе могут завестись разные Контрагент, ООО Контрагент, ООО "Контрагент", ООО<два пробела>Контрагент и т.п.

И в организации обязательно должно быть как минимум 1,5 ответственных за справочник контрагентов (и номенклатуры тоже) - основной и заместитель (или админ).
Оставьте свое сообщение

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