Стояла задача найти Конрагента в справочнике по ИНН и КПП (кто знает, что такое обособленное подразделение, поймет). Логика проста — найти по ИНН, сверить КПП, если нет добавить.
Найдено=Справочники.Контрагенты.НайтиПоРеквезиту(«ИНН»,ИскомыйИНН);
Если Найден=Справочники.Контрагенты.ПустаяСсылка() Тогда
//СОЗДАТЬ КОНТРАГЕНТА
Иначе
Если Найдено.КПП=ИскомыйКПП Тогда
Сообщить(«Найден филиал контрагента»);
Иначе
//СОЗДАТЬ ФИЛИАЛ КОНТРАГЕНТА
КонецЕсли;
КонецЕсли;
И тут фэйл, мои дорогие, если в справочнике существует и филиал и ГО, то он кого-то по-любому не найдет. А все кроется в:
Возвращаемое
значение:
Тип: СправочникСсылка.
Ссылка на найденный элемент справочника. Если не существует ни одного
элемента с требуемым значением реквизита, то будет возвращена пустая ссылка.
Если найдено более одного, функция вернет только первое вхождение…неприятно, однако…
Пошел искать другие пути и набрел на два варианта:
Выборка()
ПараметрПоискаИННОтбор=Новый Структура;ПараметрПоискаИННОтбор.Вставить(«ИНН»,ИскомыйИНН);
Выборка=справочники.контрагенты.Выбрать(,,ПараметрПоискаИННОтбор);
Пока Выборка.Следующий() Цикл
КППНайден=Ложь;
Если Выборка.КПП=ИскомыйКПП Тогда
Сообщить(«Найден филиал контрагента»);
КППНайден=Истина;
Прервать;
//Мне дальше не нужно
КонецЕсли;
КонецЦикла;
Если КППНайден=Ложь Тогда
//СОЗДАТЬ ФИЛИАЛ КОНТРАГЕНТА
КонецЕсли;
И второй
Новый Запрос
ЗапросПоискИНН=Новый Запрос(«ЗапросПоискИНН»);ЗапросПоискИНН.Текст=«ВЫБРАТЬ
|Контрагенты.Ссылка
|ИЗ
|Справочник.Контрагенты КАК Контрагенты
|ГДЕ
|Контрагенты.ИНН = &ИНН»;
ЗапросПоискИНН.Параметры.Вставить(«ИНН»,ИскомыйКПП);
Выборка=ЗапросПоискИНН.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
КППНайден=Ложь;
Если Выборка.КПП=ИскомыйКПП Тогда
Сообщить(«Найден филиал контрагента»);
КППНайден=Истина;
Прервать;
//Мне дальше не нужно
КонецЕсли;
КонецЦикла;
Если КППНайден=Ложь Тогда
//СОЗДАТЬ ФИЛИАЛ КОНТРАГЕНТА
КонецЕсли;
В Запросе можно добавить еще один параметр, чего не сделаешь в Выборке.
Но, у обоих вариантов есть минус, а именно:
Если Выборка.Следующий()=Справочники.Контрагенты.ПустаяСсылка() Тогда
//ЧЕГО ТО ТАМ;
КонецЕсли;
А дальше цикл ПокаЦикл. Блок «если», в этом случае, съест первую итерацию, и потом может кого-то обломать.
Короче, вся эта фигня к тому, что не надо использовать Выборка.Следующий() как условие, можно проверить по Выборка.Количество() или Выборка.Пустой().
Поиск по двум реквизитам |
Я |
05.01.10 — 13:45
А есть ли поиск по двум реквизитам в справочники а точнее по наименованию и + еще один реквизит ?
1 — 05.01.10 — 13:46
(0)Хоть 10.
Юзай найти строки и стуктуру
2 — 05.01.10 — 13:46
Да хоть по всем. Запросом.
3 — 05.01.10 — 13:46
есть запросом, есть НайтиСтроки (FindRows)
Табличная часть
НайтиСтроки (FindRows)
Синтаксис:
НайтиСтроки(<Параметры отбора>)
Параметры:
<Параметры отбора> (обязательный)
Тип: Структура. Задает условия поиска: ключ структуры определяет имя колонки, по которой будет осуществляться поиск, а значение структуры — искомое значение.
Возвращаемое значение:
Тип: Массив. Массив из строк табличной части, соответствующих заданному условию поиска.
Замечание! Массив хранит ссылки на строки табличной части, то есть при изменении строки в табличной части, значение в массиве тоже будет изменено.
4 — 05.01.10 — 13:47
(1) Злой ты.
5 — 05.01.10 — 13:47
а при чем здесь табличная часть?
6 — 05.01.10 — 13:47
запрос — раз
два?
7 — 05.01.10 — 13:48
(4)Клевета!:))
8 — 05.01.10 — 13:49
(6) (3) и есть два.
Или это экзамен по копипасту с СП?
СправочникМенеджер.<Имя справочника> (CatalogManager.<Имя справочника>)
Выбрать (Select)
Синтаксис:
Выбрать(<Родитель>, <Владелец>, <Отбор>, <Порядок>)
9 — 05.01.10 — 13:50
(8) Лень снеговика открывать, но имхается мне, что в Отборе — только одно значение задать можно…
10 — 05.01.10 — 13:51
(9) а, ну да
<Отбор> (необязательный)
Тип: Структура. Задает поле и значение отбора открываемой выборки. Ключ структуры описывает имя поля, а значение структуры — значение отбора по этому полю. В качестве полей для отбора могут задаваться только поля «Код», «Наименование» и реквизиты справочника, для которых в конфигураторе признак индексирования установлен в значение «Индексировать» или в значение «Индексировать с доп. упорядоч.».
Важно! Структура может содержать только один элемент.
Если параметр не указан, то отбор не используется
11 — 05.01.10 — 13:51
<Отбор> (необязательный)
Тип: Структура. Задает поле и значение отбора открываемой выборки. Ключ структуры описывает имя поля, а значение структуры — значение отбора по этому полю. В качестве полей для отбора могут задаваться только поля «Код», «Наименование» и реквизиты справочника, для которых в конфигураторе признак индексирования установлен в значение «Индексировать» или в значение «Индексировать с доп. упорядоч.».
Важно! Структура может содержать только один элемент.
Если параметр не указан, то отбор не используется.
12 — 05.01.10 — 13:52
ну так запрос — раз
два?
13 — 05.01.10 — 13:54
(12) тоже запрос! да?
14 — 05.01.10 — 13:54
(12) Ну как же! Поиск по одному реквизиту плюс перебор
15 — 05.01.10 — 13:55
вообщем только запрос получается раз и все
16 — 05.01.10 — 13:58
спасибо всем
17 — 05.01.10 — 13:59
(16) А чем запрос-то не устраивает? Самое оно же ведь.
18 — 05.01.10 — 14:00
Выгрузить в ТЗ и (1). Но я ж говорю — злой он
В любом случае это будет запрос к БД, так зачем усложнять?
19 — 05.01.10 — 14:03
(18)Аа!..Точно не добрый:))
20 — 05.01.10 — 14:04
(17) а ни кто не говорит что ни оно, просто забыл про запрос.
21 — 05.01.10 — 14:04
(20) Эт ты зачем так??? Запорс — это первое, что должно в голову приходить при работе с БД…
22 — 05.01.10 — 14:05
не с начало пришло НайтиПоРеквизиту
23 — 05.01.10 — 14:06
(22) Зря…
24 — 05.01.10 — 14:07
может быть
25 — 05.01.10 — 14:07
(24) Да точно!
26 — 05.01.10 — 14:08
(22) Семерочное прошлое говорит. Пройдет
27 — 05.01.10 — 14:14
(26) угу
28 — 05.01.10 — 14:14
(26) А мое семерошное прошлое и настоящее как раз (21) и говорит…
29 — 05.01.10 — 14:24
А вот три:
Выборка = Справочники.Номенклатура.Выбрать();
Пока выборка.Следующий() Цикл
Если Выборка.Наименование = «Супер товар» И
Выборка.Реквизит = СуперРеквизит Тогда
//Ура нашли , но мало ли продолжаем искать )))
Сообщить(Выборка.Код);
КонецЕсли;
КонецЦикла;
30 — 05.01.10 — 14:26
(29) А теперь в (14) загляни…
31 — 05.01.10 — 14:28
(30) Дык у меня сразу перебор .
32 — 05.01.10 — 14:28
(31) Точно… Пардон-с…
33 — 05.01.10 — 14:31
(14) (29) изврат все имхо метод перебор
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С 8.1!
В 1С второй день.
Для меня все понятно, когда используется поиск только по одному реквизиту (полю) справочника.
Пример:ДоговорСсылка = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию("Основной Договор"); Если ДоговорСсылка = Справочники.ДоговорыКонтрагентов.ПустаяСсылка() тогда НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент(); КонецЕсли;
А каков самый оптимальный способ поиска например по 2,3-м полям?
Ведь для справочника Договоров Контрагентов важно как минимум поставить условие по
1)Организация
2)Владелец — контрагентплиз хелп…
неужели SQL запрос? или все намного проще? -
Offline
tirk
Опытный в 1С- Регистрация:
- 1 сен 2008
- Сообщения:
- 1.142
- Симпатии:
- 0
- Баллы:
- 26
Если чего то не знаешь пользуйся встроенной справкой — Ну ОЧЕНЬ полезная чтука…
а пообще тебе поможет
Отбор = Новый Структура;Или SQL зарпос… очень простой кстати ) Так что выбирайте путь и пробуйте….
для просто ты написания запроса.. (кстати там есть встроенные уже примеры по справочникам и докам)… скачай обработку «Консоль отчетов»..Вложения:
-
Offline
BabySG
Администраторы
Команда форума
Администратор- Регистрация:
- 10 июн 2007
- Сообщения:
- 11.853
- Симпатии:
- 18
- Баллы:
- 29
Настойчиво рекомендую пользоваться запросом. а не объектной моделью.
Разница в скорости и удобстве — на порядок. И это даже не вникая в тонкости работы клиент-сервера
-
Offline
Эмин
Руководитель проектов- Регистрация:
- 25 май 2007
- Сообщения:
- 1.178
- Симпатии:
- 1
- Баллы:
- 29
Только запрос, конструктором строится вместе с написанием нужных условий за 30 секунд.
Помогаю со студенческими работами здесь
Объектно-ориентированный аналог телефонного справочника: поиск по нескольким параметрам одновременно
Здравствуйте! Помогите, пожалуйста, с задачей!
Создать объектно-ориентированный аналог…
Выбор справочника
Добрый день! Пытаюсь реализовать выбор нужного мне справочника, задача стоит если значение…
Хитрый выбор из справочника
Подскажите как сообразить следующий выбор.
Есть вот такой пиклист, с помощью него происходит…
Выбор значаний из справочника
Добрый день!
Скажите, пожалуйста, как решить такую проблему.
Есть документ, в поле которого…
Искать еще темы с ответами
Или воспользуйтесь поиском по форуму:
2
У справочников в 1С есть встроенные функции для поиска в них элементов, к ним относится НайтиПоКоду, НайтиПоНаименованию и НайтиПоРеквизиту;
В данном случае рассмотрим поиск по реквизиту. Реквизит может браться любой кроме реквизитов с неограниченной длиной и типом ХранилещеЗначений.
Синтаксис:
Справочники.<НазваниеСправочника>.НайтиПоРеквизиту (<ИмяРекизита>, <Значение>, <Родитель>, <Владелец>)
Параметры:
НазваниеСправочника — наименование справочника, к примеру Сотрудники.
ИмяРекизита — имя реквизита [строка].
Значение — искомое значение реквизита.
Родитель — Ссылка на родителя. Поиск будет вестись только по тем элементам где указан данный родитель. (необязательный)
Владелец — Ссылка на элемент владельца справочника, указанного на закладке Владельцы. (необязательный)
Результат:
Если элемент не найден возвращается ПустаяСсылка, иначе ссылка на элемент.
Если существует несколько элементов, возвращается только 1.
Если реквизит отсутствует в справочнике, то возвращается Неопределено.
Пример:
РеквизитСтаж = 12; ТекСправочник = Справочники.Преподаватели; РезультатПоискаПоРеквизиту = ТекСправочник.НайтиПоРеквизиту("Стаж",РеквизитСтаж); Если РезультатПоискаПоРеквизиту = ТекСправочник.ПустаяСсылка() Тогда Сообщить("Не найден"); Иначе Сообщить(РезультатПоискаПоРеквизиту.наименование); КонецЕсли;
+6
Поиск элемента, найти элемент справочника
&НаКлиенте
Процедура ПоКнопкеНайти(Команда)
// Вставить содержимое обработчика.
Сообщить(НайтиКонтрагента("000000001"));
КонецПроцедуры
&НаСервере
Функция НайтиКонтрагента(КодКонтрагента)
Перем КонрагентДляПоиска, СсылкаНайденногоКонрагента;
КонрагентДляПоиска = Справочники.Контрагенты;
СсылкаНайденногоКонрагента = КонрагентДляПоиска.НайтиПоКоду(КодКонтрагента);
Если СсылкаНайденногоКонрагента = КонрагентДляПоиска.ПустаяСсылка() Тогда
Возврат "Контрагент не найден";
Иначе
Возврат СсылкаНайденногоКонрагента.Наименование;
КонецЕсли;
КонецФункции;
Код 1C v 8.х
// Ниже перечислены несколько способов поиска,если элемент найден, то он возвращается,
// иначе возвращается Неопределено
СпрСотр = Справочники.Сотрудники;
НайденныйСотр = СпрСотр.НайтиПоКоду(123);
НайденныйСотр = СпрСотр.НайтиПоНаименованию("Иванов Иван Иванович");
НайденныйСотр СпрСотр.НайтиПоРеквизиту("Оклад", 5000);
//далее нужно проверить найденное значение так:
РезультатПоиска = Справочники.Номенклатура.НайтиПоКоду("00030");
Если РезультатПоиска.Пустая() Тогда
// Выполнить действия, предусмотренные в случае, когда элемент не найден.
КонецЕсли;
// или так:
НайденныйСотр = СпрСотр.НайтиПоНаименованию("Иванов Иван Иванович");
Если НайденныйСотр = Неопределено Тогда
.....//элемент не найден
КонецЕсли;
Код 1C v 7.x
СпрСотр = СоздатьОбъект("Справочник.Сотрудники");
СпрСотр.НайтиЭлемент(Сотрудник);
СпрСотр.НайтиПоКоду(123);
СпрСотр.НайтиПоНаименованию("Иванов Иван Иванович");
СпрСотр.НайтиПоРеквизиту("Оклад", 5000);
//если элемент найден, он становится текущим и его можно прочитать так:
Если СпрСотр.НайтиПоНаименованию("Иванов Иван Иванович")=1 Тогда
........НайденныйСотр = СпрСотр.ТекущийЭлемент();
КонецЕсли;
//еще пример
спр=СоздатьОбъект("Справочник.Материалы");
Если спр.НайтиПоНаименованию("Пряжа шерстяная")=1 Тогда
Предупреждение("Найденный элемент справочника имеет код "+спр.ТекущийЭлемент().Код);
Иначе
Предупреждение("Элемент с заданным наименованием не найден");
КонецЕсли;