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

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

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

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

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

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

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

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

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

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

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

Поиск по двум реквизитам

Я
   YHVVH

05.01.10 — 13:45

А есть ли поиск по двум реквизитам в справочники а точнее по наименованию и + еще один реквизит ?

  

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

   Рэйв

1 — 05.01.10 — 13:46

(0)Хоть 10.
Юзай найти строки и стуктуру

   Defender aka LINN

2 — 05.01.10 — 13:46

Да хоть по всем. Запросом.

   nop

3 — 05.01.10 — 13:46

есть запросом, есть НайтиСтроки (FindRows)
Табличная часть
НайтиСтроки (FindRows)
Синтаксис:
НайтиСтроки(<Параметры отбора>)
Параметры:
<Параметры отбора> (обязательный)
Тип: Структура. Задает условия поиска: ключ структуры определяет имя колонки, по которой будет осуществляться поиск, а значение структуры — искомое значение.
Возвращаемое значение:
Тип: Массив. Массив из строк табличной части, соответствующих заданному условию поиска.
Замечание! Массив хранит ссылки на строки табличной части, то есть при изменении строки в табличной части, значение в массиве тоже будет изменено.

   Defender aka LINN

4 — 05.01.10 — 13:47

(1) Злой ты.

   YHVVH

5 — 05.01.10 — 13:47

а при чем здесь табличная часть?

   YHVVH

6 — 05.01.10 — 13:47

запрос — раз

два?

   Рэйв

7 — 05.01.10 — 13:48

(4)Клевета!:))

   nop

8 — 05.01.10 — 13:49

(6) (3) и есть два.
Или это экзамен по копипасту с СП?

СправочникМенеджер.<Имя справочника> (CatalogManager.<Имя справочника>)
Выбрать (Select)
Синтаксис:
Выбрать(<Родитель>, <Владелец>, <Отбор>, <Порядок>)

   Sadovnikov

9 — 05.01.10 — 13:50

(8) Лень снеговика открывать, но имхается мне, что в Отборе — только одно значение задать можно…

   nop

10 — 05.01.10 — 13:51

(9)  а, ну да

<Отбор> (необязательный)
Тип: Структура. Задает поле и значение отбора открываемой выборки. Ключ структуры описывает имя поля, а значение структуры — значение отбора по этому полю. В качестве полей для отбора могут задаваться только поля «Код», «Наименование» и реквизиты справочника, для которых в конфигураторе признак индексирования установлен в значение «Индексировать» или в значение «Индексировать с доп. упорядоч.».
Важно! Структура может содержать только один элемент.
Если параметр не указан, то отбор не используется

   YHVVH

11 — 05.01.10 — 13:51

<Отбор> (необязательный)

Тип: Структура. Задает поле и значение отбора открываемой выборки. Ключ структуры описывает имя поля, а значение структуры — значение отбора по этому полю. В качестве полей для отбора могут задаваться только поля «Код», «Наименование» и реквизиты справочника, для которых в конфигураторе признак индексирования установлен в значение «Индексировать» или в значение «Индексировать с доп. упорядоч.».

Важно! Структура может содержать только один элемент.

Если параметр не указан, то отбор не используется.

   YHVVH

12 — 05.01.10 — 13:52

ну так запрос — раз

два?

   nop

13 — 05.01.10 — 13:54

(12) тоже запрос! да?

   Sadovnikov

14 — 05.01.10 — 13:54

(12) Ну как же! Поиск по одному реквизиту плюс перебор :)

   YHVVH

15 — 05.01.10 — 13:55

вообщем только запрос получается раз и все

   YHVVH

16 — 05.01.10 — 13:58

спасибо всем

   Sadovnikov

17 — 05.01.10 — 13:59

(16) А чем запрос-то не устраивает? Самое оно же ведь.

   Defender aka LINN

18 — 05.01.10 — 14:00

Выгрузить в ТЗ и (1). Но я ж говорю — злой он :)

В любом случае это будет запрос к БД, так зачем усложнять?

   Рэйв

19 — 05.01.10 — 14:03

(18)Аа!..Точно не добрый:))

   YHVVH

20 — 05.01.10 — 14:04

(17) а ни кто не говорит что ни оно, просто забыл про запрос.

   Sadovnikov

21 — 05.01.10 — 14:04

(20) Эт ты зачем так??? Запорс — это первое, что должно в голову приходить при работе с БД…

   YHVVH

22 — 05.01.10 — 14:05

не с начало пришло НайтиПоРеквизиту

   Sadovnikov

23 — 05.01.10 — 14:06

(22) Зря…

   YHVVH

24 — 05.01.10 — 14:07

может быть

   Sadovnikov

25 — 05.01.10 — 14:07

(24) Да точно! :)

   Irbis

26 — 05.01.10 — 14:08

(22) Семерочное прошлое говорит. Пройдет

   YHVVH

27 — 05.01.10 — 14:14

(26) угу

   Sadovnikov

28 — 05.01.10 — 14:14

(26) А мое семерошное прошлое и настоящее как раз (21) и говорит…

   NcSteel

29 — 05.01.10 — 14:24

А вот три:

Выборка = Справочники.Номенклатура.Выбрать();

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

Если Выборка.Наименование = «Супер товар» И
Выборка.Реквизит = СуперРеквизит Тогда
//Ура нашли , но мало ли продолжаем искать )))
Сообщить(Выборка.Код);
КонецЕсли;

КонецЦикла;

   Sadovnikov

30 — 05.01.10 — 14:26

(29) А теперь в (14) загляни…

   NcSteel

31 — 05.01.10 — 14:28

(30) Дык у меня сразу перебор .

   Sadovnikov

32 — 05.01.10 — 14:28

(31) Точно… Пардон-с…

:)

   YHVVH

33 — 05.01.10 — 14:31

(14) (29) изврат все имхо метод перебор

   Sadovnikov

34 — 05.01.10 — 14:32

(33) Смайлики видишь? А они есть!

  

YHVVH

35 — 05.01.10 — 14:32

(34) :-)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Тэги: 1С 8

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

  1. Уважаемые Гуру 1С 8.1!

    В 1С второй день.

    Для меня все понятно, когда используется поиск только по одному реквизиту (полю) справочника.
    Пример:

    ДоговорСсылка = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию("Основной Договор");
    Если ДоговорСсылка = Справочники.ДоговорыКонтрагентов.ПустаяСсылка() тогда
    НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
    КонецЕсли;
    
    

    А каков самый оптимальный способ поиска например по 2,3-м полям?

    Ведь для справочника Договоров Контрагентов важно как минимум поставить условие по
    1)Организация
    2)Владелец — контрагент

    плиз хелп…
    неужели SQL запрос? или все намного проще?


  2. tirk

    Offline

    tirk
    Опытный в 1С

    Регистрация:
    1 сен 2008
    Сообщения:
    1.142
    Симпатии:
    0
    Баллы:
    26

    Если чего то не знаешь пользуйся встроенной справкой — Ну ОЧЕНЬ полезная чтука…
    а пообще тебе поможет
    Отбор = Новый Структура;

    Или SQL зарпос… очень простой кстати ) Так что выбирайте путь и пробуйте….
    для просто ты написания запроса.. (кстати там есть встроенные уже примеры по справочникам и докам)… скачай обработку «Консоль отчетов»..

    Вложения:


  3. BabySG

    Offline

    BabySG
    Администраторы
    Команда форума
    Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    18
    Баллы:
    29

    Настойчиво рекомендую пользоваться запросом. а не объектной моделью.

    Разница в скорости и удобстве — на порядок. И это даже не вникая в тонкости работы клиент-сервера :)


  4. Эмин

    Offline

    Эмин
    Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    29

    Только запрос, конструктором строится вместе с написанием нужных условий за 30 секунд.


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

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

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

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

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

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

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

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

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

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

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

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

2

У справочников в 1С есть встроенные функции для поиска в них элементов, к ним относится НайтиПоКоду, НайтиПоНаименованию и НайтиПоРеквизиту;

В данном случае рассмотрим поиск по реквизиту. Реквизит может браться любой кроме реквизитов с неограниченной длиной и типом ХранилещеЗначений.

Синтаксис:

Справочники.<НазваниеСправочника>.НайтиПоРеквизиту (<ИмяРекизита>, <Значение>, <Родитель>, <Владелец>)

Параметры:

НазваниеСправочника — наименование справочника, к примеру Сотрудники.

ИмяРекизита — имя реквизита [строка].

Значение — искомое значение реквизита.

Родитель — Ссылка на родителя. Поиск будет вестись только по тем элементам где указан данный родитель. (необязательный)

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

Результат:

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

Если существует несколько элементов, возвращается только 1.

Если реквизит отсутствует в справочнике, то возвращается Неопределено.

Пример:

РеквизитСтаж = 12;
ТекСправочник = Справочники.Преподаватели;
РезультатПоискаПоРеквизиту = ТекСправочник.НайтиПоРеквизиту("Стаж",РеквизитСтаж); 
Если РезультатПоискаПоРеквизиту = ТекСправочник.ПустаяСсылка() Тогда
  Сообщить("Не найден");
Иначе
  Сообщить(РезультатПоискаПоРеквизиту.наименование);
КонецЕсли;

 +6 

   

Распечатать

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

Код 1C v 8.2 УП

 &НаКлиенте
Процедура ПоКнопкеНайти(Команда)
// Вставить содержимое обработчика.

Сообщить(НайтиКонтрагента("000000001"));

КонецПроцедуры

&НаСервере
Функция НайтиКонтрагента(КодКонтрагента)

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

КонецФункции;


Код 1C v 8.х

 // Ниже перечислены несколько способов поиска,если элемент найден, то он возвращается,
// иначе возвращается Неопределено
СпрСотр = Справочники.Сотрудники;
НайденныйСотр = СпрСотр.НайтиПоКоду(123);
НайденныйСотр = СпрСотр.НайтиПоНаименованию("Иванов Иван Иванович");
НайденныйСотр СпрСотр.НайтиПоРеквизиту("Оклад", 5000);

//далее нужно проверить найденное значение так:
РезультатПоиска = Справочники.Номенклатура.НайтиПоКоду("00030");
Если РезультатПоиска.Пустая() Тогда
// Выполнить действия, предусмотренные в случае, когда элемент не найден.
КонецЕсли;
// или так:
НайденныйСотр = СпрСотр.НайтиПоНаименованию("Иванов Иван Иванович");
Если НайденныйСотр = Неопределено Тогда
.....//элемент не найден
КонецЕсли;


Код 1C v 7.x

  СпрСотр = СоздатьОбъект("Справочник.Сотрудники");

СпрСотр.НайтиЭлемент(Сотрудник);
СпрСотр.НайтиПоКоду(123);
СпрСотр.НайтиПоНаименованию("Иванов Иван Иванович");
СпрСотр.НайтиПоРеквизиту("Оклад", 5000);

//если элемент найден, он становится текущим и его можно прочитать так:
Если СпрСотр.НайтиПоНаименованию("Иванов Иван Иванович")=1 Тогда
........НайденныйСотр = СпрСотр.ТекущийЭлемент();
КонецЕсли;

//еще пример
спр=СоздатьОбъект("Справочник.Материалы");
Если спр.НайтиПоНаименованию("Пряжа шерстяная")=1 Тогда
Предупреждение("Найденный элемент справочника имеет код "+спр.ТекущийЭлемент().Код);
Иначе
Предупреждение("Элемент с заданным наименованием не найден");
КонецЕсли;

Понравилась статья? Поделить с друзьями:

Другие крутые статьи на нашем сайте:

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии