0
skaparez
02.10.12
✎
11:12
|
Может кому нибудь пригодится, если есть RLS и при проведении ругается на extremely complex queries - это ограничение 256 таблиц, за месяц там собирается 144 таблицы + RLS = решение создать таблички поменьше, а потом их объединить, код тута:
2.5.54.1 - 2.5.56.1
использую внешний модуль...
Процедура Документы_ТабельУчетаРабочегоВремениОрганизации_Модуль_СформироватьЗапросДляРегистраРасчета(Запрос, ДатаНачалаПериода, ДатаОкончанияПериода) Экспорт
Делитель = 7;
ФлЭтоНачалоЗапроса = Истина;
Итератор = 0;
Счетчик = 0;
ФлЭтоПервыйВывод = Истина;
Для ИндексДня = День(ДатаНачалаПериода) ПО День(ДатаОкончанияПериода) Цикл
СтрИндексДня = Строка(ИндексДня);
Если Счетчик % Делитель = 0 Тогда
ФлЭтоНачалоЗапроса = Истина;
Итератор = Итератор + 1;
Если НЕ ФлЭтоПервыйВывод Тогда
Запрос.Текст = Запрос.Текст +
" ИНДЕКСИРОВАТЬ ПО
| Сотрудник, ДеньМесяца, ВидВремени ;
| ";
Запрос.Выполнить();
Иначе
ФлЭтоПервыйВывод = Ложь;
КонецЕсли;
Иначе
ФлЭтоНачалоЗапроса = Ложь;
КонецЕсли;
Счетчик = Счетчик + 1;
Если ФлЭтоНачалоЗапроса Тогда
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Сотрудник КАК Сотрудник,
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ПервыйВидВремени"+СтрИндексДня+" КАК ВидВремени,
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ПервыйЧасов"+СтрИндексДня+" КАК Часов,
| "+СтрИндексДня+" КАК ДеньМесяца
|ПОМЕСТИТЬ ВТВсеДниТабеля" + Итератор + "
|ИЗ
| Документ.ТабельУчетаРабочегоВремениОрганизации.ОтработанноеВремя КАК ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя
|ГДЕ
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Ссылка = &ДокументСсылка
| И ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ПервыйВидВремени"+СтрИндексДня+" <> ЗНАЧЕНИЕ(Справочник.КлассификаторИспользованияРабочегоВремени.ПустаяСсылка)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Сотрудник,
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ВторойВидВремени"+СтрИндексДня+",
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ВторойЧасов"+СтрИндексДня+",
| "+СтрИндексДня+"
| ИЗ
| Документ.ТабельУчетаРабочегоВремениОрганизации.ОтработанноеВремя КАК ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя
| ГДЕ
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Ссылка = &ДокументСсылка
| И ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ВторойВидВремени"+СтрИндексДня+" <> ЗНАЧЕНИЕ(Справочник.КлассификаторИспользованияРабочегоВремени.ПустаяСсылка)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Сотрудник,
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ТретийВидВремени"+СтрИндексДня+",
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ТретийЧасов"+СтрИндексДня+",
| "+СтрИндексДня+"
| ИЗ
| Документ.ТабельУчетаРабочегоВремениОрганизации.ОтработанноеВремя КАК ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя
| ГДЕ
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Ссылка = &ДокументСсылка
| И ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ТретийВидВремени"+СтрИндексДня+" <> ЗНАЧЕНИЕ(Справочник.КлассификаторИспользованияРабочегоВремени.ПустаяСсылка)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Сотрудник,
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ЧетвертыйВидВремени"+СтрИндексДня+",
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ЧетвертыйЧасов"+СтрИндексДня+",
| "+СтрИндексДня+"
| ИЗ
| Документ.ТабельУчетаРабочегоВремениОрганизации.ОтработанноеВремя КАК ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя
| ГДЕ
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Ссылка = &ДокументСсылка
| И ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ЧетвертыйВидВремени"+СтрИндексДня+" <> ЗНАЧЕНИЕ(Справочник.КлассификаторИспользованияРабочегоВремени.ПустаяСсылка)
| ";
Иначе
Запрос.Текст = Запрос.Текст + " ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Сотрудник КАК Сотрудник,
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ПервыйВидВремени"+СтрИндексДня+" КАК ВидВремени,
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ПервыйЧасов"+СтрИндексДня+" КАК Часов,
| "+СтрИндексДня+" КАК ДеньМесяца
|ИЗ
| Документ.ТабельУчетаРабочегоВремениОрганизации.ОтработанноеВремя КАК ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя
|ГДЕ
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Ссылка = &ДокументСсылка
| И ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ПервыйВидВремени"+СтрИндексДня+" <> ЗНАЧЕНИЕ(Справочник.КлассификаторИспользованияРабочегоВремени.ПустаяСсылка)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Сотрудник,
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ВторойВидВремени"+СтрИндексДня+",
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ВторойЧасов"+СтрИндексДня+",
| "+СтрИндексДня+"
| ИЗ
| Документ.ТабельУчетаРабочегоВремениОрганизации.ОтработанноеВремя КАК ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя
| ГДЕ
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Ссылка = &ДокументСсылка
| И ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ВторойВидВремени"+СтрИндексДня+" <> ЗНАЧЕНИЕ(Справочник.КлассификаторИспользованияРабочегоВремени.ПустаяСсылка)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Сотрудник,
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ТретийВидВремени"+СтрИндексДня+",
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ТретийЧасов"+СтрИндексДня+",
| "+СтрИндексДня+"
| ИЗ
| Документ.ТабельУчетаРабочегоВремениОрганизации.ОтработанноеВремя КАК ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя
| ГДЕ
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Ссылка = &ДокументСсылка
| И ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ТретийВидВремени"+СтрИндексДня+" <> ЗНАЧЕНИЕ(Справочник.КлассификаторИспользованияРабочегоВремени.ПустаяСсылка)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Сотрудник,
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ЧетвертыйВидВремени"+СтрИндексДня+",
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ЧетвертыйЧасов"+СтрИндексДня+",
| "+СтрИндексДня+"
| ИЗ
| Документ.ТабельУчетаРабочегоВремениОрганизации.ОтработанноеВремя КАК ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя
| ГДЕ
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Ссылка = &ДокументСсылка
| И ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ЧетвертыйВидВремени"+СтрИндексДня+" <> ЗНАЧЕНИЕ(Справочник.КлассификаторИспользованияРабочегоВремени.ПустаяСсылка)
| ";
КонецЕсли;
КонецЦикла;
Запрос.Текст = Запрос.Текст +
" ИНДЕКСИРОВАТЬ ПО
| Сотрудник, ДеньМесяца, ВидВремени ;
| ";
Запрос.Выполнить();
ФлЭтоНачалоЗапроса = Истина;
Итератор = 0;
Счетчик = 0;
Для ИндексДня = День(ДатаНачалаПериода) ПО День(ДатаОкончанияПериода) Цикл
СтрИндексДня = Строка(ИндексДня);
Если Счетчик % Делитель = 0 Тогда
Итератор = Итератор + 1;
Если ФлЭтоНачалоЗапроса Тогда
Запрос.Текст = "ВЫБРАТЬ
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Сотрудник КАК Сотрудник,
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ВидВремени КАК ВидВремени,
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Часов КАК Часов,
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ДеньМесяца КАК ДеньМесяца
|ПОМЕСТИТЬ ВТВсеДниТабеля
|ИЗ ВТВсеДниТабеля" + Итератор + " КАК ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя
|
|";
Иначе
Запрос.Текст = Запрос.Текст + " ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ
|ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Сотрудник,
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ВидВремени,
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Часов,
| ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ДеньМесяца
|ИЗ ВТВсеДниТабеля" + Итератор + " КАК ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя
|";
КонецЕсли;
Если ФлЭтоНачалоЗапроса Тогда
ФлЭтоНачалоЗапроса = Ложь;
КонецЕсли;
КонецЕсли;
Счетчик = Счетчик + 1;
КонецЦикла;
Запрос.Текст = Запрос.Текст +
" ИНДЕКСИРОВАТЬ ПО
| Сотрудник, ДеньМесяца, ВидВремени ;
| ";
Запрос.Текст = Запрос.Текст +
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ВсеДниТабеля.Сотрудник,
| ВсеДниТабеля.ДеньМесяца,
| ВсеДниТабеля.ВидВремени,
| СУММА(ВсеДниТабеля.Часов) КАК Часов
| ПОМЕСТИТЬ ВТСуммированныеВсеДниТабеля
|ИЗ ВТВсеДниТабеля КАК ВсеДниТабеля
| СГРУППИРОВАТЬ ПО
| Сотрудник, ДеньМесяца, ВидВремени;
| ";
Запрос.Текст = Запрос.Текст +
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ВсеДниТабеля.Сотрудник,
| ВсеДниТабеля.ДеньМесяца,
| ВсеДниТабеля.ВидВремени,
| ВсеДниТабеля.Часов
|ПОМЕСТИТЬ ВТПропущенныеДни
|
|ИЗ ВТСуммированныеВсеДниТабеля КАК ВсеДниТабеля
| ЛЕВОЕ СОЕДИНЕНИЕ ВТСуммированныеВсеДниТабеля КАК ФильтрацияЦелодневныхНеявок
|ПО ФильтрацияЦелодневныхНеявок.Сотрудник = ВсеДниТабеля.Сотрудник
| И ФильтрацияЦелодневныхНеявок.ДеньМесяца = ВсеДниТабеля.ДеньМесяца
| И ФильтрацияЦелодневныхНеявок.ВидВремени <> ВсеДниТабеля.ВидВремени
|ГДЕ ФильтрацияЦелодневныхНеявок.Сотрудник ЕСТЬ NULL
| И ВсеДниТабеля.ВидВремени В(ВЫБРАТЬ ВТСписокПропусков.Ссылка ИЗ ВТСписокПропусков)
|ИНДЕКСИРОВАТЬ ПО
| ВсеДниТабеля.Сотрудник,
| ВсеДниТабеля.ДеньМесяца,
| ВсеДниТабеля.ВидВремени";
КонецПроцедуры
|
|