Версия для печати темы (https://pro1c.org.ua/index.php?s=4f90605541f652a61cf1a45f5980104b&showtopic=55435)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Синтаксическая ошибка в запросе -Объединить. (1с 8.2.19.106)

Автор: andrew76 27.11.19, 7:33

Доброе утро !
При выполнении запроса идет сообщение "Синтаксическая ошибка-ОБЪЕДИНИТЬ".
В чем проблема не пойму.


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

Автор: Petre 27.11.19, 9:28

andrew76 @ Today, 7:33 * ,
Упорядочивать можно только результат объединения. Делайте пакетными запросами.

Автор: andrew76 27.11.19, 9:32

Petre @ Сегодня, 12:28 * ,

Т.е. в этом моем случае нужно делать 2 разных запроса ? На каждый документ по своему запросу ?

Автор: Bernet 27.11.19, 9:40

andrew76 @ Сегодня, 9:32 * ,
Нет, вы можете объединить два запроса, но упорядочивать уже результат объединения. Поместите это во вложенный запрос. Кстати, если не ошибаюсь конструкция

Цитата
ВЫБРАТЬ ПЕРВЫЕ 1
тоже не сработает в таком виде.
Пример:
ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ 
|   ВложенныйЗапрос.Период,
|   ВложенныйЗапрос.Сотрудник
|ИЗ
|     (ВЫБРАТЬ
|           ДекретОт.ДатаУхода Как Период,
|           ДекретОт.Сотрудник
|      ИЗ
|            Документ.ПриказНаДекретныйОтпускс5месяцев  КАК ДекретОт
|       ГДЕ
|            ДекретОт.Сотрудник = &Сотрудник
|
|      ОБЪЕДИНИТЬ ВСЕ
|
|      ВЫБРАТЬ
|            ДекретОт1.ДатаВыхода ,
|           ДекретОт1.Сотрудник
|      ИЗ
|              Документ.ПриказНаОтпускПоУходуЗаРебенком  КАК ДекретОт1
|       ГДЕ
|              ДекретОт1.Сотрудник = &Сотрудник
|       ) КАК ВложенныйЗапрос
|УПОРЯДОЧИТЬ ПО
|      ВложенныйЗапрос.Период УБЫВ
|";

Автор: andrew76 27.11.19, 9:50

Цитата(Bernet @ 27.11.19, 12:40) *
Кстати, если не ошибаюсь конструкция
Цитата
ВЫБРАТЬ ПЕРВЫЕ 1


Мне нужен только последний документ из каждой выборки.

Автор: Vladal 27.11.19, 11:55

Цитата(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 27.11.19, 12:05

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

Автор: andrew76 27.11.19, 12:06

Vladal @ Сегодня, 14:55 * ,

В принципе сделать 2 запроса отдельно.Выгружать результаты из запросов в 1 ТЗ.ТЗ отсортировать по дате- по убыванию.Прочитать из ТЗ первую запись и все.

Автор: pablo 27.11.19, 12:14

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



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

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

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

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

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

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

ВЫБРАТЬ
    Реал.Ссылка
ИЗ
    Реал КАК Реал

Автор: andrew76 27.11.19, 12:33

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


Цитата(andrew76 @ 27.11.19, 15:17) *
Какой лютый семерка стайл...

Какой лютый семерка стайл... А вот это я совсем НЕ ПОНЯЛ 05040.gif

Автор: pablo 27.11.19, 15:01

В семерке из-за ... ограниченности языка запросов было проще что-то собрать запросом, запрос выгрузить в ТЗ и затем колбасить ее всяко-разно. В восьмерке так тоже можно, но такая методика очень быстро деградирует по времени выполнения на больших выборках...

Автор: andrew76 27.11.19, 15:20

Цитата(pablo @ 27.11.19, 18:01) *
на больших выборках

В том то и дело ,что запросы будут выполняться только по 1 сотруднику.И декретных отпусков
будет незначительное количество.А может и не быть вообще.Не все же в декрет ходят.

Автор: pablo 27.11.19, 15:45

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


pablo @ Сегодня, 15:43 * ,З.Ы. С учетом всего времени выполнения на клиенте

Автор: andrew76 04.12.19, 15:59

pablo @ 27.11.19, 18:45 * ,

Интересно,а если понадобится перебирать 4 вида документов,и из каждой
выборки получать только последний документ,не технологичнее ли
сделать регистр сведений ,в который будет записываться инфа с этих доков,
и читать регистр методом срез последних ? Что будет работать быстрее,запрос,или
чтение регистра ? Эта функция должна выполняться каждый раз при открытии элемента
справочника по сотрудникам.

Автор: Petre 04.12.19, 16:09

andrew76 @ Today, 15:59 * ,
Вы представляете что будет при групповом перепроведении документов? Сравните это с частотой открытия формы элемента вашего справочника. Да хоть сто документов. Количество букв в запросе никак не связано со скоростью выполнения запроса.

Автор: Vofka 04.12.19, 16:23

Цитата(Petre @ 04.12.19, 16:09) *
Количество букв в запросе никак не связано со скоростью выполнения запроса.

Некоторая закономерность все таки имеется, но это не стопроцентный критерий. smile.gif

Автор: andrew76 04.12.19, 17:12

Цитата(Petre @ 04.12.19, 16:09) *
Вы представляете что будет при групповом перепроведении документов?


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

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua