![]() |
![]() |
|
v7: Помогите разобраться с группировкой в запросе. | ☑ | ||
---|---|---|---|---|
0
kazimeg
11.08.16
✎
11:05
|
Здравствуйте.
Возникла проблема в 1С Зарплата и Кадры 7.7. Есть отчет РасчетныеЛисткиМес Там есть вот такой запрос СторноЗаписи = СоздатьОбъект("ЖурналРасчетов.Зарплата"); ТЗ=СоздатьОбъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("МесяцНачисления","Число",2); ТЗ.НоваяКолонка("Начисление","Строка"); ТЗ.НоваяКолонка("Начислено","Число"); ТЗ.НоваяКолонка("Дней","Число"); ТЗ.НоваяКолонка("Часов","Число"); ТЗ.НоваяКолонка("МесяцУдержания","Число",2); ТЗ.НоваяКолонка("Удержание","Строка"); ТЗ.НоваяКолонка("Удержано","Число"); ТекстЗапроса= "//{{ЗАПРОС(Печатать) |Период с {НачМесяца(ДатаАктуальности)} по {КонМесяца(ДатаАктуальности)}; |Сотр = ЖурналРасчетов.Зарплата.Объект; |ВР = ЖурналРасчетов.Зарплата.ВидРасч; |Дн = ЖурналРасчетов.Зарплата.Дни; |Чс = ЖурналРасчетов.Зарплата.Часы; |Рез = ЖурналРасчетов.Зарплата.Результат; |Подр = ЖурналРасчетов.Зарплата.Объект.Подразделение; |Док = ЖурналРасчетов.Зарплата.ТекущийДокумент; |Пер = ЖурналРасчетов.Зарплата.ПериодРегистрации; |ТЗ= ЖурналРасчетов.Зарплата.ТекущаяЗапись; |Действие=ЖурналРасчетов.Зарплата.ПериодДействия; |Документик = ЖурналРасчетов.Зарплата.ТекущийДокумент; |Функция Начислено = Сумма(Рез) когда(ВР.ВходитВГруппу(ГруппаРасчетов.ВсеНачисления)=1); |Функция Удержано = Сумма(Рез) когда(ВР.ВходитВГруппу(ГруппаРасчетов.ВсеУдержания)=1); |Функция Натурой = Сумма(Рез) когда(ВР.ВходитВГруппу(ГруппаРасчетов.ПрочиеДоходы)=1); |Функция ВыплаченоВКассе = Сумма(Рез) когда(ВР=Видрасчета.ВыплатаЧерезКассу); |Функция НачальноеСальдо = Сумма(Рез) когда(ВР=Видрасчета.НачальноеСальдо);"; Если Сотрудник.Выбран()=1 Тогда ТекстЗапроса = ТекстЗапроса+" |Условие(Сотр=Сотрудник);"; Иначе Если Расч.Выбран()=1 Тогда ТекстЗапроса=ТекстЗапроса+" |Условие((Сотр.Родитель=Расч)или (Сотр.ПриказОбУвольнении.Группа=Расч));"; КонецЕсли; Если Подразделение.Выбран()=1 Тогда ТекстЗапроса = ТекстЗапроса+" |Условие(ПринадлПодмножеству(Подр,Подразделение)=1);"; КонецЕсли; КонецЕсли; Если Пар=1 Тогда ТекстЗапроса = ТекстЗапроса+" |Группировка Сотр Упорядочить По Сотр.Наименование без групп; |Группировка ТЗ;"; Иначе ТекстЗапроса = ТекстЗапроса+" |Группировка Сотр Упорядочить По Сотр.Код без групп; |Группировка ТЗ;"; КонецЕсли; Запрос=СоздатьОбъект("Запрос"); Если (Запрос.Выполнить(ТекстЗапроса)=0) Тогда Возврат; КонецЕсли; Затем дальше в тексте встречаются циклы Пока Группировка(1)=1 Пока Группировка(2)=1 Пока Группировка(4)=1 Объясните, пожалуйста, по чем конкретно идет группировка в каждом случае. Просто в ходе выполнения на некоторых сотрудниках выскакивает ошибка - "Неверное имя группы "4" в функции Группировка, а я не могу понять почем конкретно идет группировка. |
|||
1
Chum
11.08.16
✎
11:08
|
Выгрузить запрос в ТЗ и визуально оцени результаты в виде таблицы.
|
|||
2
kazimeg
11.08.16
✎
11:10
|
А как это сделать?
|
|||
3
Ёпрст
гуру
11.08.16
✎
11:12
|
(0) перед Запрос.Выполнить(ТекстЗапроса)
посмотри сам ТекстЗапроса, например, так: Предупреждение(ТекстЗапроса); там смотри, сколько у тебя есть группировок, и есть ли их там вообще, 4 штуки. |
|||
4
kazimeg
11.08.16
✎
11:37
|
В тексте запроса идет -
Группировка Сотр Упорядочить По Сотр.Наименование без групп; Группировка ТЗ; |
|||
5
Ёпрст
гуру
11.08.16
✎
11:39
|
(4) и ? считать умеешь ? Это 2 (две) группировки. 4 там ну никак нет - вот и ошибка у тебя.
|
|||
6
kazimeg
11.08.16
✎
11:45
|
Это я вижу сам. Когда я просматриваю ТЗ через вычислить выражение, то выдает
ТЗ= НомерСтроки=0 МесяцНачисления= Начисление= Начислено= Дней= и.д. Возможно группировка идет по полям ТЗ и тогда Группировка(4) значит Группировка("Начисление" )? |
|||
7
Builder
11.08.16
✎
11:52
|
(6) Не значит. Нет в запросе 4-й группировки. Только ДВЕ.
|
|||
8
kazimeg
11.08.16
✎
12:37
|
Но когда я подставляю вместо 4 3, т.е. пишу Группировка(3), то сообщений об ошибке не выдает, но выплаты, которые шли через кассу при этом в расчетник не заносит.
|
|||
9
Ёпрст
гуру
11.08.16
✎
12:43
|
(8) вероятно, там есть еще запросы и ты смотришь не то/ не туда.
|
|||
10
kazimeg
11.08.16
✎
12:54
|
Вот полный код отчета
Перем Расч; Перем ЖрнЗарплата; Перем ДатаАктуальности; Перем СледПериод; Функция СтрокаПодоходного(Объект) ИтоговыйСписок=СоздатьОбъект("СписокЗначений"); ФормированиеДанныхДля_ПН(Объект,ДатаАктуальности,ИтоговыйСписок); //************************В Итоговом списке*********************** // 1 - совокупный доход. 2 - Льготы по матпомощи. 3 - стандартный вычет. // 4 - вычеты на иждивенцев 5 - Соц. вычеты 6 -имущ.вычеты 7 - подоходный налог Стр=""; если ИтоговыйСписок.ПолучитьЗначение(1)<>0 Тогда Стр=Стр+ ?(ИтоговыйСписок.ПолучитьЗначение(1)<>0,"Доход="+Строка(ИтоговыйСписок.ПолучитьЗначение(1)),""); Стр=Стр+ ?(ИтоговыйСписок.ПолучитьЗначение(2)<>0," Льгот="+Строка(ИтоговыйСписок.ПолучитьЗначение(2)),""); Стр=Стр+ ?(ИтоговыйСписок.ПолучитьЗначение(3)<>0," Ст.вычт.="+Строка(ИтоговыйСписок.ПолучитьЗначение(3)),""); Стр=Стр+ ?(ИтоговыйСписок.ПолучитьЗначение(4)<>0," Вычт.идж="+Строка(ИтоговыйСписок.ПолучитьЗначение(4)),""); Стр=Стр+ ?(ИтоговыйСписок.ПолучитьЗначение(5)+ИтоговыйСписок.ПолучитьЗначение(6)<>0," Соц./им. вычеты="+Строка(ИтоговыйСписок.ПолучитьЗначение(5)+ИтоговыйСписок.ПолучитьЗначение(6)),""); Стр=Стр+ " Под.налог="+Строка(ИтоговыйСписок.ПолучитьЗначение(7)); КонецЕсли; Возврат(стр); КонецФункции Процедура ПечататьРЛ(Пар) СторноЗаписи = СоздатьОбъект("ЖурналРасчетов.Зарплата"); ТЗ=СоздатьОбъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("МесяцНачисления","Число",2); ТЗ.НоваяКолонка("Начисление","Строка"); ТЗ.НоваяКолонка("Начислено","Число"); ТЗ.НоваяКолонка("Дней","Число"); ТЗ.НоваяКолонка("Часов","Число"); ТЗ.НоваяКолонка("МесяцУдержания","Число",2); ТЗ.НоваяКолонка("Удержание","Строка"); ТЗ.НоваяКолонка("Удержано","Число"); ТЗН=СоздатьОбъект("ТаблицаЗначений"); ТЗН.НоваяКолонка("МесяцНачисления","Число",2); ТЗН.НоваяКолонка("Начисление","Строка"); ТЗН.НоваяКолонка("Начислено","Число"); ТЗН.НоваяКолонка("Дней","Число"); ТЗН.НоваяКолонка("Часов","Число"); ТЗН.НоваяКолонка("Приоритет","Число"); ТЗУ=СоздатьОбъект("ТаблицаЗначений"); ТЗУ.НоваяКолонка("МесяцУдержания","Число",2); ТЗУ.НоваяКолонка("Удержание","Строка"); ТЗУ.НоваяКолонка("Удержано","Число"); ТЗВыплат=СоздатьОбъект("ТаблицаЗначений"); ТЗВыплат.НоваяКолонка("ДатаВыплаты","Дата"); ТЗВыплат.НоваяКолонка("Выплачено","Число"); ТЗПрочие=СоздатьОбъект("ТаблицаЗначений"); ТЗПрочие.НоваяКолонка("Начислено","Строка"); ТЗПрочие.НоваяКолонка("Выплачено","Число"); ТекстЗапроса= "//{{ЗАПРОС(Печатать) |Период с {НачМесяца(ДатаАктуальности)} по {КонМесяца(ДатаАктуальности)}; |Сотр = ЖурналРасчетов.Зарплата.Объект; |ВР = ЖурналРасчетов.Зарплата.ВидРасч; |Дн = ЖурналРасчетов.Зарплата.Дни; |Чс = ЖурналРасчетов.Зарплата.Часы; |Рез = ЖурналРасчетов.Зарплата.Результат; |Подр = ЖурналРасчетов.Зарплата.Объект.Подразделение; |Док = ЖурналРасчетов.Зарплата.ТекущийДокумент; |Пер = ЖурналРасчетов.Зарплата.ПериодРегистрации; |ТЗ= ЖурналРасчетов.Зарплата.ТекущаяЗапись; |Действие=ЖурналРасчетов.Зарплата.ПериодДействия; |Документик = ЖурналРасчетов.Зарплата.ТекущийДокумент; |Функция Начислено = Сумма(Рез) когда(ВР.ВходитВГруппу(ГруппаРасчетов.ВсеНачисления)=1); |Функция Удержано = Сумма(Рез) когда(ВР.ВходитВГруппу(ГруппаРасчетов.ВсеУдержания)=1); |Функция Натурой = Сумма(Рез) когда(ВР.ВходитВГруппу(ГруппаРасчетов.ПрочиеДоходы)=1); |Функция ВыплаченоВКассе = Сумма(Рез) когда(ВР=Видрасчета.ВыплатаЧерезКассу); |Функция НачальноеСальдо = Сумма(Рез) когда(ВР=Видрасчета.НачальноеСальдо);"; Если Сотрудник.Выбран()=1 Тогда ТекстЗапроса = ТекстЗапроса+" |Условие(Сотр=Сотрудник);"; Иначе Если Расч.Выбран()=1 Тогда ТекстЗапроса=ТекстЗапроса+" |Условие((Сотр.Родитель=Расч)или (Сотр.ПриказОбУвольнении.Группа=Расч));"; КонецЕсли; Если Подразделение.Выбран()=1 Тогда ТекстЗапроса = ТекстЗапроса+" |Условие(ПринадлПодмножеству(Подр,Подразделение)=1);"; КонецЕсли; КонецЕсли; Если Пар=1 Тогда ТекстЗапроса = ТекстЗапроса+" |Группировка Сотр Упорядочить По Сотр.Наименование без групп; |Группировка ТЗ;"; Иначе ТекстЗапроса = ТекстЗапроса+" |Группировка Сотр Упорядочить По Сотр.Код без групп; |Группировка ТЗ;"; КонецЕсли; Запрос=СоздатьОбъект("Запрос"); Предупреждение(ТекстЗапроса); Если (Запрос.Выполнить(ТекстЗапроса)=0) Тогда Возврат; КонецЕсли; Дт_рег=ДатаАктуальности; Таб=СоздатьОбъект("Таблица"); Если Экз2=1 Тогда Таб.ИсходнаяТаблица("2Экз"); Конецесли; Пока Запрос.Группировка(1) = 1 Цикл Если Запрос.Начислено+Запрос.Удержано+Запрос.НачальноеСальдо=0 Тогда продолжить; КонецЕсли; Сотр=Запрос.Сотр; Таб.ВывестиСекцию("Заголовок"); Начислений=0;Удержаний=0;СальдоНач=0;Внесено=0; ТЗ.УдалитьСтроки(); ТЗН.УдалитьСтроки(); ТЗУ.УдалитьСтроки(); ТЗВыплат.УдалитьСтроки(); ТЗПрочие.УдалитьСтроки(); Пока Запрос.Группировка(2) = 1 Цикл Если Запрос.Рез=0 Тогда Продолжить; КонецЕсли; Если Запрос.ВР.ВходитВГруппу(ГруппаРасчетов.ВсеНачисления)=1 Тогда ТЗН.НоваяСтрока(); ТЗН.МесяцНачисления=ДатаМесяц(Запрос.ТЗ.ДатаНачала); ТЗН.Начисление=ПредставлениеВР(Запрос.ВР); Если Запрос.ТЗ.Сторно =1 Тогда Если СторноЗаписи.НайтиЗапись(Запрос.ТЗ.ПервичнаяЗапись)=1 Тогда ТЗН.Начислено=Деноминация(Запрос.Рез,СторноЗаписи.ПериодДействия.ДатаНачала,СторноЗаписи.ПериодРегистрации.ДатаНачала); КонецЕсли; ИначеЕсли Запрос.ТЗ.Перерасчет=1 Тогда Если СторноЗаписи.НайтиЗапись(Запрос.ТЗ)=1 Тогда ТЗН.Начислено=Деноминация(Запрос.Рез,СторноЗаписи.ПериодДействия.ДатаНачала,СторноЗаписи.ПериодРегистрации.ДатаНачала,1); КонецЕсли; Иначе ТЗН.Начислено=Запрос.Рез; КонецЕсли; ТЗН.Дней=Запрос.Дн; ТЗН.Часов=Запрос.Чс; ТЗН.Приоритет=Запрос.ВР.Очередность; ИначеЕсли Запрос.ВР.ВходитВГруппу(ГруппаРасчетов.ВсеУдержания)=1 Тогда Если Запрос.ВР<>ВидРасчета.ВыплатаЧерезБанк Тогда //это все кроме банка ТЗУ.НоваяСтрока(); ТЗУ.МесяцУдержания=ДатаМесяц(Запрос.ТЗ.ДатаНачала); ТЗУ.Удержание=ПредставлениеВР(Запрос.ВР); Если Запрос.ТЗ.Сторно =1 Тогда Если СторноЗаписи.НайтиЗапись(Запрос.ТЗ.ПервичнаяЗапись)=1 Тогда ТЗУ.Удержано=Деноминация(Запрос.Рез,СторноЗаписи.ПериодДействия.ДатаНачала,СторноЗаписи.ПериодРегистрации.ДатаНачала); КонецЕсли; ИначеЕсли Запрос.ТЗ.Перерасчет=1 Тогда Если СторноЗаписи.НайтиЗапись(Запрос.ТЗ)=1 Тогда ТЗУ.Удержано=Деноминация(Запрос.Рез,СторноЗаписи.ПериодДействия.ДатаНачала,СторноЗаписи.ПериодРегистрации.ДатаНачала,1); КонецЕсли; Иначе ТЗУ.Удержано=Запрос.Рез; КонецЕсли Иначе // добавим выплаты на банк,и подменим название вида расчета ЧтоВыплачиваем=ПредставлениеВР(Запрос.ВР); Если Запрос.Документик.Вид()="ПлатежнаяВедомость" Тогда Если Запрос.Документик.ТипПлатежа=Перечисление.ТипПлатежа.Аванс Тогда ЧтоВыплачиваем="Выплата аванса (банк)"; ИначеЕсли Запрос.Документик.ТипПлатежа=Перечисление.ТипПлатежа.ВыплатыНаДетей Тогда ЧтоВыплачиваем="Выплата пособий (банк)"; ИначеЕсли Запрос.Документик.ТипПлатежа=Перечисление.ТипПлатежа.зарплата Тогда ЧтоВыплачиваем="Выплата зарплаты (банк)"; Иначе ЧтоВыплачиваем="Выплата в банк"; КонецЕсли; КонецЕсли; ТЗУ.НоваяСтрока(); ТЗУ.МесяцУдержания=ДатаМесяц(Запрос.ТЗ.ДатаНачала); ТЗУ.Удержание=ЧтоВыплачиваем; ТЗУ.Удержано=Запрос.Рез; КонецЕсли; ИначеЕсли Запрос.ВР.ВходитВГруппу(ГруппаРасчетов.ПрочиеДоходы)=1 Тогда // добавим натуральные выплаты,если они есть ТЗПрочие.НоваяСтрока(); ТЗПрочие.Начислено=ПредставлениеВР(Запрос.ВР); ТЗПрочие.Выплачено=Запрос.Натурой; ИначеЕсли Запрос.ВР=Видрасчета.НачальноеСальдо Тогда СальдоНач=Запрос.Рез; ИначеЕсли Запрос.ВР=Видрасчета.ВыплатаЧерезКассу Тогда Пока Запрос.Группировка(4) = 1 Цикл ТЗВыплат.НоваяСтрока(); Если Запрос.Документик.Вид()="ПлатежнаяВедомость" Тогда ТЗВыплат.ДатаВыплаты=Запрос.Документик.ДатаВыплаты; ТЗВыплат.Выплачено=Запрос.ВыплаченоВКассе; Иначе ТЗВыплат.Выплачено=Запрос.ВыплаченоВКассе; КонецЕсли; КонецЦикла; ИначеЕсли Запрос.ВР=Видрасчета.Возврат Тогда Внесено=Запрос.Рез; КонецЕсли; КонецЦикла; ТЗН.Свернуть("МесяцНачисления,Начисление,Приоритет","Начислено,Дней,Часов"); ТЗН.Сортировать("МесяцНачисления+,Приоритет+"); ТЗУ.Свернуть("МесяцУдержания,Удержание","Удержано"); ТЗУ.Сортировать("МесяцУдержания+,Удержание"); ДлинаТЗ=Макс(ТЗН.КоличествоСтрок(),ТЗУ.Количествострок()); Для i=1 по ДлинаТЗ Цикл ТЗ.НоваяСтрока(); Попытка ТЗН.ПолучитьстрокуПоНОмеру(i); ТЗ.МесяцНачисления=ТЗН.МесяцНачисления; ТЗ.Начисление=ТЗН.Начисление; ТЗ.Начислено=ТЗН.Начислено; ТЗ.Дней=ТЗН.Дней; ТЗ.Часов=ТЗН.Часов; Исключение КонецПопытки; Попытка ТЗУ.ПолучитьстрокуПоНОмеру(i); ТЗ.МесяцУдержания=ТЗУ.МесяцУдержания; ТЗ.Удержание=ТЗУ.Удержание; ТЗ.Удержано=ТЗУ.Удержано; Исключение КонецПопытки; КонецЦикла; ТЗ.ВыбратьСтроки(); ПОка ТЗ.ПолучитьСтроку()=1 Цикл Таб.ВывестиСекцию("ВР"); КонецЦикла; Таб.ВывестиСекцию("Итоги"); Если ТЗПрочие.Итог("Выплачено")>0 Тогда // выведем натуральные выплаты,если они есть Таб.ВывестиСекцию("ЗагПрочих"); ТЗПрочие.ВыбратьСтроки() ; ПОка ТЗПрочие.ПолучитьСтроку()=1 Цикл Таб.ВывестиСекцию("Прочее"); КонецЦикла; КонецЕсли; Таб.ВывестиСекцию("НаРуки"); Если ТЗВыплат.Итог("Выплачено")>0 Тогда // выведем кассовые выплаты по датам ТЗВыплат.ВыбратьСтроки() ; ПОка ТЗВыплат.ПолучитьСтроку()=1 Цикл Таб.ВывестиСекцию("Выплата"); КонецЦикла; КонецЕсли; Если Внесено>0 тогда Таб.ВывестиСекцию("Внесено"); КонецЕсли; СальдоКон = СальдоНач+ТЗ.Итог("Начислено")-ТЗ.Итог("Удержано")-ТЗВыплат.Итог("Выплачено")+Внесено; Если СальдоКон>=0 Тогда ТекстИтога ="Долг за предприятием на конец месяца:"; Иначе ТекстИтога ="Долг за работником на конец месяца:"; КонецЕсли; Таб.ВывестиСекцию("СальдоКонечное"); КонецЦикла; Таб.ТолькоПросмотр(1); Таб.Опции(0,0,0,0, "PO0057"); Если Экз2=0 Тогда Таб.ПараметрыСтраницы(1,,,10,0,0,0,0,0,1); Иначе Таб.ПараметрыСтраницы(1,,,0,0,0,0,0,0,1); Конецесли; Таб.Показать("Расчетные листки",); КонецПроцедуры Процедура ПриОткрытии() Если Флаг_РЛ=1 Тогда Сотрудник=Сотр_РЛ ; Расч =Расч_РЛ ; Подразделение=Подр_РЛ; СПН=0; Экз2=0; ПечататьРЛ(1); СтатусВозврата(0); Иначе Форма.Сотрудник.ВыборГруппы(0); Расч = Расчетчик; Если РаботаетРасчетчик = 1 Тогда СписокРасч.ДобавитьЗначение(Расчетчик,Расчетчик.Наименование); Иначе ЗанестиРасчетчиков(СписокРасч); СписокРасч.ТекущаяСтрока(СписокРасч.РазмерСписка()); КонецЕсли; КонецЕсли; КонецПроцедуры Процедура Сформировать() Если ПоФИО=1 Тогда ПечататьРЛ(1); Иначе ПечататьРЛ(0); КонецЕсли; КонецПроцедуры ПоФИО=1; ЖрнЗарплата = СоздатьОбъект("ЖурналРасчетов.Зарплата"); ДатаАктуальности = ЖрнЗарплата.КонецТекущегоПериода(); |
|||
11
Ёпрст
гуру
11.08.16
✎
13:01
|
(10) вот этот код не имеет смысла, ибо в запросе 2 группировки всего:
ИначеЕсли Запрос.ВР=Видрасчета.ВыплатаЧерезКассу Тогда Пока Запрос.Группировка(4) = 1 Цикл ТЗВыплат.НоваяСтрока(); Если Запрос.Документик.Вид()="ПлатежнаяВедомость" Тогда ТЗВыплат.ДатаВыплаты=Запрос.Документик.ДатаВыплаты; ТЗВыплат.Выплачено=Запрос.ВыплаченоВКассе; Иначе ТЗВыплат.Выплачено=Запрос.ВыплаченоВКассе; КонецЕсли; КонецЦикла; |
|||
12
Ёпрст
гуру
11.08.16
✎
13:03
|
+11 измени на
Пока Запрос.Группировка(3) = 1 Цикл и в тексте запроса добавь в конец |Группировка Документик; это, судя по логике твоего кода. |
|||
13
kazimeg
11.08.16
✎
13:18
|
Ёпрст и всем учавствовашим в обсуждении большое спасибо. Все заработало.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |