Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Синтаксическая ошибка в запросе -Объединить. (1с 8.2.19.106)
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
andrew76
Доброе утро !
При выполнении запроса идет сообщение "Синтаксическая ошибка-ОБЪЕДИНИТЬ".
В чем проблема не пойму.


Запрос = Новый Запрос; 
Запрос.Текст = "
|ВЫБРАТЬ ПЕРВЫЕ 1
|
|   ДекретОт.ДатаУхода Как Начало,
|   ДекретОт.Сотрудник
|ИЗ
|    Документ.ПриказНаДекретныйОтпускс5месяцев  КАК ДекретОт
|ГДЕ
|    ДекретОт.Сотрудник = &Сотрудник
|
|Упорядочить по ДекретОт.ДатаУхода Убыв
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
|
|  ДекретОт1.ДатаВыхода ,
|  ДекретОт1.Сотрудник
|ИЗ
|    Документ.ПриказНаОтпускПоУходуЗаРебенком  КАК ДекретОт1
|ГДЕ
|    ДекретОт1.Сотрудник = &Сотрудник
|
|Упорядочить по ДекретОт1.ДатаВыхода Убыв";
Petre
andrew76 @ Today, 7:33 необходимо зарегистрироваться для просмотра ссылки ,
Упорядочивать можно только результат объединения. Делайте пакетными запросами.
andrew76
Petre @ Сегодня, 12:28 необходимо зарегистрироваться для просмотра ссылки ,

Т.е. в этом моем случае нужно делать 2 разных запроса ? На каждый документ по своему запросу ?
Bernet
andrew76 @ Сегодня, 9:32 необходимо зарегистрироваться для просмотра ссылки ,
Нет, вы можете объединить два запроса, но упорядочивать уже результат объединения. Поместите это во вложенный запрос. Кстати, если не ошибаюсь конструкция
Цитата
ВЫБРАТЬ ПЕРВЫЕ 1
тоже не сработает в таком виде.
Пример:
ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ 
|   ВложенныйЗапрос.Период,
|   ВложенныйЗапрос.Сотрудник
|ИЗ
|     (ВЫБРАТЬ
|           ДекретОт.ДатаУхода Как Период,
|           ДекретОт.Сотрудник
|      ИЗ
|            Документ.ПриказНаДекретныйОтпускс5месяцев  КАК ДекретОт
|       ГДЕ
|            ДекретОт.Сотрудник = &Сотрудник
|
|      ОБЪЕДИНИТЬ ВСЕ
|
|      ВЫБРАТЬ
|            ДекретОт1.ДатаВыхода ,
|           ДекретОт1.Сотрудник
|      ИЗ
|              Документ.ПриказНаОтпускПоУходуЗаРебенком  КАК ДекретОт1
|       ГДЕ
|              ДекретОт1.Сотрудник = &Сотрудник
|       ) КАК ВложенныйЗапрос
|УПОРЯДОЧИТЬ ПО
|      ВложенныйЗапрос.Период УБЫВ
|";
andrew76
Цитата(Bernet @ 27.11.19, 12:40) необходимо зарегистрироваться для просмотра ссылки
Кстати, если не ошибаюсь конструкция
Цитата
ВЫБРАТЬ ПЕРВЫЕ 1


Мне нужен только последний документ из каждой выборки.
Vladal
Цитата(andrew76 @ 27.11.19, 9:50) необходимо зарегистрироваться для просмотра ссылки
Мне нужен только последний документ из каждой выборки.

Тогда каждый вид документа в отдельную виртуальную таблицу и результаты объединять.

Запрос = Новый Запрос; 
Запрос.Текст = "
|ВЫБРАТЬ ПЕРВЫЕ 1
|
|   ДекретОт.ДатаУхода Как Начало,
|   ДекретОт.Сотрудник как Сотрудник
// поместить выборку по первому виду документов во временную таблицу
|Поместить вт1

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

|ИЗ
|    Документ.ПриказНаОтпускПоУходуЗаРебенком  КАК ДекретОт1
|ГДЕ
|    ДекретОт1.Сотрудник = &Сотрудник
|
|Упорядочить по ДекретОт1.ДатаВыхода Убыв
|;

// объединить результаты обеих временных таблиц
|Выбрать
|    вт1.Начало как Начало,
|    вт1.Сотрудник как Сотрудник
|из
|    вт1 как Вт1
|
|объединить
|
|выбрать
|    вт2.Начало,
|    вт2.Сотрудник
|из
|    вт2 как Вт2

";


Писал без 1С, поэтому допускаю синтаксические ошибки.
Bernet
Vladal @ Сегодня, 11:55 необходимо зарегистрироваться для просмотра ссылки ,
Упорядочить во временных таблицах не работает, только на итоговую выборку.
Если нужно получить последний док каждого типа - тогда используйте функцию МАКСИМУМ по дате документа - получите последнюю дату документов, а дальше соединением получите саму ссылку на док
andrew76
Vladal @ Сегодня, 14:55 необходимо зарегистрироваться для просмотра ссылки ,

В принципе сделать 2 запроса отдельно.Выгружать результаты из запросов в 1 ТЗ.ТЗ отсортировать по дате- по убыванию.Прочитать из ТЗ первую запись и все.
pablo
Цитата
В принципе сделать 2 запроса отдельно.Выгружать результаты из запросов в 1 ТЗ.ТЗ отсортировать по дате- по убыванию.Прочитать из ТЗ первую запись и все
Какой лютый семерка стайл... Вытащим все из БД на клиента (нагрузим память), потом отсортируем(нагрузим проц), чтобы получить в итоге 2 записи...



Рабочий запрос:
ВЫБРАТЬ ПЕРВЫЕ 1
    ПоступлениеТоваровУслуг.Ссылка
ПОМЕСТИТЬ Поступ
ИЗ
    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
ГДЕ
    ПоступлениеТоваровУслуг.Проведен

УПОРЯДОЧИТЬ ПО
    ПоступлениеТоваровУслуг.Дата УБЫВ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
    РеализацияТоваровУслуг.Ссылка
ПОМЕСТИТЬ Реал
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
    РеализацияТоваровУслуг.Проведен

УПОРЯДОЧИТЬ ПО
    РеализацияТоваровУслуг.Дата УБЫВ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Поступ.Ссылка
ИЗ
    Поступ КАК Поступ

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Реал.Ссылка
ИЗ
    Реал КАК Реал
andrew76
pablo @ Сегодня, 15:14 необходимо зарегистрироваться для просмотра ссылки ,
Попробую и Ваш вариант.По поводу большой загрузки БД.Это декретные отпуска - много по сотруднику их не будет.
Даже в случае матери-героини.


Цитата(andrew76 @ 27.11.19, 15:17) необходимо зарегистрироваться для просмотра ссылки
Какой лютый семерка стайл...

Какой лютый семерка стайл... А вот это я совсем НЕ ПОНЯЛ 05040.gif
pablo
В семерке из-за ... ограниченности языка запросов было проще что-то собрать запросом, запрос выгрузить в ТЗ и затем колбасить ее всяко-разно. В восьмерке так тоже можно, но такая методика очень быстро деградирует по времени выполнения на больших выборках...
andrew76
Цитата(pablo @ 27.11.19, 18:01) необходимо зарегистрироваться для просмотра ссылки
на больших выборках

В том то и дело ,что запросы будут выполняться только по 1 сотруднику.И декретных отпусков
будет незначительное количество.А может и не быть вообще.Не все же в декрет ходят.
pablo
Тем не менее, ИМХО, стоит стремиться все делать "базаданново". Даже на малых объемах данных можно больше времени потратить на накладных расходах по пересылке данных с сервера на клиент.
Более того, если развернуть ситуацию для задачи перепроведения за месяц, то, ИМХО, 10 одинаковых запросов возвращающих 2 записи отработают быстрее 10 запросов, возвращающих все записи по сотруднику.


pablo @ Сегодня, 15:43 необходимо зарегистрироваться для просмотра ссылки ,З.Ы. С учетом всего времени выполнения на клиенте
andrew76
pablo @ 27.11.19, 18:45 необходимо зарегистрироваться для просмотра ссылки ,

Интересно,а если понадобится перебирать 4 вида документов,и из каждой
выборки получать только последний документ,не технологичнее ли
сделать регистр сведений ,в который будет записываться инфа с этих доков,
и читать регистр методом срез последних ? Что будет работать быстрее,запрос,или
чтение регистра ? Эта функция должна выполняться каждый раз при открытии элемента
справочника по сотрудникам.
Petre
andrew76 @ Today, 15:59 необходимо зарегистрироваться для просмотра ссылки ,
Вы представляете что будет при групповом перепроведении документов? Сравните это с частотой открытия формы элемента вашего справочника. Да хоть сто документов. Количество букв в запросе никак не связано со скоростью выполнения запроса.
Vofka
Цитата(Petre @ 04.12.19, 16:09) необходимо зарегистрироваться для просмотра ссылки
Количество букв в запросе никак не связано со скоростью выполнения запроса.

Некоторая закономерность все таки имеется, но это не стопроцентный критерий. smile.gif
andrew76
Цитата(Petre @ 04.12.19, 16:09) необходимо зарегистрироваться для просмотра ссылки
Вы представляете что будет при групповом перепроведении документов?


Понятно.Регистр не подходит здесь.Запрос-так запрос.А документов все же немного.
Декретные отпуска.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.