Стояла задача найти Конрагента в справочнике по ИНН и КПП (кто знает, что такое обособленное подразделение, поймет). Логика проста — найти по ИНН, сверить КПП, если нет добавить.
Найдено=Справочники.Контрагенты.НайтиПоРеквезиту(«ИНН»,ИскомыйИНН);
Если Найден=Справочники.Контрагенты.ПустаяСсылка() Тогда
//СОЗДАТЬ КОНТРАГЕНТА
Иначе
Если Найдено.КПП=ИскомыйКПП Тогда
Сообщить(«Найден филиал контрагента»);
Иначе
//СОЗДАТЬ ФИЛИАЛ КОНТРАГЕНТА
КонецЕсли;
КонецЕсли;
И тут фэйл, мои дорогие, если в справочнике существует и филиал и ГО, то он кого-то по-любому не найдет. А все кроется в:
Возвращаемое
значение:
Тип: СправочникСсылка.
Ссылка на найденный элемент справочника. Если не существует ни одного
элемента с требуемым значением реквизита, то будет возвращена пустая ссылка.
Если найдено более одного, функция вернет только первое вхождение…неприятно, однако…
Пошел искать другие пути и набрел на два варианта:
Выборка()
ПараметрПоискаИННОтбор=Новый Структура;ПараметрПоискаИННОтбор.Вставить(«ИНН»,ИскомыйИНН);
Выборка=справочники.контрагенты.Выбрать(,,ПараметрПоискаИННОтбор);
Пока Выборка.Следующий() Цикл
КППНайден=Ложь;
Если Выборка.КПП=ИскомыйКПП Тогда
Сообщить(«Найден филиал контрагента»);
КППНайден=Истина;
Прервать;
//Мне дальше не нужно
КонецЕсли;
КонецЦикла;
Если КППНайден=Ложь Тогда
//СОЗДАТЬ ФИЛИАЛ КОНТРАГЕНТА
КонецЕсли;
И второй
Новый Запрос
ЗапросПоискИНН=Новый Запрос(«ЗапросПоискИНН»);ЗапросПоискИНН.Текст=«ВЫБРАТЬ
|Контрагенты.Ссылка
|ИЗ
|Справочник.Контрагенты КАК Контрагенты
|ГДЕ
|Контрагенты.ИНН = &ИНН»;
ЗапросПоискИНН.Параметры.Вставить(«ИНН»,ИскомыйКПП);
Выборка=ЗапросПоискИНН.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
КППНайден=Ложь;
Если Выборка.КПП=ИскомыйКПП Тогда
Сообщить(«Найден филиал контрагента»);
КППНайден=Истина;
Прервать;
//Мне дальше не нужно
КонецЕсли;
КонецЦикла;
Если КППНайден=Ложь Тогда
//СОЗДАТЬ ФИЛИАЛ КОНТРАГЕНТА
КонецЕсли;
В Запросе можно добавить еще один параметр, чего не сделаешь в Выборке.
Но, у обоих вариантов есть минус, а именно:
Если Выборка.Следующий()=Справочники.Контрагенты.ПустаяСсылка() Тогда
//ЧЕГО ТО ТАМ;
КонецЕсли;
А дальше цикл ПокаЦикл. Блок «если», в этом случае, съест первую итерацию, и потом может кого-то обломать.
Короче, вся эта фигня к тому, что не надо использовать Выборка.Следующий() как условие, можно проверить по Выборка.Количество() или Выборка.Пустой().
поиск по нескольким реквизитам |
Я |
30.12.11 — 10:52
как можно осущиствить поиск справочника по нескольким реквизитам(3) и открыть его
1 — 30.12.11 — 10:54
запросом
2 — 30.12.11 — 10:56
а как именно?
3 — 30.12.11 — 10:58
(2) написать запрос
4 — 30.12.11 — 10:58
(2) ну запросом же
5 — 30.12.11 — 10:59
в запросе ссылку на этот справочник только передавать?
6 — 30.12.11 — 10:59
(5) хы
7 — 30.12.11 — 11:00
(5) зачем тебе тогда искать если ты его передавать собрался ?
8 — 30.12.11 — 11:00
(5) как твоей душеньке угодно будет
запрос штука такая: хош на этот, хош на тот
9 — 30.12.11 — 11:00
или все данные справочника?
10 — 30.12.11 — 11:00
PS че-нить да выдаст
11 — 30.12.11 — 11:01
Select RRef From Catalog2345 Where //Твое условие.
12 — 30.12.11 — 11:03
ВЫБРАТЬ Партии.Ссылка КАК Ссылка Из Справочник.Партии КАК Партии ГДЕ Партии.Жуликов И Партии.Воров
13 — 30.12.11 — 11:05
вот так накидал
форма=Справочники.КонтакныеЛица.ПолучитьФорму(«ФормаЭлемента»);
организация=ЭлементыФормы.ТабличноеПоле1.ТекущиеДанные.Организация;
ФИО=ЭлементыФормы.ТабличноеПоле3.ТекущиеДанные.ФИО;
Должность=ЭлементыФормы.ТабличноеПоле3.ТекущиеДанные.Должность;
запрос = Новый Запрос;
Запрос.Текст= «ВЫБРАТЬ
| КонтакныеЛица.Код,
| КонтакныеЛица.Наименование,
| КонтакныеЛица.ФИО,
| КонтакныеЛица.Должность,
| КонтакныеЛица.ТелефонРабочий,
| КонтакныеЛица.ТелефонСотовый,
| КонтакныеЛица.EMail,
| КонтакныеЛица.Комментарий
|ИЗ
| Справочник.КонтакныеЛица КАК КонтакныеЛица
|ГДЕ
| КонтакныеЛица.Наименование = &Наименование
| И КонтакныеЛица.ФИО ПОДОБНО &ФИО
| И КонтакныеЛица.Должность = &Должность» ;
запрос.УстановитьПараметр(«Наименование»,организация);
запрос.УстановитьПараметр(«ФИО»,ФИО);
запрос.УстановитьПараметр(«Должность»,Должность);
результат=запрос.Выполнить();
а вот дальше как открыть этот справочник?
14 — 30.12.11 — 11:06
мля, ты человеческим языком объясни, что тебе сделать-то надо?
15 — 30.12.11 — 11:07
и не путай справочник с элементами справочника
16 — 30.12.11 — 11:08
ой не то сделал
во так форма=Справочники.КонтакныеЛица.ПолучитьФорму(«ФормаЭлемента»);
организация=ЭлементыФормы.ТабличноеПоле1.ТекущиеДанные.Организация;
ФИО=ЭлементыФормы.ТабличноеПоле3.ТекущиеДанные.ФИО;
Должность=ЭлементыФормы.ТабличноеПоле3.ТекущиеДанные.Должность;
запрос = Новый Запрос;
Запрос.Текст= «ВЫБРАТЬ
| КонтакныеЛица.Ссылка КАК Ссылка
|ИЗ
| Справочник.КонтакныеЛица КАК КонтакныеЛица
|ГДЕ
| КонтакныеЛица.Наименование = &Наименование
| И КонтакныеЛица.ФИО ПОДОБНО &ФИО
| И КонтакныеЛица.Должность = &Должность» ;
запрос.УстановитьПараметр(«Наименование»,организация);
запрос.УстановитьПараметр(«ФИО»,ФИО);
запрос.УстановитьПараметр(«Должность»,Должность);
результат=запрос.Выполнить();
17 — 30.12.11 — 11:09
а устанавливать параметр надо в моем случае?
18 — 30.12.11 — 11:09
(16) опять не то
19 — 30.12.11 — 11:10
параметры откуда получать надо?
20 — 30.12.11 — 11:11
(16)
Выборка = Запрос.Выполнить.Выбрать();
Пока Выборка.Следующий() Цикл
Выборка.Ссылка.ПолучитьФорму().Открыть();
прервать;/предполагаем что элемент один
КонецЦикла;
21 — 30.12.11 — 11:12
(20) это что за народное творчество?
Если Выборка.Следующий()
22 — 30.12.11 — 11:12
(16)
Тебе надо текущее значение контактного лица в списке справочника получить что ли?
Тогда это будет:
ТекКонтактноеЛицо = ЭлементыФормы.ТабличноеПоле1.ТекущиеДанные;
23 — 30.12.11 — 11:12
+(21) а вообще, предполагать в таком случае плохо
24 — 30.12.11 — 11:12
форма=Справочники.КонтакныеЛица.ПолучитьФорму(«ФормаЭлемента»); — Что ты хочешь этим сделать ?
И задачу давай описывай полностью.
25 — 30.12.11 — 11:13
(21) это ты где это прочитал?
26 — 30.12.11 — 11:14
Поле объекта не обнаружено (Выполнить)
27 — 30.12.11 — 11:14
(23) может у автора контроль по наименованию и ФИО на уникальность при записи.
Он ведь ставит задачу открыть элемент, а не показать список
28 — 30.12.11 — 11:15
(26) ну Выполнить() конечно же
29 — 30.12.11 — 11:15
(21) а ну или так
30 — 30.12.11 — 11:16
(27) Почитай его пример . Он получает форму , потом считывает элементы с формы и пытается найти КонтактноеЛицо. Тебе не кажется что это бред ?
31 — 30.12.11 — 11:18
в общем сутьь такая есть общая форма на ней два ТП
в первом поле находится выгруженое запросом организация и другие данные, а во втором ТП фио и должность
есть кнопка
по этим трем параметрам мне нужно найти справочник при нажатии кнопки и открыть его,
поэтому я пишу получитьформу что бы как то обратиться к этому справочнику, а через текущие данные считываю организация, фио, должность
суть понятна?
32 — 30.12.11 — 11:19
(31) Дай обработку на почту.
33 — 30.12.11 — 11:21
(31) Значит так:
Пишем запрос:
Запрос = Новый Запрос;
Запрос.текст = «ВЫБРАТЬ Ссылка ИЗ Справочник.НАЗВАНИЕСПРАВОЧНИКА ГДЕ РЕКВИЗИТ1 = &Реквизит1 И РЕКВИЗИТ2 = &Реквизит2 (повторять…)»;
Запрос.Установитьпараметр(«Реквизит1», ЗНАЧЕНИЕ);
Запрос.Установитьпараметр(«Реквизит2», ЗНАЧЕНИЕ);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать(); Выборка.Следующий();
ОткрытьЗначение(Выборка.Ссылка);
КонецЕсли;
Vasus55
34 — 30.12.11 — 11:28
заработаааааааааааааааааааааааааало!!!
Всех с НОВЫМ ГОДОМ!!!!
ВСЕГО ВАМ САМОГО НАИЛУЧШЕГО!!!
Запрос к справочнику по нескольким реквизитам
Автор Keen Gaff, 20 окт 2020, 19:32
0 Пользователей и 1 гость просматривают эту тему.
Доброго дня.
Платформа 8.3.16, конфигурация самописная + БСП 3.
Пытаюсь найти запись в справочнике запросом по нескольким реквизитам.
Запрос1.Текст =
"ВЫБРАТЬ
| Показатели.Ссылка КАК Ссылка
|ИЗ
| Справочник.Показатели КАК Показатели
|ГДЕ
| Показатели.Наименование = &Наименование
| И Показатели.ДопустимыйУровень = &ДопустимыйУровень
| И Показатели.НДНаИзмерения = &НДНаИзмерения
| И Показатели.ГруппаОбразцов = &ГруппаОбразцов";
Запрос1.УстановитьПараметр("Наименование", Показатель); //строка
Запрос1.УстановитьПараметр("ДопустимыйУровень", ДопУровень); //строка
Запрос1.УстановитьПараметр("НДНаИзмерения", НДНаИзмерения); //справочник.ссылка
Запрос1.УстановитьПараметр("ГруппаОбразцов", ГруппаОбразца); //справочник.ссылка
Результат пустой… не находит (хотя точно есть)).
Консоль запросов тоже не находит.
В чем может быть беда?
совет , получите данные сначала без параметров, т.е. это будут очевидно все ссылка этого справочника.
потом добавьте один параметр. Если сработает, добавтье следующий и т.д.
Использую учебную платформу 1С:Предприятие 8.3
Цитата: Keen Gaff от 20 окт 2020, 19:32
Доброго дня.
Платформа 8.3.16, конфигурация самописная + БСП 3.
Пытаюсь найти запись в справочнике запросом по нескольким реквизитам.Запрос1.Текст =
"ВЫБРАТЬ
| Показатели.Ссылка КАК Ссылка
|ИЗ
| Справочник.Показатели КАК Показатели
|ГДЕ
| Показатели.Наименование = &Наименование
| И Показатели.ДопустимыйУровень = &ДопустимыйУровень
| И Показатели.НДНаИзмерения = &НДНаИзмерения
| И Показатели.ГруппаОбразцов = &ГруппаОбразцов";
Запрос1.УстановитьПараметр("Наименование", Показатель); //строка
Запрос1.УстановитьПараметр("ДопустимыйУровень", ДопУровень); //строка
Запрос1.УстановитьПараметр("НДНаИзмерения", НДНаИзмерения); //справочник.ссылка
Запрос1.УстановитьПараметр("ГруппаОбразцов", ГруппаОбразца); //справочник.ссылка
Результат пустой… не находит (хотя точно есть)).
Консоль запросов тоже не находит.
В чем может быть беда?
Показатель.Наименование = &Наименование — это очень скользкий параметр. Ошибетесь в немного и ни чего уже не найдено, используйте уж тогда ПОДОБНО. Так же и с Показатели.ДопустимыйУровень = &ДопустимыйУровень.
Спасибо, попробовал.
в консоли находит по трем (если не использовать параметр «НДНаИзмерения»)
по одному параметру «НДНаИзмерения» тоже не находит… буду смотреть что с ним не так…
Добавлено: 20 окт 2020, 22:34
Цитата: DmitriyF от 20 окт 2020, 19:41
Показатель.Наименование = &Наименование — это очень скользкий параметр…
дублирование убрал… не помогло
выяснилось (через консоль запросов) странно работает условие по реквизиту ссылочного типа НДНаИзмерение,
выбираю одну запись справочника, запрос срабатывает, если другую то пусто… как так?
При работе с таблицами справочника есть методы НайтиПоРеквизиту и НайтиПоКоду в итоге получаем найденную запись и делаем с ней что хотим. Вопрос как найти получить запись поиском по нескольким реквизитам? Т.е. сделать не Выборку, а именно установить курсор на найденной по нескольким реквизитам записи?
1С 8.2 Мне Запрос не нужен. Необходимо получить для редактирования искомую строку.
по идейным соображениям запрос не нужен?
+4 разрешаю искать перебором, раз запрос не нужен
ну так получи. В чём вопрос то? Есть такой метод… НайтиСтроки…
самое оптимальное запрос с параметром подобно
НайтиСтроки вроде бы ищет только в табличных частях справочника, а не сами записи справочника?
подобно — ни разу не отпимально
ещё в ТЗ. пробегись по выборке, засунь всё в ТЗ, потом ищи строки. раз уж религия такая
а… в справочнике… Запрос. Или в лес. Ну или на Привоз
сам запутался в своём СП. Какая ирония
Запросом можно искать, но много писанины (создать запрос, по том перебирать и искать по коду). Этоже самое к примеру в Фоксе можно сделать одной командой (типа Locate for)
зато работает как надо. купи гуся
Выборка конечно лучше получая все поля объекта и помещая в ОЗУ. А запрсом получаем нужные поля. Если поиск по нескольким реквизитам и по трем набранным буквам сделать поиск с помощью объектной модели как то затруднительно.
зачем искать по коду? достаточно правильно создать запрос, тем более текст запроса достаточно «накликать» в конструкторе запросов
потом перебирать? срочно дружись с запросами, у тебя пусто в голове
если ты не любишь Запросы, ты не можешь называть себя одинесником
я! я не люблю! семёрочные. у меня от них начинает кружиться голова и возникает необъяснимое чувство тревоги и страха
таки вперёд на Привоз покупать гуся…
если ты боишься запросов, выпей 50 грамм. Алкоголь притупляет чувство страха
500 будет в самый раз для притупления. только я ж работать не смогу
а ты ещё и работаешь? О_о
поработаешь тут с вами. я в отпуске загораю
бить надо за найтипоКоду и поРеквизиту. Больше ими не пользуйся
Я может чёт не понимаю. После запроса пишем: Выборка=РезультатЗапроса.Выбрать; Выборка — это же виртуальная таблица, а как мне получить реальную запись справочника, не используя Справочник.НайтиПоКоду(Выборка.Код)
Выборка это скорее курсор SQL (ближе к нему) Выборка.Ссылка — если есть конечно поле такое в запросе, дает ссылку на запись справочника
За Выборка.Ссылка спасибо,это понятно. Я не очень 1С — ник. Так что плаваю в структуре языка. А ППЦ в голове у Defender aka
Тэги: 1С 8
Комментарии доступны только авторизированным пользователям
У справочников в 1С есть встроенные функции для поиска в них элементов, к ним относится НайтиПоКоду, НайтиПоНаименованию и НайтиПоРеквизиту;
В данном случае рассмотрим поиск по реквизиту. Реквизит может браться любой кроме реквизитов с неограниченной длиной и типом ХранилещеЗначений.
Синтаксис:
Справочники.<НазваниеСправочника>.НайтиПоРеквизиту (<ИмяРекизита>, <Значение>, <Родитель>, <Владелец>)
Параметры:
НазваниеСправочника — наименование справочника, к примеру Сотрудники.
ИмяРекизита — имя реквизита [строка].
Значение — искомое значение реквизита.
Родитель — Ссылка на родителя. Поиск будет вестись только по тем элементам где указан данный родитель. (необязательный)
Владелец — Ссылка на элемент владельца справочника, указанного на закладке Владельцы. (необязательный)
Результат:
Если элемент не найден возвращается ПустаяСсылка, иначе ссылка на элемент.
Если существует несколько элементов, возвращается только 1.
Если реквизит отсутствует в справочнике, то возвращается Неопределено.
Пример:
РеквизитСтаж = 12; ТекСправочник = Справочники.Преподаватели; РезультатПоискаПоРеквизиту = ТекСправочник.НайтиПоРеквизиту("Стаж",РеквизитСтаж); Если РезультатПоискаПоРеквизиту = ТекСправочник.ПустаяСсылка() Тогда Сообщить("Не найден"); Иначе Сообщить(РезультатПоискаПоРеквизиту.наименование); КонецЕсли;
+6
1С 8.3 : Поиск элемента, найти элемент справочника
&НаКлиенте
Процедура ПоКнопкеНайти(Команда)
// Вставить содержимое обработчика.
Сообщить(НайтиКонтрагента("000000001"));
КонецПроцедуры
&НаСервере
Функция НайтиКонтрагента(КодКонтрагента)
Перем КонрагентДляПоиска, СсылкаНайденногоКонрагента;
КонрагентДляПоиска = Справочники.Контрагенты;
СсылкаНайденногоКонрагента = КонрагентДляПоиска.НайтиПоКоду(КодКонтрагента);
Если СсылкаНайденногоКонрагента = КонрагентДляПоиска.ПустаяСсылка() Тогда
Возврат "Контрагент не найден";
Иначе
Возврат СсылкаНайденногоКонрагента.Наименование;
КонецЕсли;
КонецФункции;
Код 1C v 8.х
// Ниже перечислены несколько способов поиска,если элемент найден, то он возвращается,
// иначе возвращается Неопределено
СпрСотр = Справочники.Сотрудники;
НайденныйСотр = СпрСотр.НайтиПоКоду(123);
НайденныйСотр = СпрСотр.НайтиПоНаименованию("Иванов Иван Иванович");
НайденныйСотр СпрСотр.НайтиПоРеквизиту("Оклад", 5000);
//далее нужно проверить найденное значение так:
РезультатПоиска = Справочники.Номенклатура.НайтиПоКоду("00030");
Если РезультатПоиска.Пустая() Тогда
// Выполнить действия, предусмотренные в случае, когда элемент не найден.
КонецЕсли;
// или так:
НайденныйСотр = СпрСотр.НайтиПоНаименованию("Иванов Иван Иванович");
Если НайденныйСотр = Неопределено Тогда
.....//элемент не найден
КонецЕсли;
Код 1C v 7.x
СпрСотр = СоздатьОбъект("Справочник.Сотрудники");
СпрСотр.НайтиЭлемент(Сотрудник);
СпрСотр.НайтиПоКоду(123);
СпрСотр.НайтиПоНаименованию("Иванов Иван Иванович");
СпрСотр.НайтиПоРеквизиту("Оклад", 5000);
//если элемент найден, он становится текущим и его можно прочитать так:
Если СпрСотр.НайтиПоНаименованию("Иванов Иван Иванович")=1 Тогда
........НайденныйСотр = СпрСотр.ТекущийЭлемент();
КонецЕсли;
//еще пример
спр=СоздатьОбъект("Справочник.Материалы");
Если спр.НайтиПоНаименованию("Пряжа шерстяная")=1 Тогда
Предупреждение("Найденный элемент справочника имеет код "+спр.ТекущийЭлемент().Код);
Иначе
Предупреждение("Элемент с заданным наименованием не найден");
КонецЕсли;
Помогаю со студенческими работами здесь
Объектно-ориентированный аналог телефонного справочника: поиск по нескольким параметрам одновременно
Здравствуйте! Помогите, пожалуйста, с задачей!
Создать объектно-ориентированный аналог…
Выбор справочника
Добрый день! Пытаюсь реализовать выбор нужного мне справочника, задача стоит если значение…
Хитрый выбор из справочника
Подскажите как сообразить следующий выбор.
Есть вот такой пиклист, с помощью него происходит…
Выбор значаний из справочника
Добрый день!
Скажите, пожалуйста, как решить такую проблему.
Есть документ, в поле которого…
Искать еще темы с ответами
Или воспользуйтесь поиском по форуму:
2