1с справочник поиск по нескольким реквизитам

Стояла задача найти Конрагента в справочнике по ИНН и КПП (кто знает, что такое обособленное подразделение, поймет). Логика проста — найти по ИНН, сверить КПП, если нет добавить.

Найдено=Справочники.Контрагенты.НайтиПоРеквезиту(«ИНН»,ИскомыйИНН);
Если Найден=Справочники.Контрагенты.ПустаяСсылка() Тогда

//СОЗДАТЬ КОНТРАГЕНТА
Иначе
Если Найдено.КПП=ИскомыйКПП Тогда
Сообщить(«Найден филиал контрагента»);
Иначе
//СОЗДАТЬ ФИЛИАЛ КОНТРАГЕНТА
КонецЕсли;
КонецЕсли;

И тут фэйл, мои дорогие, если в справочнике существует и филиал и ГО, то он кого-то по-любому не найдет. А все кроется в:

Возвращаемое
значение:

Тип: СправочникСсылка.
Ссылка на найденный элемент справочника. Если не существует ни одного
элемента с требуемым значением реквизита, то будет возвращена пустая ссылка.  

Если найдено более одного, функция вернет только первое вхождение…неприятно, однако…

Пошел искать другие пути и набрел на два варианта:
Выборка()

ПараметрПоискаИННОтбор=Новый Структура;ПараметрПоискаИННОтбор.Вставить(«ИНН»,ИскомыйИНН);
Выборка=справочники.контрагенты.Выбрать(,,ПараметрПоискаИННОтбор);
Пока Выборка.Следующий() Цикл
КППНайден=Ложь; 
Если Выборка.КПП=ИскомыйКПП Тогда
Сообщить(«Найден филиал контрагента»);
КППНайден=Истина; 
Прервать;
//Мне дальше не нужно    
КонецЕсли;
КонецЦикла;
Если КППНайден=Ложь Тогда   
 //СОЗДАТЬ ФИЛИАЛ КОНТРАГЕНТА
КонецЕсли;
И второй
Новый Запрос
ЗапросПоискИНН=Новый Запрос(«ЗапросПоискИНН»);ЗапросПоискИНН.Текст=«ВЫБРАТЬ
        |Контрагенты.Ссылка
        |ИЗ
        |Справочник.Контрагенты КАК Контрагенты
        |ГДЕ
        |Контрагенты.ИНН = &ИНН»;
ЗапросПоискИНН.Параметры.Вставить(«ИНН»,ИскомыйКПП);
Выборка=ЗапросПоискИНН.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл     
КППНайден=Ложь;    
Если Выборка.КПП=ИскомыйКПП Тогда     
Сообщить(«Найден филиал контрагента»);     
КППНайден=Истина;     
Прервать;
//Мне дальше не нужно    
КонецЕсли;
КонецЦикла;
Если КППНайден=Ложь Тогда   
//СОЗДАТЬ ФИЛИАЛ КОНТРАГЕНТА
КонецЕсли;
В Запросе можно добавить еще один параметр, чего не сделаешь в Выборке.
Но, у обоих вариантов есть минус, а именно:
Если Выборка.Следующий()=Справочники.Контрагенты.ПустаяСсылка() Тогда
//ЧЕГО ТО ТАМ;
КонецЕсли;
А дальше цикл ПокаЦикл. Блок «если», в этом случае, съест первую итерацию, и потом может кого-то обломать.

Короче, вся эта фигня к тому, что не надо использовать Выборка.Следующий() как условие, можно проверить по Выборка.Количество() или Выборка.Пустой().

поиск по нескольким реквизитам

Я
   Vasus55

30.12.11 — 10:52

как можно осущиствить поиск справочника по нескольким реквизитам(3) и открыть его

  

Партнерская программа EFSOL Oblako

   ZanderZ

1 — 30.12.11 — 10:54

запросом

   Vasus55

2 — 30.12.11 — 10:56

а как именно?

   ZanderZ

3 — 30.12.11 — 10:58

(2) написать запрос

   FIXXXL

4 — 30.12.11 — 10:58

(2) ну запросом же

   Vasus55

5 — 30.12.11 — 10:59

в запросе ссылку на этот справочник только передавать?

   Gesperid

6 — 30.12.11 — 10:59

(5) хы

   ZanderZ

7 — 30.12.11 — 11:00

(5) зачем тебе тогда искать если ты его передавать собрался ?

   FIXXXL

8 — 30.12.11 — 11:00

(5) как твоей душеньке угодно будет

запрос штука такая: хош на этот, хош на тот

   Vasus55

9 — 30.12.11 — 11:00

или все данные справочника?

   FIXXXL

10 — 30.12.11 — 11:00

PS че-нить да выдаст

   NcSteel

11 — 30.12.11 — 11:01

Select RRef From Catalog2345 Where //Твое условие.

   Gesperid

12 — 30.12.11 — 11:03

ВЫБРАТЬ
  Партии.Ссылка КАК Ссылка
Из Справочник.Партии КАК Партии
ГДЕ
  Партии.Жуликов И Партии.Воров
   Vasus55

13 — 30.12.11 — 11:05

вот так накидал

форма=Справочники.КонтакныеЛица.ПолучитьФорму(«ФормаЭлемента»);

организация=ЭлементыФормы.ТабличноеПоле1.ТекущиеДанные.Организация;

ФИО=ЭлементыФормы.ТабличноеПоле3.ТекущиеДанные.ФИО;

Должность=ЭлементыФормы.ТабличноеПоле3.ТекущиеДанные.Должность;

запрос = Новый Запрос;

Запрос.Текст= «ВЫБРАТЬ

             |    КонтакныеЛица.Код,

             |    КонтакныеЛица.Наименование,

             |    КонтакныеЛица.ФИО,

             |    КонтакныеЛица.Должность,

             |    КонтакныеЛица.ТелефонРабочий,

             |    КонтакныеЛица.ТелефонСотовый,

             |    КонтакныеЛица.EMail,

             |    КонтакныеЛица.Комментарий

             |ИЗ

             |    Справочник.КонтакныеЛица КАК КонтакныеЛица

             |ГДЕ

             |    КонтакныеЛица.Наименование = &Наименование

             |    И КонтакныеЛица.ФИО ПОДОБНО &ФИО

             |    И КонтакныеЛица.Должность = &Должность» ;

запрос.УстановитьПараметр(«Наименование»,организация);

запрос.УстановитьПараметр(«ФИО»,ФИО);

запрос.УстановитьПараметр(«Должность»,Должность);

результат=запрос.Выполнить();

а вот дальше как открыть этот справочник?

   Gesperid

14 — 30.12.11 — 11:06

мля, ты человеческим языком объясни, что тебе сделать-то надо?

   Gesperid

15 — 30.12.11 — 11:07

и не путай справочник с элементами справочника

   Vasus55

16 — 30.12.11 — 11:08

ой не то сделал

во так форма=Справочники.КонтакныеЛица.ПолучитьФорму(«ФормаЭлемента»);

организация=ЭлементыФормы.ТабличноеПоле1.ТекущиеДанные.Организация;

ФИО=ЭлементыФормы.ТабличноеПоле3.ТекущиеДанные.ФИО;

Должность=ЭлементыФормы.ТабличноеПоле3.ТекущиеДанные.Должность;

запрос = Новый Запрос;

Запрос.Текст= «ВЫБРАТЬ

             |    КонтакныеЛица.Ссылка КАК Ссылка

             |ИЗ

             |    Справочник.КонтакныеЛица КАК КонтакныеЛица

             |ГДЕ

             |    КонтакныеЛица.Наименование = &Наименование

             |    И КонтакныеЛица.ФИО ПОДОБНО &ФИО

             |    И КонтакныеЛица.Должность = &Должность» ;

запрос.УстановитьПараметр(«Наименование»,организация);

запрос.УстановитьПараметр(«ФИО»,ФИО);

запрос.УстановитьПараметр(«Должность»,Должность);

результат=запрос.Выполнить();

   Vasus55

17 — 30.12.11 — 11:09

а устанавливать параметр надо в моем случае?

   Wobland

18 — 30.12.11 — 11:09

(16) опять не то

   Wobland

19 — 30.12.11 — 11:10

параметры откуда получать надо?

   0xFFFFFF

20 — 30.12.11 — 11:11

(16)

Выборка = Запрос.Выполнить.Выбрать();

Пока Выборка.Следующий() Цикл

Выборка.Ссылка.ПолучитьФорму().Открыть();

прервать;/предполагаем что элемент один

КонецЦикла;

   Wobland

21 — 30.12.11 — 11:12

(20) это что за народное творчество? ;)

Если Выборка.Следующий()

   marvak

22 — 30.12.11 — 11:12

(16)

Тебе надо текущее значение контактного лица в списке справочника получить что ли?

Тогда это будет:

ТекКонтактноеЛицо = ЭлементыФормы.ТабличноеПоле1.ТекущиеДанные;

   Wobland

23 — 30.12.11 — 11:12

+(21) а вообще, предполагать в таком случае плохо

   NcSteel

24 — 30.12.11 — 11:12

форма=Справочники.КонтакныеЛица.ПолучитьФорму(«ФормаЭлемента»); — Что ты хочешь этим сделать ?

И задачу давай описывай полностью.

   0xFFFFFF

25 — 30.12.11 — 11:13

(21) это ты где это прочитал?

   Vasus55

26 — 30.12.11 — 11:14

Поле объекта не обнаружено (Выполнить)

   0xFFFFFF

27 — 30.12.11 — 11:14

(23) может у автора контроль по наименованию и ФИО на уникальность при записи.

Он ведь ставит задачу открыть элемент, а не показать список

   0xFFFFFF

28 — 30.12.11 — 11:15

(26) ну Выполнить() конечно же

   0xFFFFFF

29 — 30.12.11 — 11:15

(21) а ну или так

   NcSteel

30 — 30.12.11 — 11:16

(27) Почитай его пример . Он получает форму , потом считывает элементы с формы и пытается найти КонтактноеЛицо. Тебе не кажется что это бред ?

   Vasus55

31 — 30.12.11 — 11:18

в общем сутьь такая есть общая форма  на ней два ТП

в первом поле находится выгруженое запросом организация и другие данные, а во втором ТП фио и должность

есть кнопка

по этим трем параметрам мне нужно найти справочник при нажатии кнопки и открыть его,

поэтому я пишу получитьформу что бы как то обратиться к этому справочнику, а через текущие данные считываю организация, фио, должность

суть понятна?

   NcSteel

32 — 30.12.11 — 11:19

(31) Дай обработку на почту.

   GROOVY

33 — 30.12.11 — 11:21

(31) Значит так:

Пишем запрос:

Запрос = Новый Запрос;

Запрос.текст = «ВЫБРАТЬ Ссылка ИЗ Справочник.НАЗВАНИЕСПРАВОЧНИКА ГДЕ РЕКВИЗИТ1 = &Реквизит1 И РЕКВИЗИТ2 = &Реквизит2 (повторять…)»;

Запрос.Установитьпараметр(«Реквизит1», ЗНАЧЕНИЕ);

Запрос.Установитьпараметр(«Реквизит2», ЗНАЧЕНИЕ);

Результат = Запрос.Выполнить();

Если Не Результат.Пустой() Тогда

Выборка = Результат.Выбрать(); Выборка.Следующий();

ОткрытьЗначение(Выборка.Ссылка);

КонецЕсли;

  

Vasus55

34 — 30.12.11 — 11:28

заработаааааааааааааааааааааааааало!!!

Всех с НОВЫМ ГОДОМ!!!!

ВСЕГО ВАМ САМОГО НАИЛУЧШЕГО!!!

При работе с таблицами справочника есть методы НайтиПоРеквизиту и НайтиПоКоду в итоге получаем найденную запись и делаем с ней что хотим. Вопрос как найти получить запись поиском по нескольким реквизитам? Т.е. сделать не Выборку, а именно установить курсор на найденной по нескольким реквизитам записи?

1С 8.2 Мне Запрос не нужен. Необходимо получить для редактирования искомую строку.

по идейным соображениям запрос не нужен?

+4 разрешаю искать перебором, раз запрос не нужен

ну так получи. В чём вопрос то? Есть такой метод… НайтиСтроки…

самое оптимальное запрос с параметром подобно

НайтиСтроки вроде бы ищет только в табличных частях справочника, а не сами записи справочника?

подобно — ни разу не отпимально

ещё в ТЗ. пробегись по выборке, засунь всё в ТЗ, потом ищи строки. раз уж религия такая

а… в справочнике… Запрос. Или в лес. Ну или на Привоз

сам запутался в своём СП. Какая ирония :)

Запросом можно искать, но много писанины (создать запрос, по том перебирать и искать по коду). Этоже самое к примеру в Фоксе можно сделать одной командой (типа Locate for)

зато работает как надо. купи гуся

Выборка конечно лучше получая все поля объекта и помещая в ОЗУ. А запрсом получаем нужные поля. Если поиск по нескольким реквизитам и по трем набранным буквам сделать поиск с помощью объектной модели как то затруднительно.

зачем искать по коду? достаточно правильно создать запрос, тем более текст запроса достаточно «накликать» в конструкторе запросов

потом перебирать? срочно дружись с запросами, у тебя пусто в голове

если ты не любишь Запросы, ты не можешь называть себя одинесником

я! я не люблю! семёрочные. у меня от них начинает кружиться голова и возникает необъяснимое чувство тревоги и страха

таки вперёд на Привоз покупать гуся…

если ты боишься запросов, выпей 50 грамм. Алкоголь притупляет чувство страха

500 будет в самый раз для притупления. только я ж работать не смогу

а ты ещё и работаешь? О_о

поработаешь тут с вами. я в отпуске загораю

бить надо за найтипоКоду и поРеквизиту. Больше ими не пользуйся

Я может чёт не понимаю. После запроса пишем: Выборка=РезультатЗапроса.Выбрать; Выборка — это же виртуальная таблица, а как мне получить реальную запись справочника, не используя Справочник.НайтиПоКоду(Выборка.Код)

Выборка это скорее курсор SQL (ближе к нему) Выборка.Ссылка — если есть конечно поле такое в запросе, дает ссылку на запись справочника

За Выборка.Ссылка спасибо,это понятно. Я не очень 1С — ник. Так что плаваю в структуре языка. А ППЦ в голове у Defender aka

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Помогаю со студенческими работами здесь

Объектно-ориентированный аналог телефонного справочника: поиск по нескольким параметрам одновременно
Здравствуйте! Помогите, пожалуйста, с задачей!

Создать объектно-ориентированный аналог…

Выбор справочника
Добрый день! Пытаюсь реализовать выбор нужного мне справочника, задача стоит если значение…

Хитрый выбор из справочника
Подскажите как сообразить следующий выбор.

Есть вот такой пиклист, с помощью него происходит…

Выбор значаний из справочника
Добрый день!

Скажите, пожалуйста, как решить такую проблему.

Есть документ, в поле которого…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

2

  1. Приветствую
    Конфа 1С 8.3 БП 3.0

    Загрузка документа из Excel

    в обработке требуется произвести поиск на наличие имеющейся номенклатуры по наименованию и номеру ГТД

    Справочники.Номенклатура.НайтиПоРеквизиту(«НомерГТД»,СтрЗаменить(СтрокаТабЧасти.ГТД,» «,» «)); — ничего не дает

    пробую так но Выборка все равно пустая((

    код:
    Запрос = Новый Запрос(«Запрос»);
    Запрос.Текст = «
    |ВЫБРАТЬ
    | Номенклатура.Ссылка
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.Наименование = &Наименование
    | И Номенклатура.НомерГТД = &НомерГТД
    |»;
    Запрос.Параметры.Вставить(«Наименование», Справочники.Номенклатура.НайтиПоНаименованию(СтрЗаменить(СтрокаТабЧасти.НоменклатураФайла,» «,» «),Ложь));
    Запрос.Параметры.Вставить(«НомерГТД», Справочники.НомераГТД.НайтиПоКоду(СтрЗаменить(СтрокаТабЧасти.ГТД,» «,» «),Ложь));

    Выборка = Запрос.Выполнить().Выбрать();

    пока Выборка.Следующий() цикл
    КонецЦикла;


  2. alexburn

    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

    Видимо номер ГТД имеет ссылочный тип, а вы строку используете.


  3. alexburn

    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

    Думаю что ошибка тут:

    Запрос.Параметры.Вставить("НомерГТД", Справочники.НомераГТД.НайтиПоНаименованию(СтрЗаменить(СтрокаТабЧасти.ГТД," "," "),Ложь))

    Вы походу путаете код и наименование.

  4. нет не путаю, почему то выборка пустая хотя номенклатура с наименованием и ГТД есть в справочнике


  5. alexburn

    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

    У вас код элемента справочника ГТД и те, что в экселе, совпадают ????????????


  6. alexburn

    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204


  7. Tiger86

    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104

    вообще начнем с того, что
    метода Вставить что то я не нашла в СП…

    — Объединение сообщений, 8 май 2014

    параметры задавайте как

    Запрос.УстановитьПараметр("ИмяПараметра", ЗанчениеПараметра);
  8. даже через Запрос.УстановитьПараметр не хочет зараза)

    выбираю всю номенклатуру, устанавливаю параметр, а выводиться вся номенклатура все равно(

  9. решил, в параметре НомерГТД указал

    параметр Наименовании не хочет цеплять нивкакую)


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

Понравилась статья? Поделить с друзьями:
  • Boxberry измайловский бульвар 43 часы работы
  • 1с удаление периодических реквизитов на дату
  • Яндекс тариф бизнес требования к автомобилю
  • Boxberry проспект вернадского 39 часы работы
  • 1с узнать значение дополнительного реквизита