1. Medveedka 11.11.19 11:22 Сейчас в теме

Проверка контрагентов по ИНН не проходит, по наименованию проходит (должен и то и то)

Привет всем)
попросили меня бухи дописать одну простую вещь: чтоб когда они создавали контрагентов, была проверка по наименованию и инн+кпп на дубль.
Вроде и просто а уже мучаюсь хз сколько.
Сделала так:

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

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

Показать


Но! Если одинаковое наименование записывать программа отказывается, а если одинкаовые инн и кпп, то проверка как будто не делается вообще.

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

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

	//Если ЭтоНовый() И ЗначениеЗаполнено (ИНН) И ЕстьВБазеКонтрагент(ИНН, КПП) И ЕстьВБазеКонтрагентНаим(Наименование) Тогда
	//Если ЭтоНовый() И ЕстьВБазеКонтрагент(СокрЛП(ИНН),СокрЛП(КПП),СокрЛП(Наименование)) Тогда
	//Если ЭтоНовый() И ЗначениеЗаполнено (ИНН) И (ЕстьВБазеКонтрагент(ИНН, КПП) ИЛИ ЕстьВБазеКонтрагентНаим(Наименование))    Тогда
	Если (ЭтоНовый() И ЕстьВБазеКонтрагент(ИНН,КПП,Наименование)) или (ЭтоНовый() И ЗначениеЗаполнено (ИНН) и ЕстьВБазеКонтрагент(ИНН,КПП,"")) Тогда
        Отказ = Истина;
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Такой Контрагент уже есть в базе";
        Сообщение.Поле = "Объект.Наименование"; 
        Сообщение.Сообщить();
    КонецЕсли;
Показать
Остальные ответы
Избранное Подписка Сортировка: Древо
2. YannikAlx 32 11.11.19 11:32 Сейчас в теме
А откуда берутся ИНН, КПП и Наименование в этом месте
 ЕстьВБазеКонтрагент(ИНН, КПП, Наименование)
?
3. Medveedka 11.11.19 11:44 Сейчас в теме
(2) пробовала так:
Функция ЕстьВБазеКонтрагент(ИНН = "", КПП = "", Наименование = "")


ничего не поменялось.

И как понять откуда береться? идет же вызов функции? или что-то не так делаю?
4. YannikAlx 32 11.11.19 12:08 Сейчас в теме
(3) Я имел ввиду вот
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) 
Если ЭтоНовый() И ЕстьВБазеКонтрагент(ИНН, КПП, Наименование) Тогда
Отказ = Истина; 
        Сообщение = Новый СообщениеПользователю; 
        Сообщение.Текст = "Такой Контрагент уже есть в базе"; 
        Сообщение.Поле = "Объект.Наименование"; 
        Сообщение.Сообщить(); 
КонецЕсли; 
Показать
тут ОТКУДА 1С знает чему равны ИНН, КПП, Наименование.
У вас они ВСЕГДА неопределены, и потому запрос всегда выдает всех контрагентов в базе...
5. Medveedka 11.11.19 12:33 Сейчас в теме
А уже не важно, сделала так:
Функция ЕстьВБазеКонтрагент(ИНН, КПП, Наименование)
  
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    СпрКонтрагенты.Ссылка КАК Ссылка
        |ИЗ
        |    Справочник.Контрагенты КАК СпрКонтрагенты
        |ГДЕ
        |    ИСТИНА
        |    И СпрКонтрагенты.ИНН = &ИНН
        |    И СпрКонтрагенты.КПП = &КПП
        |    И СпрКонтрагенты.Наименование = &Наименование
        |";
    
    Если ИНН = "" Тогда
        Запрос.Текст = СтрЗаменить(Запрос.Текст, "И СпрКонтрагенты.ИНН = &ИНН", "");
    Иначе
        Запрос.УстановитьПараметр("ИНН", ИНН);
    КонецЕсли;
    Если КПП = "" Тогда
        Запрос.Текст = СтрЗаменить(Запрос.Текст, "И СпрКонтрагенты.КПП = &КПП", "");
    Иначе
        Запрос.УстановитьПараметр("КПП", КПП);
    КонецЕсли;
    Если Наименование = "" Тогда
        Запрос.Текст = СтрЗаменить(Запрос.Текст, "И СпрКонтрагенты.Наименование = &Наименование", "");
    Иначе
        Запрос.УстановитьПараметр("Наименование", Наименование);
    КонецЕсли;
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
        Возврат Ложь;
    КонецЕсли;
    Возврат Истина;
КонецФункции

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

	//Если ЭтоНовый() И ЗначениеЗаполнено (ИНН) И ЕстьВБазеКонтрагент(ИНН, КПП) И ЕстьВБазеКонтрагентНаим(Наименование) Тогда
	//Если ЭтоНовый() И ЕстьВБазеКонтрагент(СокрЛП(ИНН),СокрЛП(КПП),СокрЛП(Наименование)) Тогда
	//Если ЭтоНовый() И ЗначениеЗаполнено (ИНН) И (ЕстьВБазеКонтрагент(ИНН, КПП) ИЛИ ЕстьВБазеКонтрагентНаим(Наименование))    Тогда
	Если (ЭтоНовый() И ЕстьВБазеКонтрагент(ИНН,КПП,Наименование)) или (ЭтоНовый() И ЗначениеЗаполнено (ИНН) и ЕстьВБазеКонтрагент(ИНН,КПП,"")) Тогда
        Отказ = Истина;
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Такой Контрагент уже есть в базе";
        Сообщение.Поле = "Объект.Наименование"; 
        Сообщение.Сообщить();
    КонецЕсли;
Показать
6. ice-net 18 11.11.19 14:35 Сейчас в теме
(5) Лучше сделайте без наименования (только ИНН+КПП), ведь инн и кпп должны быть уникальными, а наименования можно и обойти(специально или случайно). Например "ооо фирма" / "фирма ооо" /"ооо фирма" / " ооо фирма" / "ооо фирма" / "ооо фирма" и тд...

+ группы вы никак не отделили? у групп только наименование, нельзя будет назвать 2 группы одинаково в любых уровнях иерархии.
7. Medveedka 11.11.19 15:56 Сейчас в теме
(6) да тут в любом случае идёт проверка и по инн тоже. Просто безопаснее будет если и по наименованию не пройдёт
8. ice-net 18 11.11.19 16:09 Сейчас в теме
(7)
да тут в любом случае идёт проверка и по инн тоже. Просто безопаснее будет если и по наименованию не пройдёт


Я Вам говорю немного о другом. Если у вас в базе есть клиент с инн 111, кпп 222 и наим ооо фирм, а вы создаете нового с инн 111, кпп 222 и наим фирм ооо, то ваша проверка не сработает, хотя очевидно, что это дубль.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Москва
зарплата до 160 000 руб.
Полный день

Ведущий программист 1С; Оплачиваемый переезд в Ростов-на-Дону
Краснодар
зарплата от 50 000 руб. до 120 000 руб.
Полный день

Ведущий программист 1С; Оплачиваемый переезд в Ростов-на-Дону
Екатеринбург
зарплата до 120 000 руб.
Полный день

Ведущий программист 1С
Ростов-на-Дону
зарплата от 50 000 руб. до 120 000 руб.
Полный день

Консультант 1С
Москва
зарплата от 100 000 руб. до 140 000 руб.
Временный (на проект)