По теме из базы знаний
- "Идеальный кандидат". 10 Вопросов, позволяющих "подобрать нужного" программиста 1С.
- Курсы валют на разные даты в одном запросе. Делаем свой нестандартный срез последних.
- Молчание "best practices": тестовые и эталонные данные, структура и связность, падения и новая функциональность, и другие неудобные вопросы к сценарному тестированию
- Генератор текста запроса
- Инвентаризация кодов маркировки системы "Честный знак", запрос, сравнение с остатками 1С, списание, ОСУ
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Использовать графу "Условие" напрямую в запросе не получится.
Я бы думал в следующую сторону:
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.Б)
Вопрос в масштабируемости решения. для использования более сложных условий придется вводить дополнительные столбцы. Проще, возможно, решить данную задачу встроенным языком.
Я бы думал в следующую сторону:
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.Б)
Вопрос в масштабируемости решения. для использования более сложных условий придется вводить дополнительные столбцы. Проще, возможно, решить данную задачу встроенным языком.
Если формировать условие по методу (8), надо убрать ПО ИСТИНА и разделить условия по ИЛИ:
"Выбрать
| т1.а,
| т1.б,
| т2.Ссылка
|ИЗ т1
| Левое СОЕДИНЕНИЕ т2
| ПО (A=10 и В=5) ИЛИ (A=В) ИЛИ (A=45 и В=50)"
Но вот честно, если у вас в таблице будет много записей и много условий, такой запрос будет выполняться очень долго.
"Выбрать
| т1.а,
| т1.б,
| т2.Ссылка
|ИЗ т1
| Левое СОЕДИНЕНИЕ т2
| ПО (A=10 и В=5) ИЛИ (A=В) ИЛИ (A=45 и В=50)"
Но вот честно, если у вас в таблице будет много записей и много условий, такой запрос будет выполняться очень долго.
(13) juntatalor,
записей будет много.
"Выбрать
| т1.а,
| т1.б,
| т2.Ссылка
|ИЗ т1
| Левое СОЕДИНЕНИЕ т2
| ПО (A=10 и В=5) ИЛИ (A=В) ИЛИ (A=45 и В=50)"
смотрю я на этот запрос, вроде что-то такое, но мне кажется он не сработает,
нужно к условиям еще добавлять привязку к т2
записей будет много.
"Выбрать
| т1.а,
| т1.б,
| т2.Ссылка
|ИЗ т1
| Левое СОЕДИНЕНИЕ т2
| ПО (A=10 и В=5) ИЛИ (A=В) ИЛИ (A=45 и В=50)"
смотрю я на этот запрос, вроде что-то такое, но мне кажется он не сработает,
нужно к условиям еще добавлять привязку к т2
(17)
Повторюсь, вопрос в том, насколько сложными будут условия. Если здесь ограничений нет (то есть разрешены любые условия, например (А = Б ИЛИ (А + 1 = Б - 14) ИЛИ ((А / 2 = Б + 3) И (А = Б - 90)), то может быть вам стоит поискать другой метод решения задачи (вообще без объединения таблиц и формирования условий). Может быть опишите задачу целиком и исходя из нее будем думать?
Повторюсь, вопрос в том, насколько сложными будут условия. Если здесь ограничений нет (то есть разрешены любые условия, например (А = Б ИЛИ (А + 1 = Б - 14) ИЛИ ((А / 2 = Б + 3) И (А = Б - 90)), то может быть вам стоит поискать другой метод решения задачи (вообще без объединения таблиц и формирования условий). Может быть опишите задачу целиком и исходя из нее будем думать?
(22) juntatalor,
это будет "универсальный перенос проводок"
Таблица1 - проводки со всеми реквизитами
Таблица2 - условия и формат преобразования при загрузке
Есть правила переноса, которые заполняет пользователь, в правилах прописаны условия, по которым нужно отобрать какие-то проводки, и прописаны действия при загрузке этих проводок (в какой документ загрузить, как преобразовать и тд)
это будет "универсальный перенос проводок"
Таблица1 - проводки со всеми реквизитами
Таблица2 - условия и формат преобразования при загрузке
Есть правила переноса, которые заполняет пользователь, в правилах прописаны условия, по которым нужно отобрать какие-то проводки, и прописаны действия при загрузке этих проводок (в какой документ загрузить, как преобразовать и тд)
"Выбрать
| т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"")"
может быть так?
| т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"")"
может быть так?
будет обработка в которой будет использоваться схема СКД,
на форме будет высунут отбор СКД по этой схеме,
отбор будет заполнять пользователь
PS как-то раньше тестировал на 8.1 - с отбором все нормально получалось, надо будет посмотреть как получится в 8.2
на форме будет высунут отбор СКД по этой схеме,
отбор будет заполнять пользователь
PS как-то раньше тестировал на 8.1 - с отбором все нормально получалось, надо будет посмотреть как получится в 8.2
К слову следует сказать, что на поставленную мною задачу ни один из участников не ответил правильно.
Решил ее (точнее довел до конца) - я сам, а tango и juntatalor меня навели на решение.
За что я им ОБОИМ, ОЧЕНЬ БЛАГОДАРЕН.
То, что я указал лучший ответ (34) - не обращайте внимания, я просто указал пользователя с вознаграждением а не конкретное сообщение, и этот ответ первым попался "под руку". А лучшего ответа в теме и не было - все ответы были где-то около него.
Также замечу, что мне не столько важен какой-то доскональный ответ, а скорее мысль (решение, направление), которое у меня возникнет для решения этой задачи.
tango,
есть справочник "Правила переноса",
в форме элемента есть поле, в котором находится отбор.
Пользователь при заполнении формы указывает какой-то отбор.
При записи элемента, этот отбор преобразуется в строку
соединенную по И и ИЛИ и не явно записывается,
фактически создается текстовое условие,
которое затем будет использоваться в запросе.
Почему СКД, почему отбор? - скажите какой штатный механизм 1С 8 можно использовать, что бы отдать его пользователю для заполнения любых, произвольных условий?
Решил ее (точнее довел до конца) - я сам, а tango и juntatalor меня навели на решение.
За что я им ОБОИМ, ОЧЕНЬ БЛАГОДАРЕН.
То, что я указал лучший ответ (34) - не обращайте внимания, я просто указал пользователя с вознаграждением а не конкретное сообщение, и этот ответ первым попался "под руку". А лучшего ответа в теме и не было - все ответы были где-то около него.
Также замечу, что мне не столько важен какой-то доскональный ответ, а скорее мысль (решение, направление), которое у меня возникнет для решения этой задачи.
tango,
есть справочник "Правила переноса",
в форме элемента есть поле, в котором находится отбор.
Пользователь при заполнении формы указывает какой-то отбор.
При записи элемента, этот отбор преобразуется в строку
соединенную по И и ИЛИ и не явно записывается,
фактически создается текстовое условие,
которое затем будет использоваться в запросе.
Почему СКД, почему отбор? - скажите какой штатный механизм 1С 8 можно использовать, что бы отдать его пользователю для заполнения любых, произвольных условий?
загрузка из файла? перед обработкой по условиям текст файла как-то уже сопоставлен объекта в загружаемой базе?
зы:эти три буковы <СКД> в сабже лишние совсем
Отбор (Filter)
Отбор (Filter)
Элементы коллекции:
ЭлементОтбора
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы отбора.
Возможно обращение к элементу отбора посредством оператора [...]. В качестве аргумента передается индекс элемента (нумерация с 0).
Свойства:
<Имя элемента отбора> (<Filter element name>)
Методы:
Добавить (Add)
Индекс (IndexOf)
Количество (Count)
Найти (Find)
Получить (Get)
ПолучитьДоступныеПоля (GetAvailableFields)
Сбросить (Reset)
Сдвинуть (Move)
Удалить (Delete)
УстановитьДоступныеПоля (SetAvailableFields)
Описание:
Предназначен для хранения условий отбора.
Представляет собой коллекцию элементов отбора. Используется для установки фильтрации данных в различных выборках, наборах записей, визуальных списках.
Каждый из элементов может устанавливать одно условие. Весь объект представляет собой составное условие, состоящее из отдельных условий, описываемых элементами, соединяющимися по "И".
Доступность:
Сервер, толстый клиент, внешнее соединение.
зы:эти три буковы <СКД> в сабже лишние совсем
Отбор (Filter)
Отбор (Filter)
Элементы коллекции:
ЭлементОтбора
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы отбора.
Возможно обращение к элементу отбора посредством оператора [...]. В качестве аргумента передается индекс элемента (нумерация с 0).
Свойства:
<Имя элемента отбора> (<Filter element name>)
Методы:
Добавить (Add)
Индекс (IndexOf)
Количество (Count)
Найти (Find)
Получить (Get)
ПолучитьДоступныеПоля (GetAvailableFields)
Сбросить (Reset)
Сдвинуть (Move)
Удалить (Delete)
УстановитьДоступныеПоля (SetAvailableFields)
Описание:
Предназначен для хранения условий отбора.
Представляет собой коллекцию элементов отбора. Используется для установки фильтрации данных в различных выборках, наборах записей, визуальных списках.
Каждый из элементов может устанавливать одно условие. Весь объект представляет собой составное условие, состоящее из отдельных условий, описываемых элементами, соединяющимися по "И".
Доступность:
Сервер, толстый клиент, внешнее соединение.
Работает механизм просто (он уже давно есть на 7.7)
Из базы 1 выгружается файл - в нем полный список проводок со ВСЕМИ реквитами проводки.
В базе 2 - есть правила загрузки, в них прописано:
а) условия
б) что сделать с найденной по условию проводкой:
- загрузить в такой-то документ
- реквизит такой-то установить так-то и т.д.
но это уже уходит от данной темы....
Из базы 1 выгружается файл - в нем полный список проводок со ВСЕМИ реквитами проводки.
В базе 2 - есть правила загрузки, в них прописано:
а) условия
б) что сделать с найденной по условию проводкой:
- загрузить в такой-то документ
- реквизит такой-то установить так-то и т.д.
но это уже уходит от данной темы....
В принципе я думаю сработает запрос:
"Выбрать
| т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" занимался "читерством" и исправлял ранее сделанные ошибки.
"Выбрать
| т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" занимался "читерством" и исправлял ранее сделанные ошибки.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот