Вход | Регистрация
 

Помогите с написанием доработки! Не полностью отрабатывает!

Помогите с написанием доработки! Не полностью отрабатывает!
Я
   Медвеедка
 
07.11.19 - 17:43
Попросили меня сделать доработку чтоб программа отказывалась записывать контрагента если уже такой есть.
Написала так:

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

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

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


Всё отлично работает, но необходимо сделать ещё запрос на дубль наименования

Но при этом тут есть условие (в коде видно), что если ИНН не заполнено, проверку не делать. Это  написала дл того, если будут контрагенты с пустым ИНН могло записаться.

Т.е. мне необходимо, как я понимаю, сделать проверку отдельно, да?

Добавить её одн функцию и же в неё добавлять запрос на поиск наименование. Ведь если как-то менять данный запрос, то он не будет срабатывать если ИНН пустое, а так часто делают.

Но проблема в том, что я пыталась. Делала так:

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

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

Не смогла понять отрабатывало это или нет, ведь  пыталась сделать это с пустым ИНН, а как видно проверка в таком случае не проходит.
Ребят, выручайте, какие могт быть решения, помимо ЗначениеЗаполнено (ИНН)?

P.S. только учусь, задание понимаю легкое, но на этой ступеньке я споткнулась.
 
 
   Garykom
 
1 - 07.11.19 - 17:51
И ( ЕстьВБазеКонтрагент(ИНН, КПП) ИЛИ ЕстьВБазеКонтрагентНаим(Наименование) )
   Медвеедка
 
4 - 07.11.19 - 17:59
(1) обязательно попробую, спасибо
   spiller26
 
5 - 07.11.19 - 18:07
(1) Проскочат всё равно в "Наименовании". Допустим "копипастили", регистр буквы (все большие или маленькие), символы всякие бывают.
Ещё моменты, ИП-шник у него только ИНН, или вообще нет, как допустим с иностранцами.
   ribuh
 
6 - 07.11.19 - 20:15
Функция ЕстьВБазеКонтрагент(ИНН = "", КПП = "", Наименование = "")
  
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    СпрКонтрагенты.Ссылка КАК Ссылка
        |ИЗ
        |    Справочник.Контрагенты КАК СпрКонтрагенты
        |ГДЕ
        |    ИСТИНА
        |    И СпрКонтрагенты.ИНН = &ИНН
        |    И СпрКонтрагенты.КПП = &КПП
        |    И СпрКонтрагенты.Наименование = &Наименование
        ";
    
    Если ИНН = "" Тогда
        Запрос.Текст = СтрЗаменить(Запрос.Текст, "И СпрКонтрагенты.ИНН = &ИНН", "");
    Иначе
        Запрос.УстановитьПараметр("ИНН", ИНН);
    КонецЕсли;
    Если КПП = "" Тогда
        Запрос.Текст = СтрЗаменить(Запрос.Текст, "И СпрКонтрагенты.КПП = &КПП", "");
    Иначе
        Запрос.УстановитьПараметр("КПП", КПП);
    КонецЕсли;
    Если Наименование = "" Тогда
        Запрос.Текст = СтрЗаменить(Запрос.Текст, "И СпрКонтрагенты.Наименование = &Наименование", "");
    Иначе
        Запрос.УстановитьПараметр("Наименование", Наименование);
    КонецЕсли;
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
        Возврат Ложь;
    КонецЕсли;
    Возврат Истина;
КонецФункции
   ribuh
 
7 - 07.11.19 - 20:16
+ (6) одной функцией все проверки - сработает в зависимости от заполненности параметров...
   Garykom
 
8 - 07.11.19 - 20:28
(6) Общепринято запросы кодом составлять складывая а не вычитая.
При вычитании слишком легко накосячить.
Ну и мелочи типа проверка ="" слегка странно, когда хорошо бы ЗначениеЗаполнено()
   Медвеедка
 
9 - 11.11.19 - 09:49
(1) извиняюсь, что так поздно отвечаю, заболела серьёзно.
Дошли руки проверить: отрабатывает хорошо, но не избавляет от проблемы, что если ИНН не заполнено,  то проверка не проводится, как то надо искоренить, а как пока не пойму.
   MyNick
 
10 - 11.11.19 - 09:55
Чет не увидел - а с текущей ссылкой сравнивается? Если мы текущий объект перезапишем - он не ругнется, что такой уже есть?
   Медвеедка
 
11 - 11.11.19 - 10:01
(6) Честно не знаю почему, но вообще не отрабатывает. Вставляю вашу функцию, программа ругается на одну ошибку (палочки в запросе не хватает) и потом уже в тандартной процедуре

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

но ошибок вообще не вылезает никаких :с
   Медвеедка
 
12 - 11.11.19 - 10:01
(10) с текущей не сравнивается
   Медвеедка
 
13 - 11.11.19 - 10:06
(10) мне сейчас хотя бы с простым разобраться вариантом, чтоб с остальными сравнивал
   unbred
 
14 - 11.11.19 - 10:14
>Ведь если как-то менять данный запрос, то он не будет срабатывать если ИНН пустое, а так часто делают.
если перестанут так часто делать- то твоя обработка будет не нужна. и это правильно.
   hhhh
 
15 - 11.11.19 - 10:18
(11) эта строчка - бред какой-то. Почему всё пусто?
Если ЭтоНовый() И ЕстьВБазеКонтрагент(ИНН = "", КПП = "", Наименование = "") Тогда
   Медвеедка
 
16 - 11.11.19 - 10:18
(14) если перестанут то да, но не перестанут. Контрагенты у нас - это физ.лица, инн они у них не заполняют. Заполняли бы - было бы стандартное предупреждение, что стой, ахтунг, есть такое в базе! Но нет. пыталась поговорить - не слушают, бабы...
   Медвеедка
 
17 - 11.11.19 - 10:19
(15) ну я брала название функции... кажется я вас поняла
   Ник080808
 
18 - 11.11.19 - 10:20
я чет не понял, 17 сообщений а фото никто не потребовал. Не та уже миста(((
   unenu
 
19 - 11.11.19 - 10:22
пока замуж не выйдет каждый день на форуме будет тема от тс, как чашка кофе.
я пока не понял - хорошо это или плохо, вроде хорошо - не спать!
   unenu
 
20 - 11.11.19 - 10:24
(18) в 2019 требовать фото - дурной тон, могут отобрать киностудию и пусть по миру с рваной торбой(
   Медвеедка
 
21 - 11.11.19 - 10:29
(18) тут похоже удалили - во втрором сообщении просили фото, но я так и не поняла какое)
   Медвеедка
 
22 - 11.11.19 - 10:29
(6) и похоже сработало
   Медвеедка
 
23 - 11.11.19 - 10:31
(19) да не, уверяю, каждый день не будет здесь тем от меня) я не настолько глупа и нагла
   Медвеедка
 
24 - 11.11.19 - 10:37
Да бред какой-то. код из (6) не отрабатывает поиск по ИНН, а по наименованию проходит)) я не предъявляю ни в коем случае, просто забавно, что задача, которая на первый взгляд простейшая - таит столько проблем.
1с-ники, у вас всегда так?) ахаха, блин, пойду разбираться
   hhhh
 
25 - 11.11.19 - 10:43
(24) в (6) это сама финкция, а в (11) у вас вызов этой функции. Вы полностью выключили мозг, кгда копировали из (6) в (11).
   Медвеедка
 
26 - 11.11.19 - 10:51
(25) тогда выключен был, да. Да я и сейчас мало что соображаю с темепературой.
Я поменяла на Если ЭтоНовый() И ЕстьВБазеКонтрагент(ИНН, КПП, Наименование) Тогда

И вот стало отррабатывать по наименованию, но ИНН нет
   Медвеедка
 
27 - 11.11.19 - 11:27
Блин, не могу причину найти почему не ищет по ИНН и КПП. Запрос то нормально отрабатывает, а вот почему не отказывается записывать не знаю
   Ёпрст
 
28 - 11.11.19 - 11:31
(27) сокрЛп
   hhhh
 
29 - 11.11.19 - 11:33
(27) пробелы у вас в инн.
   Kigo_Kigo
 
30 - 11.11.19 - 11:33
(27) Показывай как заполняешь переменные перед вызовом ЕстьВБазеКонтрагент(ИНН, КПП, Наименование)
 
 Рекламное место пустует
   Медвеедка
 
31 - 11.11.19 - 11:37
(28) (29) (30) сейчас точно проверю, спасибо за подсказк ребят
   Медвеедка
 
32 - 11.11.19 - 11:40
(29) не, точно нет пробелов, что-то другое. Создаю нового контрагента через кнопку скопировать.
   Медвеедка
 
33 - 11.11.19 - 11:41
(30) Функция ЕстьВБазеКонтрагент(ИНН, КПП, Наименование)
  
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    СпрКонтрагенты.Ссылка КАК Ссылка
        |ИЗ
        |    Справочник.Контрагенты КАК СпрКонтрагенты
        |ГДЕ
        |    ИСТИНА
        |    И СпрКонтрагенты.ИНН = &ИНН
        |    И СпрКонтрагенты.КПП = &КПП
        |    И СпрКонтрагенты.Наименование = &Наименование
        |";
    
    Если ИНН = "" Тогда
        Запрос.Текст = СтрЗаменить(Запрос.Текст, "И СпрКонтрагенты.ИНН = &ИНН", "");
    Иначе
        Запрос.УстановитьПараметр("ИНН", ИНН);
    КонецЕсли;
    Если КПП = "" Тогда
        Запрос.Текст = СтрЗаменить(Запрос.Текст, "И СпрКонтрагенты.КПП = &КПП", "");
    Иначе
        Запрос.УстановитьПараметр("КПП", КПП);
    КонецЕсли;
    Если Наименование = "" Тогда
        Запрос.Текст = СтрЗаменить(Запрос.Текст, "И СпрКонтрагенты.Наименование = &Наименование", "");
    Иначе
        Запрос.УстановитьПараметр("Наименование", Наименование);
    КонецЕсли;
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
        Возврат Ложь;
    КонецЕсли;
    Возврат Истина;
КонецФункции

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

    //Если ЭтоНовый() И ЗначениеЗаполнено (ИНН) И ЕстьВБазеКонтрагент(ИНН, КПП) И ЕстьВБазеКонтрагентНаим(Наименование) Тогда

    Если ЭтоНовый() И ЕстьВБазеКонтрагент(ИНН,КПП,Наименование) Тогда
    //Если ЭтоНовый() И ЗначениеЗаполнено (ИНН) И (ЕстьВБазеКонтрагент(ИНН, КПП) ИЛИ ЕстьВБазеКонтрагентНаим(Наименование))    Тогда


        Отказ = Истина;
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Такой Контрагент уже есть в базе";
        Сообщение.Поле = "Объект.Наименование"; 
        Сообщение.Сообщить();
    КонецЕсли;
   Ёпрст
 
34 - 11.11.19 - 11:43
Да ё..
 Если ЭтоНовый() И ЕстьВБазеКонтрагент(СокрЛП(ИНН),СокрЛП(КПП),СокрЛП(Наименование)) Тогда
   Ёпрст
 
35 - 11.11.19 - 11:43
ну и вообще, like проще пользовать в тексте запроса
   Ёпрст
 
36 - 11.11.19 - 11:45
А так. клиентос вполне себе может быть с одним наименованием , одинаковым ИНН, но с разным КПП, это ежели в базе нет отдельного справочника обособок у клиентоса
   Медвеедка
 
37 - 11.11.19 - 11:49
(34) извините, но ничего не поменлось: всё так же с одним инн и кпп проходит запись
   Медвеедка
 
38 - 11.11.19 - 11:50
(34) ну т.е. я создаю контрагента через копировать другого, - ничего не меняю - запись не происходит, меняю наименование - запись происходит
   Kigo_Kigo
 
39 - 11.11.19 - 11:59
(38) Правильно, по 3-м параметрам у тебя уже не проходит запрос
А если так ЕстьВБазеКонтрагент(СокрЛП(ИНН),СокрЛП(КПП),"")) отрабатывает?
   hhhh
 
40 - 11.11.19 - 11:59
(38) ну у вас так и задумано
       |ГДЕ
        |    ИСТИНА
        |    И СпрКонтрагенты.ИНН = &ИНН
        |    И СпрКонтрагенты.КПП = &КПП
        |    И СпрКонтрагенты.Наименование = &Наименование

то есть когда все 3 поля совпадают, запись не пройдет.
   Медвеедка
 
41 - 11.11.19 - 12:04
(40) (39) Блин, я не понимаю как мне тогда сделать проверку независимой? Ну т.е. если инн пустое доустим (а такие в базе уже есть), а наименование одинаковое - отказ записи (ну это сейчас отрабатывает кст). Если наименование разное, но одинаковые и инн и кпп - отказ записи (вот эта проблема осталась). с начала месяца сижу над этим, книги читаю, видосы смотрю. а понять не могу. жопа какая-то эта 1с-ка)
   Kigo_Kigo
 
42 - 11.11.19 - 12:05
(40) Запрос пройдет, а вот если одно не совпадает то и не пройдет
   Kigo_Kigo
 
43 - 11.11.19 - 12:05
Если (ЭтоНовый() И ЕстьВБазеКонтрагент(ИНН,КПП,Наименование)) или (ЭтоНовый() и ЕстьВБазеКонтрагент(ИНН,КПП,"")) Тогда
   Медвеедка
 
44 - 11.11.19 - 12:13
(43) всё шикарно, но не поверите! не до конца. Если ИНН и КПП вообще не заполнять (а в базе есть уже контрагенты с этими пустыми данными), то 1С-ка же считает их как одинкаовые значение и заисывать отказывается. А можно как-то в самом запросе исключить пустые значения?
   Медвеедка
 
45 - 11.11.19 - 12:16
(43) сейчас так попробую:

Если (ЭтоНовый() И ЕстьВБазеКонтрагент(ИНН,КПП,Наименование)) или (ЭтоНовый() И ЗначениеЗаполнено (ИНН) и ЕстьВБазеКонтрагент(ИНН,КПП,"")) Тогда
   hhhh
 
46 - 11.11.19 - 12:18
(44) это не из-за этого, а из-за ИСТИНА. Там у вас ИСТИНА зафигачена в ГДЕ.
   Медвеедка
 
47 - 11.11.19 - 12:21
(46) её можно просто удалить?
   Медвеедка
 
48 - 11.11.19 - 12:21
Кстати, ребят, чем сбить температуру лучше 38,2? терафлю и пр хрень не помогает
   shadow_sw
 
49 - 11.11.19 - 12:23
придут сейчас ЗОЖники и скажут искать подорожник
   Медвеедка
 
50 - 11.11.19 - 12:23
(49) надеюсь не надо будет пить его сок?) ахаха
   Kigo_Kigo
 
51 - 11.11.19 - 12:24
(48) Такую не сбивают, терпи, быстрее поправишься
   ribuh
 
52 - 11.11.19 - 12:27
(45) В функция из (6) передаём только те параметры, которые есть, остальные можно оставить пустыми (ЕстьВБазеКонтрагент(,, "Вася пупкин"), когда есть есть только наименование).
(8) >>>у и мелочи типа проверка ="" слегка странно, когда хорошо бы ЗначениеЗаполнено()<<< писал прям тут, ЗначениеЗаполнено() писать дольше...а по существу - если параметр не будет передан, то будет именно = ""... Про накосячить в вычитании, слов нет - запрос можно наваять конструктором, а потом убрать всё лишнее в зависимости от заполнения параметров, чем принципиально отличается от программного добавления...хотя на вкус и цвет...
   ribuh
 
53 - 11.11.19 - 12:29
(46) ИСТИНА нафигачена оттого, что потом все условия идут через "И", и не надо заморачиваться при удалении строк в запросе, как правильно удалить
   Медвеедка
 
54 - 11.11.19 - 12:33
(51) спасибо мил человек, пожалуй сейчас пойду домой оттуда работать.
(52) (53) я уже плохо понимаю о чем тут речь, надо бы скачать книгу по запросам, блааго там всего 200 стр.
   hhhh
 
55 - 11.11.19 - 12:33
(53) ну вот и фигня получается. Если у нее все условия пустые, получается ГДЕ ИСТИНА, выбирается весь справочник контрагентов. А должно быть наоборот.
   D_E_S_131
 
56 - 11.11.19 - 12:33
А зачем проверять наличие похожего контрагента в процедуре "ОбработкаПроверкиЗаполнения()"? Просто "ПередЗаписью()" не интересно?
   Медвеедка
 
57 - 11.11.19 - 12:39
ребятули, без вас всех бы я не справилась. прям огромнейшее крутейшее спасибо.прям вот без вас бы глупости делала
   ribuh
 
58 - 11.11.19 - 12:42
(55) ага, именно весь - как параметры передашь - так и результат получишь - ищешь не знамо что - найдёшь всё... А так то в условиях было, что есть или ИНН или Наименование, я, для примера, накропал функцию, которая в этих условиях отработает без ошибок с читабельным, понятным кодом, а вот уж как с этим потом полста постов нафлудили, того предположить не мг, простите меня пожалуйста)))))
   Масянька
 
59 - 11.11.19 - 12:43
(57) Вместо "спасибо" - ребят устроит фотка. :))))))))))))))))))
   hhhh
 
60 - 11.11.19 - 12:51
(58) это к (43) всё. мы (43) обсуждали, и там это не работает
   ГдеСобакаЗарыта
 
61 - 11.11.19 - 12:53
В типовых конфигах уже давно есть проверка на задвоение. Вы с какой конфигурацией работаете?
   ribuh
 
62 - 11.11.19 - 13:25
(60) в (43) поток мыслей мне недоступный...а если уж напрягает передача пустых параметров (всех 3-х), так в в первой строке проверить их заполнение, если все не заполнены вернуть Ложь, делов-то, или надо текст написать такой проверки?


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.