Имя: Пароль:
1C
1С v8
Сравнение таблиц данных
0 inetguru
 
06.11.11
14:31
Добрый день всем участникам.
Есть такая задача: Необходимо получить временные промежутки состояния фонда заработной платы, в течение которых он не менялся. (количество ставок, размер окладов или появление или удаление новых должностей). Для каждого изменения состояния фонда я должен формировать документ расчет фонда заработной платы.
Так вот вопрос -  как лучше получить   эти промежутки неизменного состояния штатного- в единственном запросе или обходя в цикле помесячно результат запроса и сравнивать с предыдущим.
1 МишельЛагранж
 
06.11.11
15:12
пример дайте. а то - "временные промежутки, фонд не менялся"..
что за временные промежутки, как выглядит фонд? (поля, что ли, запостите...)
2 МишельЛагранж
 
06.11.11
15:14
+ (1) судя по "количество ставок, размер окладов или появление или удаление новых должностей" - у вас три разных регистра просматривается.
3 inetguru
 
06.11.11
15:20
Регистр Штатное расписание организаций - просматриваю только его.
4 МишельЛагранж
 
06.11.11
15:24
а как тогда вы впределах одного регистра собиратесь получить "неизменные промежутки времени" - относительно чего они неизменные? месяц, год?
5 inetguru
 
06.11.11
15:25
Проверка состояния за период с 01.01.2010 по 31.05.2010:
1)Период С 01.01.2010 по 31.03.2010
Подразделение - Строительная бригада
Должность  Количество ставок  Оклад
Маляр      3                  3000
Штукатур   2                  3100

2)Период С 01.04.2010 по 31.05.2010
Подразделение - Строительная бригада
Должность  Количество ставок  Оклад
Маляр      2                  3000
Штукатур   2                  3100

Во втором промежутке в подразделении строительная бригада по должности маляр уменьшилось количество ставок с 3 до 2. Это и считается измененным состоянием штатного расписания.
6 МишельЛагранж
 
06.11.11
15:30
если помесячно сравнение - то вложенный запрос 1: Количество ставок и оклад за Период С 01.01.2010 по 31.01.2010, влож. запрос2: Количество ставок и оклад за Период С 01.02.2010 по 28.02.2010.
Верхним уровнем запроса - сравнивать полученные Количество ставок1-2 и оклад1-2 между собой, ВЫБОР...КОГДА давать анализ.
А вот период времени (месяц) давать через цикл (и обращение каждый раз к запросу) или подцеплять календарь...
7 inetguru
 
06.11.11
15:41
Согласен. Но вот скорость... 10 подразделений за 1 год - для 1 подразделения 11 прогонов цикла с запросом - Итого 110 циклов с запросом...
А нет мыслей как это получить в запросе...может получить даты изменения состояния штатного расписания (по выбранному подразделению) - по сути любая новая запись -изменение (хотя он может быть простой копией предыдущей записи с новой датой). Здесь то и загвоздка...
8 МишельЛагранж
 
06.11.11
15:48
(7) забить в массив намера мечсяцев, и, выбирая их в запросе (можно Начало Периода (Месяц) использовать), сделать таблицу соответствий фонда по месяцам.
9 МишельЛагранж
 
06.11.11
15:52
+ (8) список всех подразделений тоже можно, кстати, сразу - использовать условие
ИЕРАРХИЯ В (СправочникПодразделений).
кидайте запрос сюда, как получится ))
10 inetguru
 
06.11.11
15:57
(7) вы имеете ввиду все месяцы нужного промежутка получить по календарю и левым соединением добавить регистр Штатное расписание или получить все месяцы изменения штатного и уже к ним добавить регистр?
11 МишельЛагранж
 
06.11.11
16:00
(7) >> по сути любая новая запись -изменение (хотя он может быть простой копией предыдущей записи с новой датой)
- аналитика дат - это делать отбор по подразделению, сравнивать строки на наличие изменений, анализировать изменение - было ли оно на самом деле..
можете попробывать и так (отбор по подразделению - влож. запрос, если две строки - старую и новую строку передать выше; сравнивать строки на наличие изменений - верхний запрос: полученное в разные таблицы и между собой по-строчно...
(10) получить список месяцев по календарю, и как использовать как отбор по штатному расписанию
12 inetguru
 
06.11.11
18:23
Вот кусочек от того что должно получиться. Здесь я получил изменения штатного расписания за 1 месяц.
ВЫБРАТЬ
   ШРСрезНаНачалоМесяца.Период КАК ПоявлениеДолжности,
   ШРСрезНаНачалоМесяца.Должность КАК ДолжностьНаНачало,
   ШРСрезНаНачалоМесяца.КоличествоСтавок КАК КоличествоСтавокНаНачало,
   ЕСТЬNULL(ШРСрезНаНачалоМесяца.МесячнаяСтавка, 0) КАК МесячнаяСтавкаНаНачало,
   ШРСрезНаКонецМесяца.Период КАК ИзменениеДолжности,
   ШРСрезНаКонецМесяца.Должность КАК ДолжностьНаКонец,
   ШРСрезНаКонецМесяца.КоличествоСтавок КАК КоличествоСтавокНаКонец,
   ШРСрезНаКонецМесяца.МесячнаяСтавка КАК МесячнаяСтавкаНаКонец,
   ВЫБОР
       КОГДА ЕСТЬNULL(ШРСрезНаНачалоМесяца.КоличествоСтавок, 0) <> ШРСрезНаКонецМесяца.КоличествоСтавок
               ИЛИ ЕСТЬNULL(ШРСрезНаНачалоМесяца.МесячнаяСтавка, 0) <> ШРСрезНаКонецМесяца.МесячнаяСтавка
           ТОГДА ИСТИНА
       ИНАЧЕ ЛОЖЬ
   КОНЕЦ КАК Измененность
ИЗ
   РегистрСведений.ШтатноеРасписаниеОрганизаций.СрезПоследних(КОНЕЦПЕРИОДА(&Месяц, МЕСЯЦ), ) КАК ШРСрезНаКонецМесяца
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШтатноеРасписаниеОрганизаций.СрезПоследних(НАЧАЛОПЕРИОДА(&Месяц, МЕСЯЦ), ) КАК ШРСрезНаНачалоМесяца
       ПО ШРСрезНаКонецМесяца.ПодразделениеОрганизации = ШРСрезНаНачалоМесяца.ПодразделениеОрганизации
           И ШРСрезНаКонецМесяца.Должность = ШРСрезНаНачалоМесяца.Должность
ГДЕ
   ШРСрезНаКонецМесяца.ПодразделениеОрганизации = &ПодразделениеОрганизации
   И ЕСТЬnull(ШРСрезНаНачалоМесяца.КоличествоСтавок,1) <> 0


Что-то дальше ступор-вроде понимаю так, что нужно это поместить во вложенный запрос и соединить с календарем периодами в которых были изменения...
помогите плз продолжить


Конфигурация Зарплата и кадры бюджетного учреждения...
13 inetguru
 
06.11.11
19:56
Народ отзовитесь!!! Помогите пожалуйста!
14 inetguru
 
06.11.11
20:14
Есть вот такой вариант:
ВЫБРАТЬ РАЗЛИЧНЫЕ
   НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ) КАК МесяцКалендаря
ПОМЕСТИТЬ ВТКалендарь
ИЗ
   РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
   РегламентированныйПроизводственныйКалендарь.ДатаКалендаря >= &НачалоПериода
   И РегламентированныйПроизводственныйКалендарь.ДатаКалендаря <= &ОкончаниеПериода
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВЫБОР
       КОГДА ЕСТЬNULL(ШРСрезНаНачалоМесяца.КоличествоСтавок, 0) <> ШРСрезНаКонецМесяца.КоличествоСтавок
               ИЛИ ЕСТЬNULL(ШРСрезНаНачалоМесяца.МесячнаяСтавка, 0) <> ШРСрезНаКонецМесяца.МесячнаяСтавка
           ТОГДА ИСТИНА
       ИНАЧЕ ЛОЖЬ
   КОНЕЦ КАК Измененность,
   НАЧАЛОПЕРИОДА(&Месяц, МЕСЯЦ) КАК Месяц,
   ЕСТЬNULL(ШРСрезНаНачалоМесяца.Должность, ШРСрезНаКонецМесяца.Должность) КАК Должность,
   ВЫБОР
       КОГДА ЕСТЬNULL(ШРСрезНаНачалоМесяца.КоличествоСтавок, 0) > ШРСрезНаКонецМесяца.КоличествоСтавок
           ТОГДА ЕСТЬNULL(ШРСрезНаНачалоМесяца.КоличествоСтавок, 0)
       ИНАЧЕ ШРСрезНаКонецМесяца.КоличествоСтавок
   КОНЕЦ КАК КоличествоСтавок,
   ВЫБОР
       КОГДА ЕСТЬNULL(ШРСрезНаНачалоМесяца.МесячнаяСтавка, 0) > ШРСрезНаКонецМесяца.МесячнаяСтавка
           ТОГДА ЕСТЬNULL(ШРСрезНаНачалоМесяца.МесячнаяСтавка, 0)
       ИНАЧЕ ШРСрезНаКонецМесяца.МесячнаяСтавка
   КОНЕЦ КАК МесячнаяСтавка
ПОМЕСТИТЬ ВТШтатноеЗаМесяц
ИЗ
   РегистрСведений.ШтатноеРасписаниеОрганизаций.СрезПоследних(КОНЕЦПЕРИОДА(&Месяц, МЕСЯЦ), ) КАК ШРСрезНаКонецМесяца
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШтатноеРасписаниеОрганизаций.СрезПоследних(НАЧАЛОПЕРИОДА(&Месяц, МЕСЯЦ), ) КАК ШРСрезНаНачалоМесяца
       ПО ШРСрезНаКонецМесяца.ПодразделениеОрганизации = ШРСрезНаНачалоМесяца.ПодразделениеОрганизации
           И ШРСрезНаКонецМесяца.Должность = ШРСрезНаНачалоМесяца.Должность
ГДЕ
   ШРСрезНаКонецМесяца.ПодразделениеОрганизации = &ПодразделениеОрганизации
   И ЕСТЬNULL(ШРСрезНаНачалоМесяца.КоличествоСтавок, 1) <> 0
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВТКалендарь.МесяцКалендаря,
   ВТШтатноеЗаМесяц.Измененность,
   ВТШтатноеЗаМесяц.Месяц,
   ВТШтатноеЗаМесяц.Должность,
   ВТШтатноеЗаМесяц.КоличествоСтавок,
   ВТШтатноеЗаМесяц.МесячнаяСтавка
ИЗ
   ВТКалендарь КАК ВТКалендарь
       ЛЕВОЕ СОЕДИНЕНИЕ ВТШтатноеЗаМесяц КАК ВТШтатноеЗаМесяц
       ПО ВТКалендарь.МесяцКалендаря = ВТШтатноеЗаМесяц.Месяц

Если срез заменить на каждый месяц который входит в промежуток, то смогу получить состояние штатного расписания на каждый месяц и состояние измененности должности. Если ни одной измененной должности в периоде нет, то и штатное считается неизменным с предыдущего периода.

Как теперь срез заменить на каждый месяц который входит в промежуток (&НачалоПериода, &ОкончаниеПериода).
15 inetguru
 
06.11.11
22:03
Вот что получилось:
ВЫБРАТЬ РАЗЛИЧНЫЕ
   НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ) КАК МесяцКалендаря
ПОМЕСТИТЬ ВТКалендарь
ИЗ
   РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
   РегламентированныйПроизводственныйКалендарь.ДатаКалендаря >= &НачалоПериода
   И РегламентированныйПроизводственныйКалендарь.ДатаКалендаря <= &ОкончаниеПериода
;

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

СГРУППИРОВАТЬ ПО
   Таб1.МесяцКалендаря,
   Таб2.ПодразделениеОрганизации,
   Таб2.Должность,
   Таб1.ДатаИзмененияДолжности,
   Таб2.КоличествоСтавок

ИМЕЮЩИЕ
   (НАЧАЛОПЕРИОДА(Таб1.ДатаИзмененияДолжности, МЕСЯЦ) <> Таб1.МесяцКалендаря
           И Таб2.КоличествоСтавок > 0
       ИЛИ НАЧАЛОПЕРИОДА(Таб1.ДатаИзмененияДолжности, МЕСЯЦ) = Таб1.МесяцКалендаря
           И Таб2.КоличествоСтавок >= 0)

УПОРЯДОЧИТЬ ПО
   МесяцКалендаря
ИТОГИ ПО
   Должность