Вопрос по запросу

1. serg_gres 154 17.08.12 16:17 Сейчас в теме
Есть задача:
соединить 2-е таблицы одним запросом.

Таблица 1 - исходные данные
Таблица 2 - содержит в каждой строке условие и ссылку

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

Вот пример:

По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
34. juntatalor 63 17.08.12 17:15 Сейчас в теме
(32)
Это зависит, как происходит перенос движений. Если все делается через файл, то из таблицы, имеющейся в файле. Если напрямую между базами, то через COM-соединение.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
9. tango 546 17.08.12 16:33 Сейчас в теме
короче, где деньги, (1) ?
2. tango 546 17.08.12 16:21 Сейчас в теме
3. tango 546 17.08.12 16:22 Сейчас в теме
а, пардон, 10 ёжиков, не заметил-с
4. juntatalor 63 17.08.12 16:27 Сейчас в теме
Использовать графу "Условие" напрямую в запросе не получится.

Я бы думал в следующую сторону:

1) Разделить графу условие на 3 столбца: A(число), B(число), ABРавны(булево)

Тогда вторая таблица в вашем случае выглядела бы так:

10 | 5 | Ложь | Ссылка1
0 | 0 | Истина | Ссылка2
45 | 50| Ложь | Ссылка3

И условие объединения выглядело бы следующим образом:
ВЫБРАТЬ Табл1.А, Табл1.Б, Табл2.Ссылка ИЗ
Таблица_1 КАК Табл1 ЛЕВОЕ СОЕДИНЕНИЕ Таблица_2 КАК Табл2 ПО
(Табл1.А = Табл2.А И Табл1.Б = Табл2.Б) ИЛИ (Табл2.АБРавны И Табл1.А = Табл2.Б)

Вопрос в масштабируемости решения. для использования более сложных условий придется вводить дополнительные столбцы. Проще, возможно, решить данную задачу встроенным языком.
12. serg_gres 154 17.08.12 16:41 Сейчас в теме
(4) juntatalor, все правильно пишете,
только пример я привел сильно упрощенный,
это условие будет перерабатываться из СКД-шного отбора.

Встроенным языком можно, вопросов нет, просто мучает вопрос - можно ли сделать проще и через один запрос.
5. AlexO 136 17.08.12 16:28 Сейчас в теме
Куча народу наблюдает - "а где 10 ежиков?!" :)))
7. tango 546 17.08.12 16:28 Сейчас в теме
6. tango 546 17.08.12 16:28 Сейчас в теме
Текст = "Выбрать т1.а, т1.б, т2.Ссылка ИЗ т1 Левое т2 ПО ИСТИНА ";
Для Каждого стр из т2 Цикл
Текст = Текст + " ИЛИ (" +стр.Условие+"(";
КонецЦикла;

условия в т2 надо привести 1скульному виду
8. tango 546 17.08.12 16:32 Сейчас в теме
Текст = Текст + " ИЛИ (" +Заменить(Заменить(стр.Условие,"А","т1.А"),"В","т1.В")+")";

ну как-то так
10. serg_gres 154 17.08.12 16:38 Сейчас в теме
(8) tango,
если сделать как вы предлагаете получится :

"Выбрать
| т1.а,
| т1.б,
| т2.Ссылка
|ИЗ т1
| Левое СОЕДИНЕНИЕ т2
| ПО ИСТИНА И (A=10 и В=5) И (A=В) И (A=45 и В=50)"

и что будет в результате запроса?
11. tango 546 17.08.12 16:41 Сейчас в теме
(10) serg_gres, а вы попробуйте еще раз
ладно, придется после цикла лишнюю или убивать
13. juntatalor 63 17.08.12 16:43 Сейчас в теме
Если формировать условие по методу (8), надо убрать ПО ИСТИНА и разделить условия по ИЛИ:

"Выбрать
| т1.а,
| т1.б,
| т2.Ссылка
|ИЗ т1
| Левое СОЕДИНЕНИЕ т2
| ПО (A=10 и В=5) ИЛИ (A=В) ИЛИ (A=45 и В=50)"

Но вот честно, если у вас в таблице будет много записей и много условий, такой запрос будет выполняться очень долго.
15. tango 546 17.08.12 16:45 Сейчас в теме
(13) juntatalor, вообще-то - у вас. и с каждым новым витомином следовало бы увеличивать обещанное вознаграждение. а что бы не получалась морковка, по-этапно раздавать
16. serg_gres 154 17.08.12 16:48 Сейчас в теме
(13) juntatalor,
записей будет много.

"Выбрать
| т1.а,
| т1.б,
| т2.Ссылка
|ИЗ т1
| Левое СОЕДИНЕНИЕ т2
| ПО (A=10 и В=5) ИЛИ (A=В) ИЛИ (A=45 и В=50)"

смотрю я на этот запрос, вроде что-то такое, но мне кажется он не сработает,
нужно к условиям еще добавлять привязку к т2
18. juntatalor 63 17.08.12 16:50 Сейчас в теме
(16)
Ну естественно, условия так были записаны для упрощения записи.
14. tango 546 17.08.12 16:44 Сейчас в теме
19. tango 546 17.08.12 16:51 Сейчас в теме
короче, коллега, или отвечай на (14) или я не играю
21. serg_gres 154 17.08.12 16:52 Сейчас в теме
17. serg_gres 154 17.08.12 16:49 Сейчас в теме
а с другой стороны если будет записей много - через циклы будет быстрее?
мне кажется - нет
22. juntatalor 63 17.08.12 16:53 Сейчас в теме
(17)
Повторюсь, вопрос в том, насколько сложными будут условия. Если здесь ограничений нет (то есть разрешены любые условия, например (А = Б ИЛИ (А + 1 = Б - 14) ИЛИ ((А / 2 = Б + 3) И (А = Б - 90)), то может быть вам стоит поискать другой метод решения задачи (вообще без объединения таблиц и формирования условий). Может быть опишите задачу целиком и исходя из нее будем думать?
24. serg_gres 154 17.08.12 16:57 Сейчас в теме
(22) juntatalor,
это будет "универсальный перенос проводок"
Таблица1 - проводки со всеми реквизитами
Таблица2 - условия и формат преобразования при загрузке

Есть правила переноса, которые заполняет пользователь, в правилах прописаны условия, по которым нужно отобрать какие-то проводки, и прописаны действия при загрузке этих проводок (в какой документ загрузить, как преобразовать и тд)
27. tango 546 17.08.12 17:00 Сейчас в теме
(24) serg_gres, СКД здесь при чем?
26. serg_gres 154 17.08.12 16:59 Сейчас в теме
(22) juntatalor, условия чаще всего будет достаточно простыми СчетДт="51" и СчетКт="60", но в отдельных случаях могут очень усложнится (спрогнозировать это не возможно), например, СчетДт="51" и СчетКт="60" и Субконто1<>"Основная организация" и тд и тп
20. serg_gres 154 17.08.12 16:51 Сейчас в теме
"Выбрать
| т1.а,
| т1.б,
| т2.Ссылка
|ИЗ т1
| Левое СОЕДИНЕНИЕ т2
| ПО (т1.а=10 и т1.б=5 и т2.Условие=""A=10 и В=5"") ИЛИ (т1.а=т1.б и т2.Условие=""A=В"") ИЛИ (т1.а=45 и т1.б=50 и т2.Условие=""A=45 и В=50"")"

может быть так?
23. serg_gres 154 17.08.12 16:54 Сейчас в теме
будет обработка в которой будет использоваться схема СКД,
на форме будет высунут отбор СКД по этой схеме,
отбор будет заполнять пользователь
PS как-то раньше тестировал на 8.1 - с отбором все нормально получалось, надо будет посмотреть как получится в 8.2
25. tango 546 17.08.12 16:58 Сейчас в теме
хорошо, заполнил юзер отбор скдехи
дальше что?
нафига его запихивать в таблицу, да еще в таком виде?
и зачем он (отбор) применяется кроме как в самой скд?

короче, в чем предметная задача состоит?
28. serg_gres 154 17.08.12 17:00 Сейчас в теме
(25) tango, отбор СКД только для удобства: в нем можно делать группы условий, ставить не равно, больше, меньше и т.д - рисовать свой механизм на это как-то не хочется
30. juntatalor 63 17.08.12 17:05 Сейчас в теме
(28) Так а нельзя "пошагово" составлять таблицу:

1) Юзер заполнил отбор в СКД
2) Получили записи по этому отбору
3) Поместили в таблицу
4) Перейти к пункту 1) до наступления желаемого результата
32. tango 546 17.08.12 17:07 Сейчас в теме
(30) juntatalor, 2) Получили записи по этому отбору
из ЧЕГО вы собрались на этом шаге что-то получать по условиям, содержащем объекты 1сы?
34. juntatalor 63 17.08.12 17:15 Сейчас в теме
(32)
Это зависит, как происходит перенос движений. Если все делается через файл, то из таблицы, имеющейся в файле. Если напрямую между базами, то через COM-соединение.
41. serg_gres 154 17.08.12 20:34 Сейчас в теме
К слову следует сказать, что на поставленную мною задачу ни один из участников не ответил правильно.
Решил ее (точнее довел до конца) - я сам, а tango и juntatalor меня навели на решение.
За что я им ОБОИМ, ОЧЕНЬ БЛАГОДАРЕН.
То, что я указал лучший ответ (34) - не обращайте внимания, я просто указал пользователя с вознаграждением а не конкретное сообщение, и этот ответ первым попался "под руку". А лучшего ответа в теме и не было - все ответы были где-то около него.

