Проверка контрагентов по ИНН не проходит, по наименованию проходит (должен и то и то)
Привет всем)
попросили меня бухи дописать одну простую вещь: чтоб когда они создавали контрагентов, была проверка по наименованию и инн+кпп на дубль.
Вроде и просто а уже мучаюсь хз сколько.
Сделала так:
Но! Если одинаковое наименование записывать программа отказывается, а если одинкаовые инн и кпп, то проверка как будто не делается вообще.
Я тут ещё делала так, что если инн не заполнено, то проверку только по наименованию проводить, а оно инн как понла вообще отключило.
попросили меня бухи дописать одну простую вещь: чтоб когда они создавали контрагентов, была проверка по наименованию и инн+кпп на дубль.
Вроде и просто а уже мучаюсь хз сколько.
Сделала так:
Функция ЕстьВБазеКонтрагент(ИНН = "", КПП = "", Наименование = "")
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СпрКонтрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК СпрКонтрагенты
|ГДЕ
| ИСТИНА
| И СпрКонтрагенты.ИНН = &ИНН
| И СпрКонтрагенты.КПП = &КПП
| И СпрКонтрагенты.Наименование = &Наименование";
Если ИНН = "" Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И СпрКонтрагенты.ИНН = &ИНН", "");
Иначе
Запрос.УстановитьПараметр("ИНН", ИНН);
КонецЕсли;
Если КПП = "" Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И СпрКонтрагенты.КПП = &КПП", "");
Иначе
Запрос.УстановитьПараметр("КПП", КПП);
КонецЕсли;
Если Наименование = "" Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И СпрКонтрагенты.Наименование = &Наименование", "");
Иначе
Запрос.УстановитьПараметр("Наименование", Наименование);
КонецЕсли;
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ЭтоНовый() И ЕстьВБазеКонтрагент(ИНН, КПП, Наименование) Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Такой Контрагент уже есть в базе";
Сообщение.Поле = "Объект.Наименование";
Сообщение.Сообщить();
КонецЕсли;
ПоказатьНо! Если одинаковое наименование записывать программа отказывается, а если одинкаовые инн и кпп, то проверка как будто не делается вообще.
Я тут ещё делала так, что если инн не заполнено, то проверку только по наименованию проводить, а оно инн как понла вообще отключило.
По теме из базы знаний
- Перенос данных из УПП 1.3 / КА 1.1 в БП 3. Переносятся документы, справочники и начальные остатки
- Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2
- Распознавание и загрузка сканов в 1С "одним нажатием": УПД, ТОРГ-12, накладные, счета, номенклатура, заказы и т.д.
- Обмен 1С с Честным Знаком для УТ11, УНФ, КА2, ERP, Розница: Расширение для работы с СУЗ, ГИС МТ, ЦРПТ
- API-интеграция 1С с маркетплейсами ОЗОН, WildBerries, Я.Маркет, СберМегаМаркет, Стройландия, Леруа Мерлен, Hoff, AliExpress для УТ11, КА2, ERP2, УНФ, БП3, Розница, УТ10, УПП1.3
Найденные решения
А уже не важно, сделала так:
Функция ЕстьВБазеКонтрагент(ИНН, КПП, Наименование)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СпрКонтрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК СпрКонтрагенты
|ГДЕ
| ИСТИНА
| И СпрКонтрагенты.ИНН = &ИНН
| И СпрКонтрагенты.КПП = &КПП
| И СпрКонтрагенты.Наименование = &Наименование
|";
Если ИНН = "" Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И СпрКонтрагенты.ИНН = &ИНН", "");
Иначе
Запрос.УстановитьПараметр("ИНН", ИНН);
КонецЕсли;
Если КПП = "" Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И СпрКонтрагенты.КПП = &КПП", "");
Иначе
Запрос.УстановитьПараметр("КПП", КПП);
КонецЕсли;
Если Наименование = "" Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И СпрКонтрагенты.Наименование = &Наименование", "");
Иначе
Запрос.УстановитьПараметр("Наименование", Наименование);
КонецЕсли;
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
//Если ЭтоНовый() И ЗначениеЗаполнено (ИНН) И ЕстьВБазеКонтрагент(ИНН, КПП) И ЕстьВБазеКонтрагентНаим(Наименование) Тогда
//Если ЭтоНовый() И ЕстьВБазеКонтрагент(СокрЛП(ИНН),СокрЛП(КПП),СокрЛП(Наименование)) Тогда
//Если ЭтоНовый() И ЗначениеЗаполнено (ИНН) И (ЕстьВБазеКонтрагент(ИНН, КПП) ИЛИ ЕстьВБазеКонтрагентНаим(Наименование)) Тогда
Если (ЭтоНовый() И ЕстьВБазеКонтрагент(ИНН,КПП,Наименование)) или (ЭтоНовый() И ЗначениеЗаполнено (ИНН) и ЕстьВБазеКонтрагент(ИНН,КПП,"")) Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Такой Контрагент уже есть в базе";
Сообщение.Поле = "Объект.Наименование";
Сообщение.Сообщить();
КонецЕсли;
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3) Я имел ввиду вот
тут ОТКУДА 1С знает чему равны ИНН, КПП, Наименование.
У вас они ВСЕГДА неопределены, и потому запрос всегда выдает всех контрагентов в базе...
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ЭтоНовый() И ЕстьВБазеКонтрагент(ИНН, КПП, Наименование) Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Такой Контрагент уже есть в базе";
Сообщение.Поле = "Объект.Наименование";
Сообщение.Сообщить();
КонецЕсли;
ПоказатьУ вас они ВСЕГДА неопределены, и потому запрос всегда выдает всех контрагентов в базе...
А уже не важно, сделала так:
Функция ЕстьВБазеКонтрагент(ИНН, КПП, Наименование)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СпрКонтрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК СпрКонтрагенты
|ГДЕ
| ИСТИНА
| И СпрКонтрагенты.ИНН = &ИНН
| И СпрКонтрагенты.КПП = &КПП
| И СпрКонтрагенты.Наименование = &Наименование
|";
Если ИНН = "" Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И СпрКонтрагенты.ИНН = &ИНН", "");
Иначе
Запрос.УстановитьПараметр("ИНН", ИНН);
КонецЕсли;
Если КПП = "" Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И СпрКонтрагенты.КПП = &КПП", "");
Иначе
Запрос.УстановитьПараметр("КПП", КПП);
КонецЕсли;
Если Наименование = "" Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И СпрКонтрагенты.Наименование = &Наименование", "");
Иначе
Запрос.УстановитьПараметр("Наименование", Наименование);
КонецЕсли;
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
//Если ЭтоНовый() И ЗначениеЗаполнено (ИНН) И ЕстьВБазеКонтрагент(ИНН, КПП) И ЕстьВБазеКонтрагентНаим(Наименование) Тогда
//Если ЭтоНовый() И ЕстьВБазеКонтрагент(СокрЛП(ИНН),СокрЛП(КПП),СокрЛП(Наименование)) Тогда
//Если ЭтоНовый() И ЗначениеЗаполнено (ИНН) И (ЕстьВБазеКонтрагент(ИНН, КПП) ИЛИ ЕстьВБазеКонтрагентНаим(Наименование)) Тогда
Если (ЭтоНовый() И ЕстьВБазеКонтрагент(ИНН,КПП,Наименование)) или (ЭтоНовый() И ЗначениеЗаполнено (ИНН) и ЕстьВБазеКонтрагент(ИНН,КПП,"")) Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Такой Контрагент уже есть в базе";
Сообщение.Поле = "Объект.Наименование";
Сообщение.Сообщить();
КонецЕсли;
Показать
(5) Лучше сделайте без наименования (только ИНН+КПП), ведь инн и кпп должны быть уникальными, а наименования можно и обойти(специально или случайно). Например "ооо фирма" / "фирма ооо" /"ооо фирма" / " ооо фирма" / "ооо фирма" / "ооо фирма" и тд...
+ группы вы никак не отделили? у групп только наименование, нельзя будет назвать 2 группы одинаково в любых уровнях иерархии.
+ группы вы никак не отделили? у групп только наименование, нельзя будет назвать 2 группы одинаково в любых уровнях иерархии.
(7)
Я Вам говорю немного о другом. Если у вас в базе есть клиент с инн 111, кпп 222 и наим ооо фирм, а вы создаете нового с инн 111, кпп 222 и наим фирм ооо, то ваша проверка не сработает, хотя очевидно, что это дубль.
да тут в любом случае идёт проверка и по инн тоже. Просто безопаснее будет если и по наименованию не пройдёт
Я Вам говорю немного о другом. Если у вас в базе есть клиент с инн 111, кпп 222 и наим ооо фирм, а вы создаете нового с инн 111, кпп 222 и наим фирм ооо, то ваша проверка не сработает, хотя очевидно, что это дубль.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот