Имя: Пароль:
1C
1С v8
Отбор элементов справочника
,
0 Black Dragon
 
30.08.11
14:35
Всем доброго дня!

Вот такой вопрос: нужно из справочника сделать отбор элементов по нескольким реквизитам. Каковы мои действия?

Есть конечно метод Выбрать, но

Выбрать (Select)
Синтаксис:

Выбрать(<Родитель>, <Владелец>, <Отбор>, <Порядок>)
Параметры:

<Родитель> (необязательный)

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

Тип: СправочникСсылка.
Отбор по владельцу. Имеет смысл только для подчиненных справочников. Если параметр не задан, то отбор по владельцу не производится.
<Отбор> (необязательный)

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

Тип: Строка.
Строка с именем реквизита справочника, определяющая упорядочивание элементов в выборке. Может быть указано "Код", "Наименование" или имя одного из реквизитов примитивного типа (Число, Строка, Дата, Булево), для которого установлен признак "Индексирование" в значение "Индексировать" или в "Индексировать с дополнительным упорядочиванием" в конфигураторе. После имени реквизита через пробел может быть указано направление сортировки. Направление определяется: "Убыв" ("Desc") - упорядочивать по убыванию; "Возр" ("Asc") - упорядочивать по возрастанию. По умолчанию сортировка производится по возрастанию. Если параметр не указан, то порядок определяется основным представлением справочника.
Значение по умолчанию: Пустая строка
Возвращаемое значение:

Тип: СправочникВыборка.

Описание:

Формирует выборку элементов справочника по заданным условиям


Однако структура может содержать только одну запись!
1 Wobland
 
30.08.11
14:36
зачем сюда СП постить в таком количестве? какой выбрать, когда есть Запрос
2 Black Dragon
 
30.08.11
14:37
Ну так уж получилось....
3 Black Dragon
 
30.08.11
14:37
Ну да, наверное...
4 Wobland
 
30.08.11
14:41
(3) точно говорю. за Выбрать() вместо запроса следует выстрел в коленку, линейкой по рукам и прочие кары небесные
5 kosts
 
30.08.11
14:47
Изучай запросы

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

Пока Выборка.Следующий() Цикл
   
КонецЦикла;
6 Black Dragon
 
30.08.11
14:49
(5) Ух ты, запрос!

Ну ладно, ладно, захотелось по быстрому, по простому!
Раз нет значит нет - написаю запрос и всех дел! :-)
7 Black Dragon
 
30.08.11
14:55
А как насчет повторного исполнения запроса,
Запрос.УстановитьПараметр - перед повторным Выполнить как Очистить и Новые параметры указать?
8 kosts
 
30.08.11
14:57
(7) Желательно минимизировать количество запросов, нужно получить все данные в одном запросе.
Тем более запрос в цикле-зло.

Но если все же нужно, то просто устанавливаешь новый параметр и выполняешь.
9 Wobland
 
30.08.11
14:58
(6) это и есть быстро и просто ;)
10 Wobland
 
30.08.11
14:58
(5) это типовое? обход по группировкам
11 Black Dragon
 
30.08.11
14:58
С тем же именем можно, да? он корректно обновится, в смысле, параметр?
12 Black Dragon
 
30.08.11
14:59
(10) Да это же просто пример привели - там то и группировки ни одной нету )
13 Wobland
 
30.08.11
15:01
(11) да
14 Black Dragon
 
30.08.11
15:01
(13)спасибо
15 Wobland
 
30.08.11
15:03
я вот думаю, а не хочет ли автор такого:
ГДЕ Параметр=&Параметр1 ИЛИ Параметр=&Параметр2
16 Black Dragon
 
30.08.11
15:25
у меня в принципе такое невозможно, потому как количество выполнений запроса произвольное

в общем, суть такова что из OLE базы надо перебрать записи определенного справочника и в УТ синхронизоровать с разделением на несколько справочников, вот и буду по каждому элементу делать выборку из имеющихся
17 hhhh
 
30.08.11
15:29
(16) а про список или массив ты ни разу в жизни не слышал?
18 Black Dragon
 
30.08.11
15:43
Вот примерно так будет:

               База77КонтактЛица = База.CreateObject("Справочник.я_КонтактныеЛица");
               База77КонтактЛица.ИспользоватьВладельца(СпрКонтрагенты);
               Отбор = Новый Запрос;
               Отбор.Текст = "
               | ВЫБРАТЬ
               | КонтактныеЛица.Ссылка
               | ИЗ Справочник.КонтактныеЛица как Контакты
               | ГДЕ Справочник.КонтактныеЛица.Фамилия = &Фамилия И
               | Справочник.КонтактныеЛица.Имя = &Имя И
               | Справочник.КонтактныеЛица.Отчество = &Отчество";
               База77КонтактЛица.ВыбратьЭлементы();
               Пока База77КонтактЛица.ПолучитьЭлемент() Цикл
                   Отбор.УстановитьПараметр("Фамилия",СокрЛП(База77КонтактЛица.Фамилия));
                   Отбор.УстановитьПараметр("Имя",СокрЛП(База77КонтактЛица.Имя));
                   Отбор.УстановитьПараметр("Отчество",СокрЛП(База77КонтактЛица.Отчество));
                   Результат = Отбор.Выполнить();
                   Выборка = Результат.Выбрать();
                   Если Выборка.Количество() = 0 Тогда
                       // создать запись
                   КонецЕсли;    
               КонецЦикла;
19 Black Dragon
 
30.08.11
15:47
А про список либо массив - не применимо!!! Параметры разные каждый раз - к чему плодить избыточность - можно на грабли напоротся!
20 hhhh
 
30.08.11
15:50
(19) ну эта твоя программа будет выполняться в 500 раз медленнее чем обычно, только из-за того, что ты испытываешь мистический ужас перед граблями и вместо одного запроса формируешь 10000 запросов.
21 Black Dragon
 
30.08.11
15:55
(20) Хм...Да, определенно!
22 Black Dragon
 
30.08.11
15:57
Но иначе не представляю как - параметр 3-ы составной - нужно уникальность по строке соблюдать!
23 Error pro
 
30.08.11
16:11
(19) при чем тут избыточность? В массив можешь запихнуть свои "разные параметры" , а 18 - жесть и "не избыточность"...
24 kosts
 
30.08.11
18:27
(18) Если это для постоянного использования,есть смысл оптимизировать.
Через временные таблицы. Что то в этом роде.

Пока База77КонтактЛица.ПолучитьЭлемент() Цикл
   СтрокаТЗ = ТЗ.Добавить();
   СтрокаТЗ.Фамилия = СокрЛП(База77КонтактЛица.Фамилия);
   СтрокаТЗ.Имя = СокрЛП(База77КонтактЛица.Имя);
   СтрокаТЗ.Отчество = СокрЛП(База77КонтактЛица.Отчество);
кц;
Отбор.УстановитьПараметр("ТЗ",ТЗ);
Отбор.Менеджервременныхтаблиц = новый Менеджервременныхтаблиц;
Отбор.Текст = " ВЫБРАТЬ Фамилия,Имя,Отчество Поместить ВТКонтактныеЛица из &ТЗ;
               | ВЫБРАТЬ
               | КонтактныеЛица.Ссылка, Контакты.Фамилия,Контакты.Имя,Контакты.Отчество
               | ИЗ Справочник.КонтактныеЛица как Контакты
               | внутреннее соединение ВТКонтактныеЛица из ВТКонтактныеЛица
               | по КонтактныеЛица.Фамилия = ВТКонтактныеЛица.Фамилия И
               | КонтактныеЛица.Имя = ВТКонтактныеЛица.Имя И
               | КонтактныеЛица.Отчество = ВТКонтактныеЛица.Отчество";