Также замечу, что мне не столько важен какой-то доскональный ответ, а скорее мысль (решение, направление), которое у меня возникнет для решения этой задачи.


tango,
есть справочник "Правила переноса",
в форме элемента есть поле, в котором находится отбор.
Пользователь при заполнении формы указывает какой-то отбор.
При записи элемента, этот отбор преобразуется в строку
соединенную по И и ИЛИ и не явно записывается,
фактически создается текстовое условие,
которое затем будет использоваться в запросе.

Почему СКД, почему отбор? - скажите какой штатный механизм 1С 8 можно использовать, что бы отдать его пользователю для заполнения любых, произвольных условий?
29. AlexO 136 17.08.12 17:02 Сейчас в теме
31. tango 546 17.08.12 17:06 Сейчас в теме
загрузка из файла? перед обработкой по условиям текст файла как-то уже сопоставлен объекта в загружаемой базе?

зы:эти три буковы <СКД> в сабже лишние совсем

Отбор (Filter)
Отбор (Filter)
Элементы коллекции:

ЭлементОтбора
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы отбора.
Возможно обращение к элементу отбора посредством оператора [...]. В качестве аргумента передается индекс элемента (нумерация с 0).

Свойства:

<Имя элемента отбора> (<Filter element name>)

Методы:

Добавить (Add)
Индекс (IndexOf)
Количество (Count)
Найти (Find)
Получить (Get)
ПолучитьДоступныеПоля (GetAvailableFields)
Сбросить (Reset)
Сдвинуть (Move)
Удалить (Delete)
УстановитьДоступныеПоля (SetAvailableFields)

Описание:

Предназначен для хранения условий отбора.
Представляет собой коллекцию элементов отбора. Используется для установки фильтрации данных в различных выборках, наборах записей, визуальных списках.
Каждый из элементов может устанавливать одно условие. Весь объект представляет собой составное условие, состоящее из отдельных условий, описываемых элементами, соединяющимися по "И".

Доступность:

Сервер, толстый клиент, внешнее соединение.
33. serg_gres 154 17.08.12 17:12 Сейчас в теме
Работает механизм просто (он уже давно есть на 7.7)
Из базы 1 выгружается файл - в нем полный список проводок со ВСЕМИ реквитами проводки.
В базе 2 - есть правила загрузки, в них прописано:
а) условия
б) что сделать с найденной по условию проводкой:
- загрузить в такой-то документ
- реквизит такой-то установить так-то и т.д.
но это уже уходит от данной темы....
36. tango 546 17.08.12 17:20 Сейчас в теме
(33) serg_gres, но это уже уходит от данной темы....
ну да, сабж и ваша задача не связаны никак
39. AlexO 136 17.08.12 17:49 Сейчас в теме
(36) tango,
это у меня такое впечатление - что все больше тем такого плана:
Q:- Как пройти к вокзалу?
A's:
- Вам к какому?
- Куда ехать собираетесь?
- Вам путь короче или получше?
- Туалет - НАЛЕВО!

- О, спасибо! Последний ответ - то, что мне нужно!
40. tango 546 17.08.12 19:12 Сейчас в теме
(39) ну как бе да
я заслужил не получение этих маней, поскольку ответ (34) тупо не понял.
как эти уважаемые коллеги собираются применять 1с-отборы к текстовому потоку!?!?
но, несомненно, это лучший ответ на сабж
35. tango 546 17.08.12 17:19 Сейчас в теме
в сабже лишним является так же термин <запрос>
37. serg_gres 154 17.08.12 17:23 Сейчас в теме
В принципе я думаю сработает запрос:

"Выбрать
| т1.а,
| т1.б,
| т2.Ссылка
|ИЗ т1
| Левое СОЕДИНЕНИЕ т2
| ПО (т1.а=10 и т1.б=5 и т2.Условие=""A=10 и В=5"") ИЛИ (т1.а=т1.б и т2.Условие=""A=В"") ИЛИ (т1.а=45 и т1.б=50 и т2.Условие=""A=45 и В=50"")"

поэтому задачу считаю закрытой.

juntatalor и tango - Вы мне очень помогли, но вознаграждение я не могу разделить на 2 - части.
Вознаграждение отдаю juntatalor - потому что "tango" занимался "читерством" и исправлял ранее сделанные ошибки.
38. tango 546 17.08.12 17:28 Сейчас в теме
(37) serg_gres, тогда мою нотацию из запросов убирай
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот