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

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

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

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


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

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

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

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

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

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

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

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

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

Если ЭтоНовый() И ЕстьВБазеКонтрагент(ИНН = "", КПП = "", Наименование = "") Тогда
16 Медвеедка
 
11.11.19
10:18
(14) если перестанут то да, но не перестанут. Контрагенты у нас - это физ.лица, инн они у них не заполняют. Заполняли бы - было бы стандартное предупреждение, что стой, ахтунг, есть такое в базе! Но нет. пыталась поговорить - не слушают, бабы...
17 Медвеедка
 
11.11.19
10:19
(15) ну я брала название функции... кажется я вас поняла
18 Ник080808
 
11.11.19
10:20
я чет не понял, 17 сообщений а фото никто не потребовал. Не та уже миста(((
19 unenu
 
11.11.19
10:22
пока замуж не выйдет каждый день на форуме будет тема от тс, как чашка кофе.
я пока не понял - хорошо это или плохо, вроде хорошо - не спать!
20 unenu
 
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с-ники, у вас всегда так?) ахаха, блин, пойду разбираться
25 hhhh
 
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) сокрЛп
29 hhhh
 
11.11.19
11:33
(27) пробелы у вас в инн.
30 Kigo_Kigo
 
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) ну т.е. я создаю контрагента через копировать другого, - ничего не меняю - запись не происходит, меняю наименование - запись происходит
39 Kigo_Kigo
 
11.11.19
11:59
(38) Правильно, по 3-м параметрам у тебя уже не проходит запрос
А если так ЕстьВБазеКонтрагент(СокрЛП(ИНН),СокрЛП(КПП),"")) отрабатывает?
40 hhhh
 
11.11.19
11:59
(38) ну у вас так и задумано

       |ГДЕ
        |    ИСТИНА
        |    И СпрКонтрагенты.ИНН = &ИНН
        |    И СпрКонтрагенты.КПП = &КПП
        |    И СпрКонтрагенты.Наименование = &Наименование

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

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