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

как найти документ по двум реквизитам?

Я
   cdpoma

17.09.10 — 08:45

?

  

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

   Егор Сергеевич

1 — 17.09.10 — 08:45

(0) запросом

   cdpoma

2 — 17.09.10 — 08:46

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

   Irbis

3 — 17.09.10 — 08:47

(2) А к запросам религиозные предубеждения есть?

   Егор Сергеевич

4 — 17.09.10 — 08:47

выбрать * из документ где реквизит1 = &реквизит1 и реквизит2 = &реквизит2

   cdpoma

5 — 17.09.10 — 08:48

если очень много документов на быстродействии это ни как не отразится?

   artems

6 — 17.09.10 — 08:49

(4) а нафига Выбрать *, вроде надо только ссылку получит?

   Fragster

7 — 17.09.10 — 08:49

(4) * заменить на Ссылка и все будет

   cdpoma

8 — 17.09.10 — 08:49

ага только ссылку

   Егор Сергеевич

9 — 17.09.10 — 08:52

(6) лень было писать «ссылка», звездочку проще поставить

   cdpoma

10 — 17.09.10 — 08:53

«ВЫБРАТЬ

                  |    Ссылка,              

                  |ИЗ

                  |    Документ.МедКарты как МедКарты

                  |ГДЕ

                  |    МедКарты.Специалист = &реквизит1 и МедКарты.Специалист = &реквизит2;

   cdpoma

11 — 17.09.10 — 08:53

второй параметр пациент

   cdpoma

12 — 17.09.10 — 08:53

а как параметры получить)

   skunk

13 — 17.09.10 — 08:54

(12)а вы программист или кто?

   cdpoma

14 — 17.09.10 — 08:54

Запрос.УстановитьПараметр(«Пациент», Пациент)?

   cdpoma

15 — 17.09.10 — 08:54

любитель

   Егор Сергеевич

16 — 17.09.10 — 08:55

(10) может тебе ИЛИ надо? или ты чего то путаешь?

   Егор Сергеевич

17 — 17.09.10 — 08:55

(14) да

   cdpoma

18 — 17.09.10 — 08:55

нет надо и

   Егор Сергеевич

19 — 17.09.10 — 08:57

(18) уже прочитал, что второй параметр Пациент

   cdpoma

20 — 17.09.10 — 08:57

я впирницпе так и думал просто хотел подтвердить)

   cdpoma

21 — 17.09.10 — 08:58

спасибо

   Егор Сергеевич

22 — 17.09.10 — 08:58

«ВЫБРАТЬ
                  |    Ссылка,              
                  |ИЗ
                  |    Документ.МедКарты как МедКарты
                  |ГДЕ
                  |    МедКарты.Специалист = &специалист и МедКарты.пациент = &пациент»

Запрос.УстановитьПараметр(«Пациент», Пациент)
Запрос.УстановитьПараметр(«Специалист», Специалист)

   cdpoma

23 — 17.09.10 — 08:59

дело в том что там только одна медкарта будет, смысл потом перебирать..

   cdpoma

24 — 17.09.10 — 09:00

в справочнике можно по 3 параметрам найти а в документе нет

   Егор Сергеевич

25 — 17.09.10 — 09:01

(23) а кто перебирать заставляет. Получишь ссылку на свою медкарту запросом и работай с ней дальше.

   artems

26 — 17.09.10 — 09:02

(23) а ты в этом абсолютно уверен?

   cdpoma

27 — 17.09.10 — 09:09

{Документ.ЗаписиНаПрием.Форма.ФормаЭлемента.Форма(83)}: Ошибка при вызове метода контекста (Выполнить)

   МедКарта=Запрос.Выполнить().Ссылка;

по причине:

по причине:

{(6, 21)}: Не задано значение параметра «Пациент»

МедКарты.Пациент = <<?>>&Пациент и МедКарты.Специалист = &Специалист

   artems

28 — 17.09.10 — 09:11

(27) Ну так задай значение параметра

   artems

29 — 17.09.10 — 09:12

а МедКарта=Запрос.Выполнить().Ссылка; — не прокатит ))

   artems

30 — 17.09.10 — 09:14

Выбрка = Запрос.Выполнить().Выбрать();
если Выборка.Следующий() тогда
   МедКарта = Выборка.Ссылка;
конецесли;

   cdpoma

31 — 17.09.10 — 09:16

бред конечно делать запрос и перебор строк ради одного документа)

   cdpoma

32 — 17.09.10 — 09:17

имхо есть более рациональное решение

   Ksandr

33 — 17.09.10 — 09:18

(31) бред ты говоришь!!! RTFM!!!!11

   cdpoma

34 — 17.09.10 — 09:21

все равно ошибка (27)

   artems

35 — 17.09.10 — 09:22

ЗАДАЙ ПАРАМЕТРЫ !!!!!!

   Егор Сергеевич

36 — 17.09.10 — 09:22

(34) код в студию

   cdpoma

37 — 17.09.10 — 09:24

ТекстЗапроса = «ВЫБРАТЬ

                  |    Ссылка              

                  |ИЗ

                  |    Документ.МедКарты как МедКарты

                  |ГДЕ

                  |    МедКарты.Пациент = &Пациент  И МедКарты.Специалист = &Специалист «;

               Запрос = Новый Запрос(ТекстЗапроса);

               Запрос.УстановитьПараметр(«Пациент», Пациент);

               Запрос.УстановитьПараметр(«Специалист», Специалист);

               
               Запрос = Новый Запрос(ТекстЗапроса);

               Выборка = Запрос.Выполнить().Выбрать();

               если Выборка.Следующий() тогда

                   МедКарта = Выборка.Ссылка;

               конецесли;

   Егор Сергеевич

38 — 17.09.10 — 09:25

(37) зачем два раза создаешь новый объект?

   cdpoma

39 — 17.09.10 — 09:25

пля вот я неувязок 2 раза запрос создаю))

   cdpoma

40 — 17.09.10 — 09:26

все гуд

  

Егор Сергеевич

41 — 17.09.10 — 09:26

ТекстЗапроса = «ВЫБРАТЬ
                  |    Ссылка              
                  |ИЗ
                  |    Документ.МедКарты как МедКарты
                  |ГДЕ
                  |    МедКарты.Пациент = &Пациент  И МедКарты.Специалист = &Специалист «;
               Запрос = Новый Запрос(ТекстЗапроса);
               Запрос.УстановитьПараметр(«Пациент», Пациент);
               Запрос.УстановитьПараметр(«Специалист», Специалист);

                               Выборка = Запрос.Выполнить().Выбрать();
               если Выборка.Следующий() тогда
                   МедКарта = Выборка.Ссылка;
               конецесли;

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

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

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

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

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

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

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

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

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

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

/

/

/

Совет: Эффективный поиск по спискам документов – Как в 1С 8.3 найти документ в списке?

25.11.2019

Функционал программы 1С позволяет гибко настраивать списки, что позволяет легче ориентироваться в документах и осуществлять быстрый поиск. На примере 1С:Бухгалетрии 8 рассмотрим способы быстрого поиска и наглядной организации информации в списке документов.

Базовые инструменты отбора и сортировки встроены сразу в форму списка, и могут облегчить поиск документов 1С в самых распространенных случаях – когда необходим отбор по контрагенту или организации, либо когда необходимо сортировать список по данным любого столбца, например по статусу оплаты. Для этого нужно щелкнуть левой кнопкой по заголовку столбца (щелкнуть дважды, чтобы инвертировать сортировку).

базовый поиск документов в списке 1С

Также через контекстное меню при нажатии правой кнопкой мыши на любом документе (или сочетанием клавиш Ctrl + F) можно вызвать «Расширенный поиск» – простой отбор по значению в любой из колонок, поиск можно осуществить по точному совпадению с поисковой фразой, по началу строки или по любой части строки. Так же через контекстное меню можно произвести отбор по дате документа с помощью функции «Установить период…». Функции можно применять последовательно, например, ограничить временным периодом список с результатами расширенного поиска.

расширенный поиск и ограничение по периоду документов 1С

Однако базовых возможностей поиска оказывается недостаточно, когда документов очень много и из них нужно найти определенные. Например, оставить в списке только непроведенные документы, или найти документ сразу по нескольким условиям. Расширенный функционал отбора и сортировки находится в меню «Еще…», кнопка «Настроить список…»

расширенный поиск документов в списке 1С 8.3 – сложный отбор и сортировка

Обратимся к вкладке «Отбор». Справа в столбце расположены все реквизиты документов, по которым их можно отфильтровать. Структура реквизитов иерархическая – можно осуществлять отбор по основному реквизиту (например по Контрагенту), либо по подчиненному (например, по ИНН контрагента, либо по характеристике юр./физ. лицо). Также можно создавать сложные отборы – то есть сразу по нескольким реквизитам документов 1С. Так, в примере ниже, в списке счетов мы осуществляем отбор по сумме счета (не менее 10 000 руб.) и статусу оплаты (не оплачен).

поиск документов в списке 1С - отбор счетов в 1С Бухгалтерии 8.3

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

сортировка документов в списке 1С 8.3

Далее, когда вам потребуется сбросить настройки поиска, сортировки и отбора документов 1С, вы можете вернуться к стандартным настройкам списка. Для этого в окне настройки списка нажмите на кнопку «Еще…», затем – «Установить стандартные настройки».

отключить поиск и отбор документов в списке 1С 8.3

Помимо этого, вы можете организовать реквизиты в списке любым удобным образом, или даже добавить для отображения новые. Для этого через меню «Еще…» откройте окно «Изменить форму…»

открыть окно изменения формы списка документов 1С 8.3

Например, реквизит «Комментарии» стандартно находится с крайней правой части окна списка и комментария может быть не видно без дополнительной прокрутки. В примере мы изменим местоположение реквизита комментарий, чтобы он отображался правее. Для этого реквизит нужно «поднять».

изменить место отображения реквизита 1С 8.3

Помимо этого, вы можете добавить новые реквизиты для отображения. Так, для примера мы добавим в отображение новый реквизит – телефон контрагента.

добавить новый реквизит для отображения в список документов 1С 8.3

Пройдите курсы 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


Всем доброго времени суток.
Вопрос таков…

Есть некий Эксель, в котором содержится текстовая информация.
Ну пусть строки «к1,к2,к3»

И таких в Экселе строк энное количество будет.

Есть номенклатура в бд,в которой добавлены доп.реквизиты в которых содержатся те же самые текстовые значения, что и в Экселе.
То есть в карточке номенклатуры в доп.реквизите 1 указано «к1″,в доп.реквизите 2″к2» и тд.

Вот как мне получить ОДНИМ запросом всю номенклатуру справочника у которой совпали ВСЕ 3 параметра?

Вот я выгрузил таблицу значений с данными Экселя во времянку в запросе.
Теперь левым соединением цепляюсь у доп реквизитам номенклатуры чтобы получить ссылку номенклатуры.

Вот какое должно быть условие в соединении чтобы получить и ссылку и значения этих доп.реквизитов???
ПО И канает только для 1 доп.значения.ПО ИЛИ вернёт номенклатуру где только 1 из значений совпадает.
Значения нужны чтобы потом в таблице значений из Экселя заполнить ссылки на товары.



0



1508 / 950 / 365

Регистрация: 31.05.2012

Сообщений: 3,344

22.09.2021, 16:40

2

А чего ПО И канает только для 1 доп.значения?
Номенклатура.ДопРекв1=ВТ.ДопРекв1 И Номенклатура.ДопРекв2=ВТ.ДопРекв2 и т.д. хоть 100 И , если 1С не загнется ))



0



OverDozero

262 / 218 / 94

Регистрация: 07.04.2011

Сообщений: 1,342

22.09.2021, 17:03

 [ТС]

3

ВТ.ДопРекв1, ВТ.ДопРекв2 так в ВТ то все 3 доп.реквизита в 1 колонке.

1C
1
2
3
4
5
6
ВЫБРАТЬ
НоменклатураДополнительныеРеквизиты.Ссылка,
НоменклатураДополнительныеРеквизиты.Значение
ИЗ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизит
ГДЕ
НоменклатураДополнительныеРеквизиты.Свойство В(&мСвойств)"

Где мСвойств это массив со свойствами.

А вот в значении как раз те показатели по которым надо связать 3 значения из экселя.
Разделял каждое отдельно свойство и его значения, но результат не тот который нужен.Он вернет 3 номенклатуры где хоть 1 значение совпадает.
А объединение не проходит так как значения разные.



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 минут

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
ВЫБРАТЬ
    ВЫРАЗИТЬ(ДанныеТаблицы.ДиапазонРасцветок КАК СТРОКА(1024)) КАК ДиапазонРасцветок,
    ВЫРАЗИТЬ(ДанныеТаблицы.ДлинаПорога КАК СТРОКА(1024)) КАК ДлинаПорога,
    ВЫРАЗИТЬ(ДанныеТаблицы.ШиринаПорога КАК СТРОКА(1024)) КАК ШиринаПорога
ПОМЕСТИТЬ ДанныеТаблицыЗначений
ИЗ
    &Таблица КАК ДанныеТаблицы
;
 
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    НоменклатураДополнительныеРеквизиты.Ссылка КАК НоменклатураСсылка,
    НоменклатураДополнительныеРеквизиты.Свойство КАК Свойство,
    НоменклатураДополнительныеРеквизиты.Значение КАК Значение
ПОМЕСТИТЬ ДанныеНоменклатуры
ИЗ
    Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
ГДЕ
    НоменклатураДополнительныеРеквизиты.Свойство В(&мСвойств)
;
 
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДанныеТаблицыЗначений.ДиапазонРасцветок КАК ДиапазонРасцветок,
    ДанныеТаблицыЗначений.ДлинаПорога КАК ДлинаПорога,
    ДанныеТаблицыЗначений.ШиринаПорога КАК ШиринаПорога,
    ДанныеНоменклатуры.НоменклатураСсылка КАК НоменклатураСсылка
ИЗ
    ДанныеТаблицыЗначений КАК ДанныеТаблицыЗначений
        ЛЕВОЕ СОЕДИНЕНИЕ ДанныеНоменклатуры КАК ДанныеНоменклатуры
        ПО (ДанныеТаблицыЗначений.ДиапазонРасцветок = ДанныеНоменклатуры.Значение.Наименование)

Вот так возвращает позиции где есть доп.реквизит.
Второй и третий осталось сюда прикрутить



0



1142 / 689 / 203

Регистрация: 22.04.2013

Сообщений: 5,161

Записей в блоге: 1

22.09.2021, 21:33

6

раз 7 перечитал условие задачи но так и не понял
где в екселе привязка к номенклатуре, если там строки (какие там строки? так и не понял. к1,к2,к3,к4,к5,…..к998,к999,… ?)



0



262 / 218 / 94

Регистрация: 07.04.2011

Сообщений: 1,342

22.09.2021, 21:47

 [ТС]

7

Шо непонятного то?)
Есть табличная часть обработки в которой инфа о номенклатуре(это справочник номенклатуры), и 3 поля , пусть, этодлина,ширина,высота.Строковый тип.

Вот из экселя заполнились длина,ширина и высота.
Теперь в эту ТЧ надо подобрать номенклатуру по этим 3 параметрам.То есть найти ссылку на номенклатуру у которой в доп.реквизитах совпали по значениям поля длина,ширина и высота.По всем 3 сразу

P.S.Решение было найдено левым соединением по каждому свойству в отдельности.
Можно сделать это вроде объединением, но я хз как)



0



Yulunga

1142 / 689 / 203

Регистрация: 22.04.2013

Сообщений: 5,161

Записей в блоге: 1

22.09.2021, 22:19

8

ну в смысле

1C
1
2
3
4
5
6
7
выбрать 
допрек.значение как длина, 0 как высота, 0 как ширина
где допрек.свойство = "имядлины"
 
объединть все
выбрать 0, допрек.значение, 0
где допрек.свойство = "имявысоты

«

проширину также

это ты спрашивал?



1



Dethmontt

23.09.2021, 03:59

Не по теме:

Учимся разворачивать таблицу на колонки в запросе…



0



OverDozero

262 / 218 / 94

Регистрация: 07.04.2011

Сообщений: 1,342

23.09.2021, 10:24

 [ТС]

10

Цитата
Сообщение от Yulunga
Посмотреть сообщение

ну в смысле

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
ВЫБРАТЬ
        Длина.Значение.Наименование КАК Длина,
        "" КАК Ширина,
        "" КАК Цвет
    ИЗ
        ВТ_НоменклатураПоСвойствам КАК Длина
    ГДЕ
        Длина.Свойство = &СвойствоДлина
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        "",
        Ширина.Значение.Наименование,
        ""
    ИЗ
        ВТ_НоменклатураПоСвойствам КАК Ширина
    ГДЕ
        Ширина.Свойство = &СвойствоШирина
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        "",
        "",
        Цвет.Значение.Наименование
    ИЗ
        ВТ_НоменклатураПоСвойствам КАК Цвет
    ГДЕ
        Цвет.Свойство = &СвойствоЦвет

Вытаскивает он таблицу вида

Длина1 Ширина1 Цвет1
100 «» «»
«» 900 «»
«» 1000 «»
«» «» Красный
«» «» Белый

А это я еще не выводил в ней ссылки на номенклатуру у которой эти свойства
Свойства разные, у 1 и того же свойства может быть несколько значений(в доп.свойстве задан список доступных значений)

Я за это топлю.

Добавлено через 49 минут
Собственно решение как это работает сейчас

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
ВЫБРАТЬ
    ВЫРАЗИТЬ(ДанныеТаблицы.ДиапазонРасцветок КАК СТРОКА(1024)) КАК ДиапазонРасцветок,
    ВЫРАЗИТЬ(ДанныеТаблицы.ДлинаПорога КАК СТРОКА(1024)) КАК ДлинаПорог,
    ВЫРАЗИТЬ(ДанныеТаблицы.ШиринаПорога КАК СТРОКА(1024)) КАК ШиринаПорога
ПОМЕСТИТЬ ДанныеТаблицыЗначений
ИЗ
    &Таблица КАК ДанныеТаблицы
;
 
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    НоменклатураДополнительныеРеквизиты.Ссылка КАК Ссылка,
    НоменклатураДополнительныеРеквизиты.Свойство КАК Свойство,
    НоменклатураДополнительныеРеквизиты.Значение КАК Значение
ПОМЕСТИТЬ ВТ_НоменклатураПоСвойствам
ИЗ
    Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
ГДЕ
    НоменклатураДополнительныеРеквизиты.Свойство В(&мСвойств)
;
 
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_НоменклатураПоСвойствам.Ссылка КАК Ссылка,
    Длина.Значение.Наименование КАК Длина,
    Цвет.Значение.Наименование КАК Цвет,
    Ширина.Значение.Наименование КАК Ширина
ИЗ
    ВТ_НоменклатураПоСвойствам КАК ВТ_НоменклатураПоСвойствам
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_НоменклатураПоСвойствам КАК Длина
        ПО (ВТ_НоменклатураПоСвойствам.Ссылка = Длина.Ссылка)
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_НоменклатураПоСвойствам КАК Цвет
        ПО (ВТ_НоменклатураПоСвойствам.Ссылка = Цвет.Ссылка)
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_НоменклатураПоСвойствам КАК Ширина
        ПО (ВТ_НоменклатураПоСвойствам.Ссылка = Ширина.Ссылка)
ГДЕ
    Длина.Свойство = &СвойствоДлина
    И Цвет.Свойство = &СвойствоЦвет
    И Ширина.Свойство = &СвойствоШирина
 
СГРУППИРОВАТЬ ПО
    ВТ_НоменклатураПоСвойствам.Ссылка,
    Длина.Значение.Наименование,
    Цвет.Значение.Наименование,
    Ширина.Значение.Наименование



0



1142 / 689 / 203

Регистрация: 22.04.2013

Сообщений: 5,161

Записей в блоге: 1

23.09.2021, 13:15

11

ну там нулл должен быть а не «»
но я не уверен. но вроде так надо делать



0



Понравилась статья? Поделить с друзьями:
  • Яндекс практикум бизнес аналитик бесплатно
  • 1 место в транспортной компании это сколько
  • Яндекс такси бизнес аккаунт личный кабинет
  • 1 с для транспортно экспедиционной компании
  • Яндекс такси войти в аккаунт бизнес онлайн