8.х Проверка уникальности заполнения реквизитов

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем ILDARIAN, 30 май 2013.

  1. TopicStarter Overlay
    ILDARIAN
    Offline

    ILDARIAN Опытный в 1С

    Регистрация:
    6 янв 2013
    Сообщения:
    131
    Симпатии:
    1
    Баллы:
    29
    Всем привет. Такая проблема.

    Есть справочник "Контрагенты", в нем есть реквизиты ЕДРПОУ, ИПН, НомерСвидетельства, Полное наименование.
    Нужно при создании нового контрагента сделать проверку уникальности этих реквизитов. Я сделал вот так:

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

    Но это не главное. Я хочу сделать так чтобы система сообщала пользователю, или открывала того контрагента с которым совпадают данные.
    Помогите пожалуйста, буду очень признателен.
  2. web.num
    Offline

    web.num Опытный в 1С Команда форума

    Регистрация:
    6 окт 2011
    Сообщения:
    918
    Симпатии:
    4
    Баллы:
    29
    Это все что ошибка выдает? И если вам нужно сравнивать не все реквизиты у контра а отдельно каждый тогда вместо И наверное ИЛИ писать надо, а то так он будет искать контра по всем этим 4 реквизитам
  3. TopicStarter Overlay
    ILDARIAN
    Offline

    ILDARIAN Опытный в 1С

    Регистрация:
    6 янв 2013
    Сообщения:
    131
    Симпатии:
    1
    Баллы:
    29
    С ошибкой разобрался. У меня реквизиты были неограниченной длины. Записывает, сообщение выдает. Можно ли как-то открыть того контрагента с которым совпадают данные?

    Или сообщать какой именно реквизит совпадает

    я заменил "И" на "ИЛИ"
  4. web.num
    Offline

    web.num Опытный в 1С Команда форума

    Регистрация:
    6 окт 2011
    Сообщения:
    918
    Симпатии:
    4
    Баллы:
    29
    Можно конечно, получи контрагента и открой ФормуЭлемента этого контрагента, на вскидку: где контрагент=твой контрагент, далее Форма.Открыть() как то так!
  5. TopicStarter Overlay
    ILDARIAN
    Offline

    ILDARIAN Опытный в 1С

    Регистрация:
    6 янв 2013
    Сообщения:
    131
    Симпатии:
    1
    Баллы:
    29
    А можно поподробней, я не знаю как это написать, мало опыта в программировании ещё (

    Пусть будет просто сообщатся какой реквизит совпал.
  6. web.num
    Offline

    web.num Опытный в 1С Команда форума

    Регистрация:
    6 окт 2011
    Сообщения:
    918
    Симпатии:
    4
    Баллы:
    29
    Можешь так попробовать:
    Код:
    Если НЕ Результат.Пустой() Тогда
    Выборка  = Результат.Выбрать()
    Пока Выборка.Следующий() Цикл
    Сообщить("Контрагент " + Выборка.Контрагент + " имеет такой же " + Выборка.ИПН +","+Выборка.чтоТоЕще+","+Выборка.чтоТоЕще+"!");
    конеццикла;
    конецесли;
  7. TopicStarter Overlay
    ILDARIAN
    Offline

    ILDARIAN Опытный в 1С

    Регистрация:
    6 янв 2013
    Сообщения:
    131
    Симпатии:
    1
    Баллы:
    29
    Работает, только остался последний штрих. У меня много клиентов у которых эти реквизиты не заполнены, и когда я создаю нового контрагента и записываю его с пустыми реквизитами, то оно пишет мне всех контрагентов у которых эти реквизиты тоже пустые, и пишет что у них такие же реквизиты, как сделать так чтобы система не обращала внимания на пустые реквизиты?
  8. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    задай в запросе условие
  9. web.num
    Offline

    web.num Опытный в 1С Команда форума

    Регистрация:
    6 окт 2011
    Сообщения:
    918
    Симпатии:
    4
    Баллы:
    29
    Подскажи парню как это сделать, я сам забыл....NULL как то использовать!?

    Или условие в цикле
    Код:
    Если НЕ .....ПустаяСсылка() тогда
  10. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    примерно так наверное
    Код:
    ГДЕ
    ЕСТЬNULL(ОбщиеКонтрагенты.ЕДРПАОУ, 0) <> 0
    свои реквизиты подставьте
  11. web.num
    Offline

    web.num Опытный в 1С Команда форума

    Регистрация:
    6 окт 2011
    Сообщения:
    918
    Симпатии:
    4
    Баллы:
    29
    Лучше конечно в запросе сразу отсечь такое, чем в цикле! Быстрее будет!
  12. TopicStarter Overlay
    ILDARIAN
    Offline

    ILDARIAN Опытный в 1С

    Регистрация:
    6 янв 2013
    Сообщения:
    131
    Симпатии:
    1
    Баллы:
    29

    Условие: если значение отсутствует, то ставим туда 0, и берем только тех контрагентов где 0 <> 0 . Т.е. не берём контрагентов с пустыми реквизитами. Я правильно понял ?
  13. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    ну должно быть так, вам ведь надо отсечь с незаполненными реквизитми?
  14. TopicStarter Overlay
    ILDARIAN
    Offline

    ILDARIAN Опытный в 1С

    Регистрация:
    6 янв 2013
    Сообщения:
    131
    Симпатии:
    1
    Баллы:
    29
    вышел такщй запрос
    Код:
    "ВЫБРАТЬ
    | ОбщиеКонтрагенты.ЕДРПОУ,
    | ОбщиеКонтрагенты.ИПН,
    | ОбщиеКонтрагенты.НомерСвидетельства,
    | ОбщиеКонтрагенты.Наименование
    |ИЗ
    | Справочник.ОбщиеКонтрагенты КАК ОбщиеКонтрагенты
    |ГДЕ
    | ОбщиеКонтрагенты.ЕДРПОУ = &ЕДРПОУ
    | ИЛИ ОбщиеКонтрагенты.ИПН = &ИПН
    | ИЛИ ОбщиеКонтрагенты.НомерСвидетельства = &НомерСвидетельства
    | ЕСТЬNULL(ОбщиеКонтрагенты.ЕДРПОУ,0) <> 0
    | ИЛИ ЕСТЬNULLОбщиеКонтрагенты.ИПН,0) <> 0
    | ИЛИ ЕСТЬNULL(ОбщиеКонтрагенты.НомерСвидетельства,0) <> 0 ";
    
    выдает ошибку

    Ошибка при выполнении обработчика - 'ПередЗаписью'
    по причине:
    {Справочник.ОбщиеКонтрагенты.МодульОбъекта(50)}: Ошибка при вызове метода контекста (Выполнить)

    по причине:

    по причине:
    {(12, 2)}: Синтаксическая ошибка "ЕСТЬNULL(ОбщиеКонтрагенты.ЕДРПОУ,0)"
    <<?>>ЕСТЬNULL(ОбщиеКонтрагенты.ЕДРПОУ,0) <> 0
  15. web.num
    Offline

    web.num Опытный в 1С Команда форума

    Регистрация:
    6 окт 2011
    Сообщения:
    918
    Симпатии:
    4
    Баллы:
    29
    пропустил ИЛИ ))

    Правда закрадывается у меня что запрос не правильно написан
  16. TopicStarter Overlay
    ILDARIAN
    Offline

    ILDARIAN Опытный в 1С

    Регистрация:
    6 янв 2013
    Сообщения:
    131
    Симпатии:
    1
    Баллы:
    29
    все кроме последних 3 строк делал конструктором

    добавил ИЛИ , та же ошибка
  17. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    у вас в предпоследней строке "(" пропущена
  18. TopicStarter Overlay
    ILDARIAN
    Offline

    ILDARIAN Опытный в 1С

    Регистрация:
    6 янв 2013
    Сообщения:
    131
    Симпатии:
    1
    Баллы:
    29
    провтыкал, теперь ошибку не выбивает, но проблема с пустыми реквизитами осталась, пишет всех контрагентов с пустыми реквизитами, что такие уже есть

    вот весь код
    Код:
    Процедура ПередЗаписью(Отказ)
    Если ЭтоНовый() Тогда
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ОбщиеКонтрагенты.ЕДРПОУ,
    | ОбщиеКонтрагенты.ИПН,
    | ОбщиеКонтрагенты.НомерСвидетельства,
    | ОбщиеКонтрагенты.Наименование
    |ИЗ
    | Справочник.ОбщиеКонтрагенты КАК ОбщиеКонтрагенты
    |ГДЕ
    | ОбщиеКонтрагенты.ЕДРПОУ = &ЕДРПОУ
    | ИЛИ ОбщиеКонтрагенты.ИПН = &ИПН
    | ИЛИ ОбщиеКонтрагенты.НомерСвидетельства = &НомерСвидетельства
    | ИЛИ ЕСТЬNULL(ОбщиеКонтрагенты.ЕДРПОУ,0) <> 0
    | ИЛИ ЕСТЬNULL(ОбщиеКонтрагенты.ИПН,0) <> 0
    | ИЛИ ЕСТЬNULL(ОбщиеКонтрагенты.НомерСвидетельства,0) <> 0 ";
    
    Запрос.УстановитьПараметр("ЕДРПОУ", ЕДРПОУ);
    Запрос.УстановитьПараметр("ИПН", ИПН);
    Запрос.УстановитьПараметр("НомерСвидетельства", НомерСвидетельства);
    
    
    Результат = Запрос.Выполнить();
    Если НЕ Результат.Пустой() Тогда
    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
    
    Сообщить("Контрагент " + Выборка.Наименование + "имеет такие же " + "ИПН " + ИПН + "ЕДРПОУ " + ЕДРПОУ + "НомерСвидетельства " + НомерСвидетельства);
    //?(ИПН = "","","ИПН " +ИПН)+
    //?(ЕДРПОУ ="","","ЕДРПОУ " + ЕДРПОУ)+
    //?(НомерСвидетельства = "","","НомерСвидетельства " + НомерСвидетельства + "!"));
    КонецЦикла;
    Отказ = Истина;
    
    
    КонецЕсли;
    КонецЕсли;
    
    
    КонецПроцедуры
    
  19. web.num
    Offline

    web.num Опытный в 1С Команда форума

    Регистрация:
    6 окт 2011
    Сообщения:
    918
    Симпатии:
    4
    Баллы:
    29
    проблема в условиях запроса, их надо изменить, попробуй так каждое условие
    ИЛИ ОбщиеКонтрагенты.ИПН = &ИПН И ЕСТЬNULL(ОбщиеКонтрагенты.ИПН,0) <> 0
    в общем надо поколдовать с условиями в запросе!

    Тоесть посмотри сам за логикой в запросе: Мол выберите мне всех у кого или того или того или того нет, а надо так выберите всех у кого или то и другое
  20. web.num
    Offline

    web.num Опытный в 1С Команда форума

    Регистрация:
    6 окт 2011
    Сообщения:
    918
    Симпатии:
    4
    Баллы:
    29
    Код:
    ВЫБРАТЬ
    ОбщиеКонтрагенты.ИНН,
    ОбщиеКонтрагенты.КПП,
    ОбщиеКонтрагенты.Наименование
    ИЗ
    Справочник.Контрагенты КАК ОбщиеКонтрагенты
    ГДЕ
    (ОбщиеКонтрагенты.ИНН = &ИНН
    И ЕСТЬNULL(ОбщиеКонтрагенты.ИНН, 0) <> 0
    ИЛИ ОбщиеКонтрагенты.КПП = &КПП
    И ЕСТЬNULL(ОбщиеКонтрагенты.КПП, 0) <> 0)
    побалуйся с запросом в общем )

Поделиться этой страницей