как найти документ по двум реквизитам? |
Я |
17.09.10 — 08:45
?
1 — 17.09.10 — 08:45
(0) запросом
2 — 17.09.10 — 08:46
а через метод выбрать не получится?
3 — 17.09.10 — 08:47
(2) А к запросам религиозные предубеждения есть?
4 — 17.09.10 — 08:47
выбрать * из документ где реквизит1 = &реквизит1 и реквизит2 = &реквизит2
5 — 17.09.10 — 08:48
если очень много документов на быстродействии это ни как не отразится?
6 — 17.09.10 — 08:49
(4) а нафига Выбрать *, вроде надо только ссылку получит?
7 — 17.09.10 — 08:49
(4) * заменить на Ссылка и все будет
8 — 17.09.10 — 08:49
ага только ссылку
9 — 17.09.10 — 08:52
(6) лень было писать «ссылка», звездочку проще поставить
10 — 17.09.10 — 08:53
«ВЫБРАТЬ
| Ссылка,
|ИЗ
| Документ.МедКарты как МедКарты
|ГДЕ
| МедКарты.Специалист = &реквизит1 и МедКарты.Специалист = &реквизит2;
11 — 17.09.10 — 08:53
второй параметр пациент
12 — 17.09.10 — 08:53
а как параметры получить)
13 — 17.09.10 — 08:54
(12)а вы программист или кто?
14 — 17.09.10 — 08:54
Запрос.УстановитьПараметр(«Пациент», Пациент)?
15 — 17.09.10 — 08:54
любитель
16 — 17.09.10 — 08:55
(10) может тебе ИЛИ надо? или ты чего то путаешь?
17 — 17.09.10 — 08:55
(14) да
18 — 17.09.10 — 08:55
нет надо и
19 — 17.09.10 — 08:57
(18) уже прочитал, что второй параметр Пациент
20 — 17.09.10 — 08:57
я впирницпе так и думал просто хотел подтвердить)
21 — 17.09.10 — 08:58
спасибо
22 — 17.09.10 — 08:58
«ВЫБРАТЬ
| Ссылка,
|ИЗ
| Документ.МедКарты как МедКарты
|ГДЕ
| МедКарты.Специалист = &специалист и МедКарты.пациент = &пациент»
Запрос.УстановитьПараметр(«Пациент», Пациент)
Запрос.УстановитьПараметр(«Специалист», Специалист)
23 — 17.09.10 — 08:59
дело в том что там только одна медкарта будет, смысл потом перебирать..
24 — 17.09.10 — 09:00
в справочнике можно по 3 параметрам найти а в документе нет
25 — 17.09.10 — 09:01
(23) а кто перебирать заставляет. Получишь ссылку на свою медкарту запросом и работай с ней дальше.
26 — 17.09.10 — 09:02
(23) а ты в этом абсолютно уверен?
27 — 17.09.10 — 09:09
{Документ.ЗаписиНаПрием.Форма.ФормаЭлемента.Форма(83)}: Ошибка при вызове метода контекста (Выполнить)
МедКарта=Запрос.Выполнить().Ссылка;
по причине:
по причине:
{(6, 21)}: Не задано значение параметра «Пациент»
МедКарты.Пациент = <<?>>&Пациент и МедКарты.Специалист = &Специалист
28 — 17.09.10 — 09:11
(27) Ну так задай значение параметра
29 — 17.09.10 — 09:12
а МедКарта=Запрос.Выполнить().Ссылка; — не прокатит ))
30 — 17.09.10 — 09:14
Выбрка = Запрос.Выполнить().Выбрать();
если Выборка.Следующий() тогда
МедКарта = Выборка.Ссылка;
конецесли;
31 — 17.09.10 — 09:16
бред конечно делать запрос и перебор строк ради одного документа)
32 — 17.09.10 — 09:17
имхо есть более рациональное решение
33 — 17.09.10 — 09:18
(31) бред ты говоришь!!! RTFM!!!!11
34 — 17.09.10 — 09:21
все равно ошибка (27)
35 — 17.09.10 — 09:22
ЗАДАЙ ПАРАМЕТРЫ !!!!!!
36 — 17.09.10 — 09:22
(34) код в студию
37 — 17.09.10 — 09:24
ТекстЗапроса = «ВЫБРАТЬ
| Ссылка
|ИЗ
| Документ.МедКарты как МедКарты
|ГДЕ
| МедКарты.Пациент = &Пациент И МедКарты.Специалист = &Специалист «;
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр(«Пациент», Пациент);
Запрос.УстановитьПараметр(«Специалист», Специалист);
Запрос = Новый Запрос(ТекстЗапроса);
Выборка = Запрос.Выполнить().Выбрать();
если Выборка.Следующий() тогда
МедКарта = Выборка.Ссылка;
конецесли;
38 — 17.09.10 — 09:25
(37) зачем два раза создаешь новый объект?
39 — 17.09.10 — 09:25
пля вот я неувязок 2 раза запрос создаю))
40 — 17.09.10 — 09:26
все гуд
Егор Сергеевич
41 — 17.09.10 — 09:26
ТекстЗапроса = «ВЫБРАТЬ
| Ссылка
|ИЗ
| Документ.МедКарты как МедКарты
|ГДЕ
| МедКарты.Пациент = &Пациент И МедКарты.Специалист = &Специалист «;
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр(«Пациент», Пациент);
Запрос.УстановитьПараметр(«Специалист», Специалист);
Выборка = Запрос.Выполнить().Выбрать();
если Выборка.Следующий() тогда
МедКарта = Выборка.Ссылка;
конецесли;
Стояла задача найти Конрагента в справочнике по ИНН и КПП (кто знает, что такое обособленное подразделение, поймет). Логика проста — найти по ИНН, сверить КПП, если нет добавить.
Найдено=Справочники.Контрагенты.НайтиПоРеквезиту(«ИНН»,ИскомыйИНН);
Если Найден=Справочники.Контрагенты.ПустаяСсылка() Тогда
//СОЗДАТЬ КОНТРАГЕНТА
Иначе
Если Найдено.КПП=ИскомыйКПП Тогда
Сообщить(«Найден филиал контрагента»);
Иначе
//СОЗДАТЬ ФИЛИАЛ КОНТРАГЕНТА
КонецЕсли;
КонецЕсли;
И тут фэйл, мои дорогие, если в справочнике существует и филиал и ГО, то он кого-то по-любому не найдет. А все кроется в:
Возвращаемое
значение:
Тип: СправочникСсылка.
Ссылка на найденный элемент справочника. Если не существует ни одного
элемента с требуемым значением реквизита, то будет возвращена пустая ссылка.
Если найдено более одного, функция вернет только первое вхождение…неприятно, однако…
Пошел искать другие пути и набрел на два варианта:
Выборка()
ПараметрПоискаИННОтбор=Новый Структура;ПараметрПоискаИННОтбор.Вставить(«ИНН»,ИскомыйИНН);
Выборка=справочники.контрагенты.Выбрать(,,ПараметрПоискаИННОтбор);
Пока Выборка.Следующий() Цикл
КППНайден=Ложь;
Если Выборка.КПП=ИскомыйКПП Тогда
Сообщить(«Найден филиал контрагента»);
КППНайден=Истина;
Прервать;
//Мне дальше не нужно
КонецЕсли;
КонецЦикла;
Если КППНайден=Ложь Тогда
//СОЗДАТЬ ФИЛИАЛ КОНТРАГЕНТА
КонецЕсли;
И второй
Новый Запрос
ЗапросПоискИНН=Новый Запрос(«ЗапросПоискИНН»);ЗапросПоискИНН.Текст=«ВЫБРАТЬ
|Контрагенты.Ссылка
|ИЗ
|Справочник.Контрагенты КАК Контрагенты
|ГДЕ
|Контрагенты.ИНН = &ИНН»;
ЗапросПоискИНН.Параметры.Вставить(«ИНН»,ИскомыйКПП);
Выборка=ЗапросПоискИНН.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
КППНайден=Ложь;
Если Выборка.КПП=ИскомыйКПП Тогда
Сообщить(«Найден филиал контрагента»);
КППНайден=Истина;
Прервать;
//Мне дальше не нужно
КонецЕсли;
КонецЦикла;
Если КППНайден=Ложь Тогда
//СОЗДАТЬ ФИЛИАЛ КОНТРАГЕНТА
КонецЕсли;
В Запросе можно добавить еще один параметр, чего не сделаешь в Выборке.
Но, у обоих вариантов есть минус, а именно:
Если Выборка.Следующий()=Справочники.Контрагенты.ПустаяСсылка() Тогда
//ЧЕГО ТО ТАМ;
КонецЕсли;
А дальше цикл ПокаЦикл. Блок «если», в этом случае, съест первую итерацию, и потом может кого-то обломать.
Короче, вся эта фигня к тому, что не надо использовать Выборка.Следующий() как условие, можно проверить по Выборка.Количество() или Выборка.Пустой().
/
/
/
Совет: Эффективный поиск по спискам документов – Как в 1С 8.3 найти документ в списке?
25.11.2019
Функционал программы 1С позволяет гибко настраивать списки, что позволяет легче ориентироваться в документах и осуществлять быстрый поиск. На примере 1С:Бухгалетрии 8 рассмотрим способы быстрого поиска и наглядной организации информации в списке документов.
Базовые инструменты отбора и сортировки встроены сразу в форму списка, и могут облегчить поиск документов 1С в самых распространенных случаях – когда необходим отбор по контрагенту или организации, либо когда необходимо сортировать список по данным любого столбца, например по статусу оплаты. Для этого нужно щелкнуть левой кнопкой по заголовку столбца (щелкнуть дважды, чтобы инвертировать сортировку).
Также через контекстное меню при нажатии правой кнопкой мыши на любом документе (или сочетанием клавиш Ctrl + F) можно вызвать «Расширенный поиск» – простой отбор по значению в любой из колонок, поиск можно осуществить по точному совпадению с поисковой фразой, по началу строки или по любой части строки. Так же через контекстное меню можно произвести отбор по дате документа с помощью функции «Установить период…». Функции можно применять последовательно, например, ограничить временным периодом список с результатами расширенного поиска.
Однако базовых возможностей поиска оказывается недостаточно, когда документов очень много и из них нужно найти определенные. Например, оставить в списке только непроведенные документы, или найти документ сразу по нескольким условиям. Расширенный функционал отбора и сортировки находится в меню «Еще…», кнопка «Настроить список…»
Обратимся к вкладке «Отбор». Справа в столбце расположены все реквизиты документов, по которым их можно отфильтровать. Структура реквизитов иерархическая – можно осуществлять отбор по основному реквизиту (например по Контрагенту), либо по подчиненному (например, по ИНН контрагента, либо по характеристике юр./физ. лицо). Также можно создавать сложные отборы – то есть сразу по нескольким реквизитам документов 1С. Так, в примере ниже, в списке счетов мы осуществляем отбор по сумме счета (не менее 10 000 руб.) и статусу оплаты (не оплачен).
На следующей вкладке расположено окно сортировки – здесь можно задать тонкую настройку сортировки списка документов по любым реквизитам, в том числе сложные варианты сортировки по нескольким реквизитам.
Далее, когда вам потребуется сбросить настройки поиска, сортировки и отбора документов 1С, вы можете вернуться к стандартным настройкам списка. Для этого в окне настройки списка нажмите на кнопку «Еще…», затем – «Установить стандартные настройки».
Помимо этого, вы можете организовать реквизиты в списке любым удобным образом, или даже добавить для отображения новые. Для этого через меню «Еще…» откройте окно «Изменить форму…»
Например, реквизит «Комментарии» стандартно находится с крайней правой части окна списка и комментария может быть не видно без дополнительной прокрутки. В примере мы изменим местоположение реквизита комментарий, чтобы он отображался правее. Для этого реквизит нужно «поднять».
Помимо этого, вы можете добавить новые реквизиты для отображения. Так, для примера мы добавим в отображение новый реквизит – телефон контрагента.
Пройдите курсы 1С и Вам больше не понадобятся советы и руководства!
Расписание курсов 1C
Подпишитесь на нас!
И получите в подарок промокод на 1500 руб! Все новые статьи, акции и анонсы каждую неделю:
0
— 09.02.2012 — 15:53
Мне нужно найти документы поступления по реквизиту «входящий номер», но интересуют только документы определенного поставщика и из определенного года.
докПнкВБух = Документы.ПоступлениеТоваровУслуг.НайтиПоРеквизиту («НомерВходящегоДокумента»,СокрлП(РНК.ДокументОсно вание.выбНомерДок));
В общем вопрос:
Как открыть выборку по нескольким реквизитам?
Сразу оговорюсь Запросом не подойдет.
1
— 09.02.2012 — 16:00
Тупым перебором, если запрос не хочешь. НайтиПоРеквизиту первый попавшийся вернет.
2
— 09.02.2012 — 16:07
Если не хочешь использовать запросы в восьмерке — сразу закрой её и возвращайся к 7.7.
3
— 09.02.2012 — 16:11
2 (3) Все бы ничего но я использую через ole и из 7-ки и как вставить туда запрос не знаю (а если и знаю, то получается очень не красиво)
4
— 09.02.2012 — 16:11
3-Lexusss > +1000
5
— 09.02.2012 — 16:11
2 (2) а как-нибудь выборку по какому-ниб отбору нельзя?
6
— 09.02.2012 — 16:13
Не знаешь как запрос тогда просто
OLE.ВыбратьДокументы(ДатаНачала,ДатаКонца)
Пока OLE.ПолучитьДокумент() = 1 Цикл
ТекДок = OLE.ТекущийДокумент()
Если ТекДок.НомерВходящегоДокумента = Нужный Номер Тогда
и т.д. и т.п.
7
— 09.02.2012 — 16:18
Запрос = Восьмерка.NewObject(«Запрос»);
Запрос.Текст = «
|ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка
|ИЗ Документ.ПОступлениеТоваровИУслуг
|ГДЕ
| Период = ДАТАВРЕМЯ(2009,1,1)
| И НомерВходящегоДокумента = «»»+СокрлП(РНК.ДокументОсно вание.выбНомерДок)+»»»
| И Чтонить еще
|»);
Запрос.Выпонить().Выбрать()
8
— 09.02.2012 — 16:19
2 (7) про перебор я понимаю, просто думал может кто-знает как без этого обойтись. Уж больно много документов и работает долго.
9
— 09.02.2012 — 16:19
(7) Ты тож закрой 8ку и больше не открывай. Чудесного кода в мире станет хоть чуточку меньше!
10
— 09.02.2012 — 16:20
Я чет думал он из 8-ки семерку дергает
11
— 09.02.2012 — 16:21
(9) Я уже года три, как плотно сижу на 8ке. Пусть и крайне мало времени уходит на кодинг, но за это время выборку использовал раз 5 от силы. А запросов написано — не счесть.
12
— 09.02.2012 — 16:34
1. перебор (по понятным причинам делать не буду)
2. запрос (придется остановиться на предложении из (8)
3. Есть?
2 (11) нет из 7-ки в 8-ку закидываю документ
13
— 09.02.2012 — 16:39
(13) Вариант записи в другую базу очень некрасив. Гораздо правильнее в восьмерки загружать из семерки. Особенно это становится актуальным в связи с выходов все новых и новых конф на чистом клиент-сервере. Кроме того, в предложенном мной варианте, у тебя будет вся «мощь» языка 8ки и механизм транзакций.
14
— 09.02.2012 — 16:48
Цитата:
Сообщение от Lexusss
Вариант записи в другую базу очень некрасив
+1
используй КД
15
— 09.02.2012 — 16:52
+15 конечно, если это не разовая «перекидка»
16
— 09.02.2012 — 16:53
(12) Выборки нужны… но только ежели надо тыщ 100 элементов справочника обработать гуртом.
17
— 09.02.2012 — 18:34
Ничего не понимаю….
(13): «из 7-ки в 8-ку закидываю документ «
При этом в сабже: «ПоступлениеТоваровУслуг»
ВОПРОС: Это где это в 7.7 такой вид документа?
И где это такой реквизит у документа-основания «выбНомерДок»?
Семёрочный вариант, если без запроса, то так:
Док = СоздатьОбьект(«Документ.ЧёТоТамПоступлениеТвоё»);
Док.ВыбратьПоРеквизиту(«Контрагент», НужныйТебеКонтр);
НужныйНомер = СокрлП(РНК.ДокументОсно вание.выбНомерДок);
Пока Док.получитьдок()=1 Цикл
Если Док.ВходящийНомер = НужныйНомер Тогда…
КонецЦикла
18
— 10.02.2012 — 07:45
2 (18) ищу документ в восьмерке. тут только маленький кусочек.
Реквизитов и документов в 7-ку (да и в 8-ку) как известно можно добавить много любых
На языке 8-ки нужно найти документ по 3 реквизитам — вот и есть задача. Остальное наоборот писал для понятности
При работе с таблицами справочника есть методы НайтиПоРеквизиту и НайтиПоКоду в итоге получаем найденную запись и делаем с ней что хотим. Вопрос как найти получить запись поиском по нескольким реквизитам? Т.е. сделать не Выборку, а именно установить курсор на найденной по нескольким реквизитам записи?
1С 8.2 Мне Запрос не нужен. Необходимо получить для редактирования искомую строку.
по идейным соображениям запрос не нужен?
+4 разрешаю искать перебором, раз запрос не нужен
ну так получи. В чём вопрос то? Есть такой метод… НайтиСтроки…
самое оптимальное запрос с параметром подобно
НайтиСтроки вроде бы ищет только в табличных частях справочника, а не сами записи справочника?
подобно — ни разу не отпимально
ещё в ТЗ. пробегись по выборке, засунь всё в ТЗ, потом ищи строки. раз уж религия такая
а… в справочнике… Запрос. Или в лес. Ну или на Привоз
сам запутался в своём СП. Какая ирония
Запросом можно искать, но много писанины (создать запрос, по том перебирать и искать по коду). Этоже самое к примеру в Фоксе можно сделать одной командой (типа Locate for)
зато работает как надо. купи гуся
Выборка конечно лучше получая все поля объекта и помещая в ОЗУ. А запрсом получаем нужные поля. Если поиск по нескольким реквизитам и по трем набранным буквам сделать поиск с помощью объектной модели как то затруднительно.
зачем искать по коду? достаточно правильно создать запрос, тем более текст запроса достаточно «накликать» в конструкторе запросов
потом перебирать? срочно дружись с запросами, у тебя пусто в голове
если ты не любишь Запросы, ты не можешь называть себя одинесником
я! я не люблю! семёрочные. у меня от них начинает кружиться голова и возникает необъяснимое чувство тревоги и страха
таки вперёд на Привоз покупать гуся…
если ты боишься запросов, выпей 50 грамм. Алкоголь притупляет чувство страха
500 будет в самый раз для притупления. только я ж работать не смогу
а ты ещё и работаешь? О_о
поработаешь тут с вами. я в отпуске загораю
бить надо за найтипоКоду и поРеквизиту. Больше ими не пользуйся
Я может чёт не понимаю. После запроса пишем: Выборка=РезультатЗапроса.Выбрать; Выборка — это же виртуальная таблица, а как мне получить реальную запись справочника, не используя Справочник.НайтиПоКоду(Выборка.Код)
Выборка это скорее курсор SQL (ближе к нему) Выборка.Ссылка — если есть конечно поле такое в запросе, дает ссылку на запись справочника
За Выборка.Ссылка спасибо,это понятно. Я не очень 1С — ник. Так что плаваю в структуре языка. А ППЦ в голове у Defender aka
Тэги: 1С 8
Комментарии доступны только авторизированным пользователям
Функция позволяет найти ссылку на объект любого типа в конфигурации ERP2.0 (либо любой другой построенной на БСП).
Поиск может выполняться по реквизитам основной таблицы, значениям дополнительных реквизитов по табличной части «Дополнительные реквизиты», значениям доп. сведений (регистр сведений «ДополнительныеСведения»).
Используется объектная модель работы с запросом (СхемаЗапроса). Поддерживается в версиях платформы: 8.3.5 и выше.
Параметры:
Имя параметра Тип Описание
ИмяТаблицы Строка Имя таблицы, по которой осуществляется поиск. Пример: «Справочник.Номенклатура»
СтруктураРеквизитов Структура В качестве ключа передается имя реквизита основной таблицы, в качестве значения — значение реквизита
СоответствиеДопРеквизитов Соответствие В качестве ключа передается ссылка на доп. реквизит — элемент плана вида характеристик «ДополнительныеРеквизитыИСведения», в качестве значения — значение реквизита
СоответствиеДопСведений Соответствие В качестве ключа передается ссылка на доп. сведение — элемент плана вида характеристик «ДополнительныеРеквизитыИСведения», в качестве значения — значение доп. сведения
Имя параметра | Тип | Описание |
---|---|---|
ИмяТаблицы | Строка | Имя таблицы, по которой осуществляется поиск. Пример: «Справочник.Номенклатура» |
СтруктураРеквизитов | Структура | В качестве ключа передается имя реквизита основной таблицы, в качестве значения — значение реквизита |
СоответствиеДопРеквизитов | Соответствие | В качестве ключа передается ссылка на доп. реквизит — элемент плана вида характеристик «ДополнительныеРеквизитыИСведения», в качестве значения — значение реквизита |
СоответствиеДопСведений | Соответствие | В качестве ключа передается ссылка на доп. сведение — элемент плана вида характеристик «ДополнительныеРеквизитыИСведения», в качестве значения — значение доп. сведения |
Функция СсылкаНаОбъектПоРеквизитам(ИмяТаблицы, СтруктураРеквизитов = Неопределено, СоответствиеДопРеквизитов = Неопределено, СоответствиеДопСведений = Неопределено)
ИмяТаблицыВЗапросе = СтрЗаменить(ИмяТаблицы, ".", "");
СхемаЗапроса = Новый СхемаЗапроса;
ЗапросПакета = СхемаЗапроса.ПакетЗапросов[0];
ОператорВыбора = ЗапросПакета.Операторы[0];
Если СтруктураРеквизитов <> Неопределено Тогда
ИсточникСправочник = ОператорВыбора.Источники.Добавить(ИмяТаблицы, ИмяТаблицыВЗапросе);
ОператорВыбора.ВыбираемыеПоля.Добавить(ИмяТаблицыВЗапросе + ".Ссылка");
Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл
ОператорВыбора.Отбор.Добавить(ИмяТаблицыВЗапросе + "." + КлючИЗначение.Ключ + " = &" + КлючИЗначение.Ключ);
КонецЦикла;
Если СоответствиеДопРеквизитов <> Неопределено
ИЛИ СоответствиеДопСведений <> Неопределено Тогда
ЗапросПакета.ТаблицаДляПомещения = "ОсновнаяТаблица";
ЗапросПакета = СхемаЗапроса.ПакетЗапросов.Добавить(Тип("ЗапросВыбораСхемыЗапроса"));
ОператорВыбора = ЗапросПакета.Операторы[0];
КонецЕсли;
КонецЕсли;
Если СоответствиеДопРеквизитов <> Неопределено Тогда
Для Сч = 0 По СоответствиеДопРеквизитов.Количество()-1 Цикл
ИсточникСправочник = ОператорВыбора.Источники.Добавить(ИмяТаблицы + ".ДополнительныеРеквизиты", ИмяТаблицыВЗапросе + "ДополнительныеРеквизиты");
ОператорВыбора.ВыбираемыеПоля.Добавить(ИмяТаблицыВЗапросе + "ДополнительныеРеквизиты.Ссылка");
ОператорВыбора.Отбор.Добавить(ИмяТаблицыВЗапросе + "ДополнительныеРеквизиты.Свойство = &Свойство" + Формат(Сч+1, "ЧГ=0"));
ОператорВыбора.Отбор.Добавить(ИмяТаблицыВЗапросе + "ДополнительныеРеквизиты.Значение = &Значение" + Формат(Сч+1, "ЧГ=0"));
Если СтруктураРеквизитов <> Неопределено Тогда
ИсточникОсновнаяТаблица = ОператорВыбора.Источники.Добавить("ОсновнаяТаблица", "ОсновнаяТаблица");
Соединение = ИсточникОсновнаяТаблица.Соединения.Добавить(ИсточникСправочник);
ИсточникОсновнаяТаблица.Соединения[0].ТипСоединения = ТипСоединенияСхемыЗапроса.Внутреннее;
КонецЕсли;
Если СоответствиеДопРеквизитов.Количество()> 1
ИЛИ СоответствиеДопСведений <> Неопределено Тогда
ЗапросПакета.ТаблицаДляПомещения = "ДопРеквизит" + Формат(Сч+1, "ЧГ=0");
ЗапросПакета = СхемаЗапроса.ПакетЗапросов.Добавить(Тип("ЗапросВыбораСхемыЗапроса"));
ОператорВыбора = ЗапросПакета.Операторы[0];
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если СоответствиеДопСведений <> Неопределено Тогда
Для Сч = 0 По СоответствиеДопСведений.Количество()-1 Цикл
ИсточникРегистр = ОператорВыбора.Источники.Добавить("РегистрСведений.ДополнительныеСведения", "ДополнительныеСведения");
ОператорВыбора.ВыбираемыеПоля.Добавить("ДополнительныеСведения.Объект");
ЗапросПакета.Колонки[0].Псевдоним = "Ссылка";
ОператорВыбора.Отбор.Добавить("ДополнительныеСведения.Свойство = &Сведение" + Формат(Сч+1, "ЧГ=0"));
ОператорВыбора.Отбор.Добавить("ДополнительныеСведения.Значение = &ЗначениеСведения" + Формат(Сч+1, "ЧГ=0"));
Если СтруктураРеквизитов <> Неопределено Тогда
ИсточникОсновнаяТаблица = ОператорВыбора.Источники.Добавить("ОсновнаяТаблица", "ОсновнаяТаблица");
Соединение = ИсточникОсновнаяТаблица.Соединения.Добавить(ИсточникРегистр, "ОсновнаяТаблица.Ссылка = ДополнительныеСведения.Объект");
ИсточникОсновнаяТаблица.Соединения[0].ТипСоединения = ТипСоединенияСхемыЗапроса.Внутреннее;
КонецЕсли;
Если СоответствиеДопСведений.Количество()> 1
ИЛИ СоответствиеДопРеквизитов <> Неопределено Тогда
ЗапросПакета.ТаблицаДляПомещения = "ДопСведение" + Формат(Сч+1, "ЧГ=0");
ЗапросПакета = СхемаЗапроса.ПакетЗапросов.Добавить(Тип("ЗапросВыбораСхемыЗапроса"));
ОператорВыбора = ЗапросПакета.Операторы[0];
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если СоответствиеДопРеквизитов <> Неопределено
И (СоответствиеДопРеквизитов.Количество() <> 1 ИЛИ СоответствиеДопСведений <> Неопределено) Тогда
ИсточникВТ1 = ОператорВыбора.Источники.Добавить("ДопРеквизит1", "ДопРеквизит1");
ОператорВыбора.ВыбираемыеПоля.Добавить("ДопРеквизит1.Ссылка");
Для Сч = 1 По СоответствиеДопРеквизитов.Количество()-1 Цикл
СчСтрока = Формат(Сч+1, "ЧГ=0");
ИсточникВТ = ОператорВыбора.Источники.Добавить("ДопРеквизит" + СчСтрока, "ДопРеквизит" + СчСтрока);
Соединение = ИсточникВТ1.Соединения.Добавить(ИсточникВТ, "ДопРеквизит1.Ссылка = ДопРеквизит" + СчСтрока + ".Ссылка");
ИсточникВТ1.Соединения[ИсточникВТ1.Соединения.Количество()-1].ТипСоединения = ТипСоединенияСхемыЗапроса.Внутреннее;
КонецЦикла;
КонецЕсли;
Если СоответствиеДопСведений <> Неопределено
И (СоответствиеДопСведений.Количество()> 1 ИЛИ СоответствиеДопРеквизитов <> Неопределено) Тогда
Если СоответствиеДопРеквизитов = Неопределено Тогда
ИсточникВТ1 = ОператорВыбора.Источники.Добавить("ДопСведение1", "ДопСведение1");
ОператорВыбора.ВыбираемыеПоля.Добавить("ДопСведение1.Ссылка");
СтартовыйИндекс = 1;
ИмяПервойТаблицы = "ДопСведение1";
Иначе
СтартовыйИндекс = 0;
ИмяПервойТаблицы = "ДопРеквизит1";
КонецЕсли;
Для Сч = СтартовыйИндекс По СоответствиеДопСведений.Количество()-1 Цикл
СчСтрока = Формат(Сч+1, "ЧГ=0");
ИсточникВТ = ОператорВыбора.Источники.Добавить("ДопСведение" + СчСтрока, "ДопСведение" + СчСтрока);
Соединение = ИсточникВТ1.Соединения.Добавить(ИсточникВТ, ИмяПервойТаблицы + ".Ссылка = ДопСведение" + СчСтрока + ".Ссылка");
ИсточникВТ1.Соединения[ИсточникВТ1.Соединения.Количество()-1].ТипСоединения = ТипСоединенияСхемыЗапроса.Внутреннее;
КонецЦикла;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
Если СтруктураРеквизитов <> Неопределено Тогда
Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл
Запрос.УстановитьПараметр(КлючИЗначение.Ключ, КлючИЗначение.Значение);
КонецЦикла;
КонецЕсли;
Если СоответствиеДопРеквизитов <> Неопределено Тогда
Сч = 1;
Для Каждого КлючИЗначение Из СоответствиеДопРеквизитов Цикл
СчСтрока = Формат(Сч, "ЧГ=0");
Запрос.УстановитьПараметр("Свойство" + СчСтрока, КлючИЗначение.Ключ);
Запрос.УстановитьПараметр("Значение" + СчСтрока, КлючИЗначение.Значение);
Сч = Сч + 1;
КонецЦикла;
КонецЕсли;
Если СоответствиеДопСведений <> Неопределено Тогда
Сч = 1;
Для Каждого КлючИЗначение Из СоответствиеДопСведений Цикл
СчСтрока = Формат(Сч, "ЧГ=0");
Запрос.УстановитьПараметр("Сведение" + СчСтрока, КлючИЗначение.Ключ);
Запрос.УстановитьПараметр("ЗначениеСведения" + СчСтрока, КлючИЗначение.Значение);
Сч = Сч + 1;
КонецЦикла;
КонецЕсли;
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат Неопределено;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать(); Выборка.Следующий();
Возврат Выборка.Ссылка;
КонецФункции
262 / 218 / 94 Регистрация: 07.04.2011 Сообщений: 1,342 |
|
1 |
|
Получение данных по нескольким доп.реквизитам22.09.2021, 16:08. Показов 1786. Ответов 10
Всем доброго времени суток. Есть некий Эксель, в котором содержится текстовая информация. И таких в Экселе строк энное количество будет. Есть номенклатура в бд,в которой добавлены доп.реквизиты в которых содержатся те же самые текстовые значения, что и в Экселе. Вот как мне получить ОДНИМ запросом всю номенклатуру справочника у которой совпали ВСЕ 3 параметра? Вот я выгрузил таблицу значений с данными Экселя во времянку в запросе. Вот какое должно быть условие в соединении чтобы получить и ссылку и значения этих доп.реквизитов???
0 |
1508 / 950 / 365 Регистрация: 31.05.2012 Сообщений: 3,344 |
|
22.09.2021, 16:40 |
2 |
А чего ПО И канает только для 1 доп.значения?
0 |
OverDozero 262 / 218 / 94 Регистрация: 07.04.2011 Сообщений: 1,342 |
||||
22.09.2021, 17:03 [ТС] |
3 |
|||
ВТ.ДопРекв1, ВТ.ДопРекв2 так в ВТ то все 3 доп.реквизита в 1 колонке.
Где мСвойств это массив со свойствами. А вот в значении как раз те показатели по которым надо связать 3 значения из экселя.
0 |
1508 / 950 / 365 Регистрация: 31.05.2012 Сообщений: 3,344 |
|
22.09.2021, 17:54 |
4 |
понял, А программно ту экселевскую табличку преобразовать, получив времянку где эти 3 строки в 3 колонки перешли? Ну а дальше запросом
0 |
OverDozero 262 / 218 / 94 Регистрация: 07.04.2011 Сообщений: 1,342 |
||||
22.09.2021, 18:18 [ТС] |
5 |
|||
Ну такое схлопывание и написал..но интересно же сделать запросом) Добавлено через 6 минут
Вот так возвращает позиции где есть доп.реквизит.
0 |
1142 / 689 / 203 Регистрация: 22.04.2013 Сообщений: 5,161 Записей в блоге: 1 |
|
22.09.2021, 21:33 |
6 |
раз 7 перечитал условие задачи но так и не понял
0 |
262 / 218 / 94 Регистрация: 07.04.2011 Сообщений: 1,342 |
|
22.09.2021, 21:47 [ТС] |
7 |
Шо непонятного то?) Вот из экселя заполнились длина,ширина и высота. P.S.Решение было найдено левым соединением по каждому свойству в отдельности.
0 |
Yulunga 1142 / 689 / 203 Регистрация: 22.04.2013 Сообщений: 5,161 Записей в блоге: 1 |
||||
22.09.2021, 22:19 |
8 |
|||
ну в смысле
« проширину также это ты спрашивал?
1 |
Dethmontt |
23.09.2021, 03:59
|
Не по теме: Учимся разворачивать таблицу на колонки в запросе…
0 |
OverDozero 262 / 218 / 94 Регистрация: 07.04.2011 Сообщений: 1,342 |
||||||||
23.09.2021, 10:24 [ТС] |
10 |
|||||||
ну в смысле
Вытаскивает он таблицу вида Длина1 Ширина1 Цвет1 А это я еще не выводил в ней ссылки на номенклатуру у которой эти свойства Я за это топлю. Добавлено через 49 минут
0 |
1142 / 689 / 203 Регистрация: 22.04.2013 Сообщений: 5,161 Записей в блоге: 1 |
|
23.09.2021, 13:15 |
11 |
ну там нулл должен быть а не «»
0 |