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

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

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Составить запрос выборки ВидаРасчет

Автор: vadim007 15.07.15, 11:02

Всем привет.
Конфигурация ЗУП, последняя.
Регистр сведений ПлановыеНачисленияРаботниковОрганизаций.
В него информация поступает из документа ВводСведенийОПлановыхНачисленияхРаботниковОрганизаций.
Например,
01.04.15 - один вид начисления.
01.06.15 - другой вид начисления.
01.08.15 - еще один вид начисления.
и т.д.
Чем-то это похоже на периодические реквизиты в 7-ке.
Нужно на заданную дату выбрать только ОДИН, действующий, вид начисления.
Простое условие

ГДЕ (ПлановыеНачисленияРаботниковОрганизаций.Период <= &ДатаДокумента)

не подходит - выбираются виды начислений за предыдущие периоды.
А нужен за ближаюшую дату.

Автор: Vofka 15.07.15, 11:06

Надо использовать виртуальную таблицу СрезПоследних:

Выбрать
   *
ИЗ
   РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций.СрезПоследних(&ДатаДокумента)

Автор: vadim007 15.07.15, 12:05

Vofka, не работает.
В консоли запросов составил запрос

ВЫБРАТЬ
    ПлановыеНачисленияРаботниковОрганизаций.Период,
    ПлановыеНачисленияРаботниковОрганизаций.Регистратор,
    ПРЕДСТАВЛЕНИЕ(ПлановыеНачисленияРаботниковОрганизаций.Регистратор),
    ПлановыеНачисленияРаботниковОрганизаций.Сотрудник,
    ПРЕДСТАВЛЕНИЕ(ПлановыеНачисленияРаботниковОрганизаций.Сотрудник),
    ПлановыеНачисленияРаботниковОрганизаций.ВидРасчета,
    ПРЕДСТАВЛЕНИЕ(ПлановыеНачисленияРаботниковОрганизаций.ВидРасчета)
ИЗ
    РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций.СрезПоследних(ДатаВремя(2015,08,01)) КАК ПлановыеНачисленияРаботниковОрганизаций

Выводятся все начисления. А нужно только одно.

Автор: Vofka 15.07.15, 12:12

vadim007, надо же условие на вид начисления поставить.

Автор: vadim007 15.07.15, 12:15

Нашел вот подобное на http://pro1c.org.ua/redirect.php?http://www.1c-h.ru/?p=1396:

9. Вопрос Как прочитать данные, актуальные на определенную дату, из регистра сведений «Курсы валют» с отбором по нескольким валютам (отбор по измерениям)
Ответ

Запрос = Новый Запрос;
МассивВалют = Новый Массив;
МассивВалют.Добавить(Валюта1);
МассивВалют.Добавить(Валюта2);

Запрос.УстановитьПараметр("МассивВалют", МассивВалют);
Запрос.УстановитьПараметр("ДатаПолучения", ДатаПолучения);

Запрос.Текст = "
|ВЫБРАТЬ
|                  ВалютыСрезПоследних.Валюта,
|                  ВалютыСрезПоследних.Курс
|ИЗ
|                  РегистрСведений.КурсыВалют.СрезПоследних(&ДатаПолучения, Валюта В

(&МассивВалют)) КАК ВалютыСрезПоследних";

ТаблицаКурсов = Запрос.Выполнить().Выгрузить();

Не могу понять его. Для чего устанавливаются параметры?

Цитата(Vofka @ 15.07.15, 13:12) *
vadim007, надо же условие на вид начисления поставить.

Vofka, в том-то и дело, что мне нужно ОДНО начисление, действующее на заданную дату. Какое оно будет - не знаю.

Автор: Vofka 15.07.15, 12:17

vadim007, ну тогда отсортируйте по дате по убыванию и возьмите 1 запись.

Автор: vadim007 15.07.15, 12:45

Вот так получилось то, что хотел.
PS: ощущение, будто шаманил с бубном 47046430.gif

Автор: alexandr_f 16.07.15, 7:21

Цитата(vadim007 @ 15.07.15, 13:45) *
Вот так получилось то, что хотел.
PS: ощущение, будто шаманил с бубном 47046430.gif

А как получилось?
Плюс непонятно - если начисление не прекращено - то но действует.
если у Вас всего 1 начисление - то надо взять максимальную дату

Автор: vadim007 16.07.15, 8:02

alexandr_f, начислений несколько. Нужно выбрать одно действующее, последнее. Проверка на прекращение начисления еще больше усложнит запрос.
На демо-базе правильно заработал такой запрос:

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

Обратите внимание, здесь присутствует и СрезПоследних(..), и Упорядочивание по убыванию. Смешно, не правда-ли.
Упорядочивание добавил после того, как добавление СрезПоследних(..) не дало нужного эффекта - все равно выбирались все начисления.
Но когда перенес все это на реальную базу, где около 1000 физ.лиц, примерно 300 сотрудников, этот запрос (как вложенный фрагмент более сложного запроса) не выдал то, что он выдавал на демо-базе. Сейчас разбираюсь, почему.

Автор: alexandr_f 16.07.15, 9:59

Может я слабо разбираюсь в 1С.
Но с точки зрения T-SQL это запрос по максимальной дате
Коррелированный запрос
(Max(Date),Сотрудник,Кодначисления)
- это внутреннее соединение (Inner Join)
Смущает

ПлановыеНачисленияРаботниковОрганизаций.ВидРасчета.СпособРасчета = ЗНАЧЕНИЕ(Перечисление.СпособыРасчетаОплатыТруда.ПроизвольнаяФормула

= это что доп. условие
и
(ПлановыеНачисленияРаботниковОрганизаций.Действие = ЗНАЧЕНИЕ(Перечисление.ВидыДействияСНачислением.Начать))

ведь может быть - прекратить и изменить

Автор: sava1 16.07.15, 10:08

[

Цитата(alexandr_f @ 16.07.15, 10:59) *
Коррелированный запрос

И откуда-же получилось "корреляция"? Или типо "задавлю умными фразами" ?

Автор: vadim007 16.07.15, 10:26

Цитата(sava1 @ 16.07.15, 11:08) http://pro1c.org.ua/index.php?act=findpost&pid=100879

Автор: sava1 16.07.15, 10:46

Так покажите мне корреляцию, а не ссылку.

Автор: vadim007 16.07.15, 11:59

Написал-же alexandr_f, что запрос вида

SELECT Max(Date),Сотрудник,Кодначисления

- коррелированный запрос.
Мой запрос (схематично)
ВЫБРАТЬ ПЕРВЫЕ 1
|            ПлановыеНачисленияРаботниковОрганизаций.Сотрудник,
|            ПлановыеНачисленияРаботниковОрганизаций.ВидРасчета
|        ИЗ
|            РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций.СрезПоследних(&ДатаДокумента) КАК ПлановыеНачисленияРаботниковОрганизаций
......................
|            УПОРЯДОЧИТЬ ПО
|             ПлановыеНачисленияРаботниковОрганизаций.Период УБЫВ

можно привести к такому-же виду.

Автор: sava1 16.07.15, 12:46

Упрощенно: кореллированный запрос - подзапрос выполняется для каждой строки основного запроса, т.к. его параметром служат данные основного запроса.
Покажите мне корреляцию в Вашем запросе типа

Цитата(vadim007 @ 16.07.15, 12:59) *
SELECT Max(Date),Сотрудник,Кодначисления


Автор: vadim007 16.07.15, 13:08

Фуф, заставили покопаться в документации. Здесь нет коррелированного запроса.
Спасибо что напрягли.

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