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

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

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

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

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

Показать


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

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

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

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


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

И как понять откуда береться? идет же вызов функции? или что-то не так делаю?
4. YannikAlx 31 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С, руководитель проектов
Санкт-Петербург
зарплата от 150 000 руб.
Полный день

Бизнес-архитектор 1С, ведущий консультант
Санкт-Петербург
Полный день

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

Специалист техподдержки 1С
Москва
зарплата от 80 000 руб. до 120 000 руб.
Полный день

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