Имя: Пароль:
1C
1С v8
Помощь с запросом
0 lamp
 
17.08.12
11:49
Мой первый опыт с "левым соединением":

ВЫБРАТЬ РАЗЛИЧНЫЕ
 Основные.Сотрудник,
 Основные.Сотрудник.ФизЛицо.ДатаРождения КАК ДатаРождения,
 Основные.ПериодРегистрации,
 Данные.Период,
 Данные.Должность,
 Данные.ПодразделениеОрганизации
ИЗ
 РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК Основные
   ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
     РаботникиОрганизаций.Период,
     РаботникиОрганизаций.Сотрудник,
     РаботникиОрганизаций.Должность,
     РаботникиОрганизаций.ПодразделениеОрганизации
   ИЗ
     РегистрСведений.РаботникиОрганизаций.СрезПоследних(Основные.ПериодРегистрации) КАК РаботникиОрганизаций
   ) КАК Данные
   ПО Основные.Сотрудник = Данные.Сотрудник
ГДЕ
 ПериодРегистрации МЕЖДУ &ДатаНачала И &ДатаОкончания
УПОРЯДОЧИТЬ ПО
 ПериодРегистрации

вылезает ошибка
поле не найдено "Основные.ПериодРегистрации"
в строке
РегистрСведений.РаботникиОрганизаций.СрезПоследних(Основные.ПериодРегистрации) КАК РаботникиОрганизаций
1 lamp
 
17.08.12
11:49
что не так?
2 OnCheck
 
17.08.12
11:50
В параметр в ВТ можно передавать только параметры, поля запроса нельзя передавать. Погугли, много инфы.
3 vicof
 
17.08.12
11:51
4 pessok
 
17.08.12
11:52
твоя ошибка ну никак не связана с левым соединением
5 lamp
 
17.08.12
11:55
Это мне понятно. хорошо, а как можно составить запрос, чтобы вытащить то, что мне надо вытащить (из регистра ОсновныеНачисленияРаботниковОрганизации), добавив при этом нужные поля из регистра РаботникиОрганизаций, срезая по полю ПериодРегистрации?

Никак?
6 vicof
 
17.08.12
11:57
(5) читай (3)
7 lamp
 
17.08.12
12:00
читал... но нет... не осилил, не разобрался как это применить в моем конкретном случае ((
8 OnCheck
 
17.08.12
12:05
не используй срез последних, сделай запрос к таблице РегистрСведений.РаботникиОрганизаций, ведь срез последних это частный случай этой таблицы
9 Turpentine
 
17.08.12
12:06
ВЫБРАТЬ РАЗЛИЧНЫЕ
 Основные.Сотрудник,
 Основные.Сотрудник.ФизЛицо.ДатаРождения КАК ДатаРождения,
 Основные.ПериодРегистрации,
 Данные.Период,
 Данные.Должность,
 Данные.ПодразделениеОрганизации
ИЗ
 РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК Основные
   ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
     РаботникиОрганизаций.Период,
     РаботникиОрганизаций.Сотрудник,
     РаботникиОрганизаций.Должность,
     РаботникиОрганизаций.ПодразделениеОрганизации
   ИЗ
     РегистрСведений.РаботникиОрганизаций.СрезПоследних(&ДатаОкончания) КАК РаботникиОрганизаций
     Где РаботникиОрганизаций.Период между &ДатаНачала И &ДатаОкончания
   ) КАК Данные
   ПО Основные.Сотрудник = Данные.Сотрудник
ГДЕ
 ПериодРегистрации МЕЖДУ &ДатаНачала И &ДатаОкончания
УПОРЯДОЧИТЬ ПО
 ПериодРегистрации
10 lamp
 
17.08.12
12:49
(8) в этом случае на каждого сотрудника выдается несколько должностей и подразделений, если у него они менялись, так не годится. Нужно, чтобы для каждого сотрудника выдавалась только 1 запись, актуальная на дату Основные.ПериодРегистрации, поскольку в основном запросе список сотрудников повторится столько раз, сколько месяцев было начислений (а интервал - год)
11 lamp
 
17.08.12
12:52
(9) да, теперь на каждый период регистрации на 1 работника выпадает 1 запись, но большей частью записи пустые, ведь может оказаться так, что должность и подразделение были назначены ранее &ДатаНачала
12 lamp
 
17.08.12
13:02
Ладно, сейчас яснее изложу - чего пытаюсь добиться.
Идея в том, что основной запрос выводит мне список работающих сотрудников на каждый месяц (в диапазоне рабочего года). Потом я пройдусь по этому списку и соберу средний возраст по подразделениям и должностям. Но что если сотрудник в течение года менял должность и подразделение? Для этого я и пытался брать СрезПоследних на Основные.ПериодРегистрации. Но если в СрезПоследних нельзя ставить в качестве параметра Основные.ПериодРегистрации - тогда даже не знаю...

Конечно, если очевидное решение, никаких левых присоединений, выгрузить запрос в таблицу, пройтись по ней и проставить должности и подразделения по полю ПериодРегистрации. Но эти будет работать в разы дольше и неизящно как-то...
13 AlexNew
 
17.08.12
13:18
ВЫБРАТЬ РАЗЛИЧНЫЕ
   ОсновныеНачисленияРаботниковОрганизаций.Сотрудник КАК Сотрудник,
   ОсновныеНачисленияРаботниковОрганизаций.Сотрудник.Физлицо.ДатаРождения,
   ОсновныеНачисленияРаботниковОрганизаций.ПериодРегистрации КАК ПериодРегистрации,
   РаботникиОрганизаций.Период,
   РаботникиОрганизаций.Должность,
   РаботникиОрганизаций.ПодразделениеОрганизации
ИЗ
   РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК ОсновныеНачисленияРаботниковОрганизаций
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
       ПО ОсновныеНачисленияРаботниковОрганизаций.ПериодРегистрации >= РаботникиОрганизаций.Период
           И ОсновныеНачисленияРаботниковОрганизаций.Сотрудник = РаботникиОрганизаций.Сотрудник
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций1
       ПО ОсновныеНачисленияРаботниковОрганизаций.ПериодРегистрации >= РаботникиОрганизаций1.Период
           И (РаботникиОрганизаций.Период < РаботникиОрганизаций1.Период)
           И (РаботникиОрганизаций.Сотрудник = РаботникиОрганизаций1.Сотрудник)
ГДЕ
   РаботникиОрганизаций1.Сотрудник ЕСТЬ NULL
   И ОсновныеНачисленияРаботниковОрганизаций.ПериодРегистрации МЕЖДУ &ДатаНачала И &ДатаОкончания

УПОРЯДОЧИТЬ ПО
   Сотрудник,
   ПериодРегистрации
14 lamp
 
17.08.12
13:48
(13) запустил этот запрос, что-то уже несколько минут висит ((
15 lamp
 
17.08.12
13:53
(13) запрос завис намертво, пришлось вырубать 1с-ку
16 Светлый Гений
 
17.08.12
13:54
(0)Так не взлетит. Если бы у тебя была конструкция "В", а не вложенный запрос, тогда бы проканало, а так не проканает.
17 AlexNew
 
17.08.12
14:39
(15) Ты какой период регистрации сделал? И база у тебя?
18 lamp
 
17.08.12
15:41
(17) период у меня - с начала до конца года. база - локальная копия реальной, что ведется с 1 января 2012; в (12) я об этом писал.