Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 12:43

помогите найти ошибку!

Автор smidv, 01 сен 2010, 18:22

0 Пользователей и 1 гость просматривают эту тему.

smidv

помогите найти ошибку! :trhregerhg:
Не правильно формирует отчет по Мастерам-приёмщикам выдает общий отчет по всем мастера а не по каждому
ЦитироватьПерем
   спГруппировки,         // Список группировок запроса
   Зап,РазмерГр,          // Запрос и его размерность
   Таб, Обновить,         // Переменные таблицы и запроса для отчета
   спВидовСвойств, КолВС,  // Список и количество видов свойств по подразделениям
   ВалютаОтчета;   

//-----------------------------------------------
Процедура СтрокаСтатуса(Знач _Текст="")
   Форма.СтрокаСтатуса.Заголовок(_Текст);
КонецПроцедуры   //СтрокаСтатуса

//-----------------------------------------------
Функция ПроверкаПорядкаСписка(Сп)
// проверяет порядок в списке группировки
   НомСв1=Сп.НайтиЗначение("Свойство1");
   НомСв2=Сп.НайтиЗначение("Свойство2");
   НомСв3=Сп.НайтиЗначение("Свойство3");
   НомПод=Сп.НайтиЗначение("Подразделение без групп");
   НомДок=Сп.НайтиЗначение("Документ");
   Возврат ?((НомПод<НомСв1) или (НомПод<НомСв2) или (НомПод<НомСв3) или (НомДок<спОбороты.РазмерСписка()), 0, 1);
КонецФункции   //ПроверкаПорядкаСписка()

//-----------------------------------------------
Функция ПриВыбореЗначения(Об="",ДопПараметр="")
   Если Об="" Тогда Об=Форма.АктивныйЭлемент(); КонецЕсли;
   
   Если Об="" Тогда
   ИначеЕсли Об="кнВверхОбороты" Тогда
      глСписокДействие(спОбороты,"Вверх");
   ИначеЕсли Об="кнВнизОбороты" Тогда
      глСписокДействие(спОбороты,"Вниз");
   ИначеЕсли Об="кнДобавитьСвойства" Тогда
      глОтчетДобавитьСвойства(спВидовСвойств, спПодразделения);
   Иначе Возврат глОтчетОбработкаФормы(Контекст,Об,ДопПараметр);
   КонецЕсли;   Возврат 1;
КонецФункции   // ПриВыбореЗначения

///////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ФОРМИРОВАНИЯ ОТЧЕТА
///////////////////////////////////////////////////////////////////////////
//-----------------------------------------------
Функция СтрокаФильтра()
// Формирует строку для вывода в отчет информации об установленном фильтре   
   Возврат
      глОтчетСтрокаФильтра(спПодразделения, "Подразделения")+
      глОтчетСтрокаФильтра(спСотрудники, "Исполнители", 1)+
      глОтчетСтрокаФильтра(спВидРемонта, "Виды ремонта", 1)+
      глОтчетСтрокаФильтра(спПереченьРабот, "Виды тех. операций", 1);
КонецФункции // СтрокаФильтра()

//-----------------------------------------------
Процедура ЦиклПоГруппировке(Знач ГрСп=1)
   Если спГруппировки.РазмерСписка()<ГрСп Тогда Возврат; КонецЕсли;
   
   
   ИмяГрп=глСтрокаНачало(спГруппировки.ПолучитьЗначение(ГрСп));
   
   Пока Зап.Группировка(ГрСп) = 1 Цикл
      // Получение объекта группировки и его представления
      ОбъектОтчета=""; СтрокаОтчета="";
      глОтчетПолучитьОбъект(Зап, ИмяГрп, ОбъектОтчета, СтрокаОтчета);
      // Установка параметра расшифровки
      глРасшифровка.Установить(ИмяГрп,ОбъектОтчета);
      // Формирование отступа для получения древовидности отчета
      
      глОтчетВывестиНачалоСтроки(Таб, "Строка", ГрСп-1, СтрокаОтчета, ОбъектОтчета);
      
      Количество=ФРМ(Зап.СумКоличество);
      Сумма=ФРМ(глПересчет(Зап.СумСумма,Константа.ОсновнаяВалюта,ДатаКонца,ВалютаОтчета,ДатаКонца));
      Время=ФРМ(Зап.СумВремя); КПД=?(Зап.СумВремя=0,"--",ФРМ(100*Зап.СумКоличество/Зап.СумВремя));
      Таб.ПрисоединитьСекцию("Строка|Показатели");
      глУровни[ГрСп]=ГрСп;
      глОтчетПараметрыСекции(Таб, ГрСп, РазмерГр, Таб.ШиринаТаблицы(), 1);
      глОживить(1, 10);
      
      ЦиклПоГруппировке(ГрСп+1);
      глСписокДействие(глРасшифровка, "Обрезать", ГрСп);   // Очистим лишние параметры расшифровки
   КонецЦикла;
КонецПроцедуры   //ЦиклПоГруппировке

//-----------------------------------------------
Процедура Сформировать(Реж=2)

   Состояние("Выполняю подготовку данных отчета");  
   
   ТекВалюта=СпВалюта.ТекущаяСтрока();
   ВалютаОтчета=СпВалюта.ПолучитьЗначение(СпВалюта.ТекущаяСтрока());
   
   // Заполним список разверток
   спГруппировки=СоздатьОбъект("СписокЗначений");
   глСписокЗагрузить(спГруппировки, спОбороты, 1, 2);
   
   РазмерГр=спГруппировки.РазмерСписка();
   Если глОтчетПроверитьРазмерГруппировок(РазмерГр, 1)=0 Тогда Возврат; КонецЕсли;
   
   СтрокаСтатуса("Подготовка данных...");
   // сформируем текст запроса
   тЗап=глОтчетШапкаЗапроса(Реж,Контекст,)+"
   |Фирма=Регистр.ОбъемРабот.Подразделение.Фирма;
   |Мастер = Документ.ЗаказНаряд.Мастер;
   |Подразделение=Регистр.ОбъемРабот.Подразделение;
   |Свойство1=Регистр.ОбъемРабот.Подразделение.ОсновноеСвойство1;
   |Свойство2=Регистр.ОбъемРабот.Подразделение.ОсновноеСвойство2;
   |Свойство3=Регистр.ОбъемРабот.Подразделение.ОсновноеСвойство3;
   |Исполнитель=Регистр.ОбъемРабот.Исполнитель;
   |ВидРемонта=Регистр.ОбъемРабот.ВидРемонта;
   |Работа=Регистр.ОбъемРабот.Номенклатура;
   |Процент=Регистр.ОбъемРабот.Процент;
   |Количество=Регистр.ОбъемРабот.Количество;
   |Время=Регистр.ОбъемРабот.Время;
   |Сумма=Регистр.ОбъемРабот.Сумма;";
   Для Сч=1 По спГруппировки.РазмерСписка() Цикл тЗап=тЗап+"
      |Группировка "+спГруппировки.ПолучитьЗначение(Сч)+";";
   КонецЦикла;   
   тЗап=тЗап+
   глОтчетУсловиеЗапроса(ВыбФирма, "ВыбФирма", "Фирма")+
   глОтчетУсловиеЗапроса(спПодразделения, "спПодразделения", "Подразделение", "Свойство", спВидовСвойств)+
   глОтчетУсловиеЗапроса(спСотрудники, "спСотрудники", "Исполнитель")+
   глОтчетУсловиеЗапроса(спВидРемонта, "спВидРемонта", "ВидРемонта")+
   глОтчетУсловиеЗапроса(спПереченьРабот, "спПереченьРабот", "Работа")+
   "Функция СумКоличество=Сумма(Количество);
   |Функция СумСумма=Сумма(Сумма);
   |Функция СумВремя=Сумма(Время);";
   // Расчет запроса
   Зап=СоздатьОбъект("Запрос");
   Если Зап.Выполнить(тЗап) = 0 Тогда
      Сообщить(?(Право[123]=1,тЗап,"Запрос не выполнен")); Возврат;
   КонецЕсли;
   //глТЗ_Показать(Зап);   // Эту строчку можно раскоментировать для отладки запроса
   
   // Инициализация таблицы отчета
   Если ТипЗначенияСтр(Таб)<>"Таблица" Тогда Таб=СоздатьОбъект("Таблица");
   Иначе Таб.Очистить();
   КонецЕсли;
   Если Обновить="Настройка" Тогда СтрокаДействийФормы="#Закрыть"; КонецЕсли;
   Если Константа.КонтрольВремениВыполнения=Перечисление.Булево.Да Тогда
       глИсходнаяТаблица(Таб,"Выработка_Эффективность");
   Иначе
      глИсходнаяТаблица(Таб,"Выработка");
   КонецЕсли;
   
   СтрокаСтатуса("Формирование таблицы отчета...");
   
   глОтчетВывестиНачалоСтроки(Таб, "Шапка");
   Таб.ПрисоединитьСекцию("Шапка|Показатели");
   глОтчетПараметрыСекции(Таб, "Шапка", 5, Таб.ШиринаТаблицы(), Таб.ВысотаТаблицы());
   глОживить(Таб.ВысотаТаблицы());
   Таб.Опции(0,0,Таб.ВысотаТаблицы(), 18);
   глРасшифровка=СоздатьОбъект("СписокЗначений");
   ЦиклПоГруппировке(1);
   Количество=ФРМ(Зап.СумКоличество);
      
   Сумма=ФРМ(глПересчет(Зап.СумСумма,Константа.ОсновнаяВалюта,ДатаКонца,ВалютаОтчета,ДатаКонца));
   Время=ФРМ(Зап.СумВремя);
   КПД=?(Зап.СумВремя=0,"--",ФРМ(100*Зап.СумКоличество/Зап.СумВремя));
   глОтчетВывестиНачалоСтроки(Таб, "Подвал",15);
   Таб.ПрисоединитьСекцию("Подвал|Показатели");
   глОтчетПараметрыСекции(Таб, "Подвал", , Таб.ШиринаТаблицы(), 1);
   глОживить(1);
   глОтчетПоказать(Контекст,Таб,,"Выработка производства");
   СтрокаСтатуса();
КонецПроцедуры   // Сформировать


//-----------------------------------------------
Процедура НастроитьГруппировку(ИмяГрп)
// выбор заранее предопределенных группировок
   СтрВСш=""; СтрВС="";
   глОтчетПолучитьШаблонНастройки(спВидовСвойств, СтрВСш, СтрВС);
   Меню=СоздатьОбъект("СписокЗначений");
   Меню.ДобавитьЗначение("1"+СтрВСш+"0100", "По фирмам   (фирма - хоз.операция)");
   Меню.ДобавитьЗначение("0"+СтрВСш+"1100", "По подразделениям   (подразделение - хоз.операция)");
   Меню.ДобавитьЗначение("0"+СтрВСш+"1110", "По подразделениям с аналитикой");
   Меню.ДобавитьЗначение("0"+СтрВСш+"0101", "Карточка   (хоз.операция - документ)");
   Ном=0;
   Если Меню.ВыбратьЗначение(Ном,,,,1)=1 Тогда
      глСписокДействие(спОбороты, "ВсеСнять");
      глСписокДействие(спОбороты, "Настройка", "Фирма, "+СтрВС+"Подразделение без групп, ХозОперация без групп, Аналитика без групп, Документ", Ном);
   КонецЕсли;
КонецПроцедуры   //НастроитьГруппировку(ИмяГрп)

///////////////////////////////////////////////////////////////////////////
// ПРЕДОПРЕДЕЛЕННЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
///////////////////////////////////////////////////////////////////////////
//-----------------------------------------------
Процедура ОбработкаПодбора(Элемент,КонтПодб)
// Обрабатывает подборы всех справочников
   Если ТипЗначения(Элемент)<>11 Тогда Возврат; КонецЕсли;
   Если Элемент.Вид()="Подразделения" Тогда глСписокДействие(спПодразделения,"Добавить",Элемент);
   ИначеЕсли Элемент.Вид()="Сотрудники" Тогда глСписокДействие(спСотрудники,"Добавить",Элемент);
   ИначеЕсли Элемент.Вид()="ВидРемонта" Тогда глСписокДействие(спВидРемонта,"Добавить",Элемент);
   ИначеЕсли Элемент.Вид()="ПереченьРабот" Тогда глСписокДействие(спПереченьРабот,"Добавить",Элемент);   
      
   КонецЕсли;
КонецПроцедуры // ОбработкаПодбора

//-----------------------------------------------
// Вызывается при открытии отчета. Анализирует параметры вызова
Процедура ПриОткрытии(ФлагНастройки)
   Если глОтчетПриОткрытии(Контекст,"Выработка")=0 Тогда Возврат; КонецЕсли;

   Если спОбороты.РазмерСписка()<>5+КолВС Тогда
      спОбороты.УдалитьВсе();
      спОбороты.ДобавитьЗначение("Фирма","");
      спОбороты.ДобавитьЗначение("Мастер","Мастер-приёмщик");
      спОбороты.Пометка(2,1);
      Для Ном=1 по КолВС Цикл
         Представление="";
         ВидСвойства=спВидовСвойств.ПолучитьЗначение(Ном, Представление);
         НомСв=Сред(Представление, 8, 1);
         спОбороты.ДобавитьЗначение("Свойство"+НомСв, Представление);
      КонецЦикла;
      спОбороты.ДобавитьЗначение("Подразделение без групп","Цех");
      спОбороты.ДобавитьЗначение("Исполнитель без групп","Исполнитель");
      спОбороты.ДобавитьЗначение("ВидРемонта без групп","Вид ремонта");
      спОбороты.ДобавитьЗначение("Работа без групп","Работа");
      спОбороты.ДобавитьЗначение("Документ","Документы");
      спОбороты.ДобавитьЗначение("День","День");
      спОбороты.ДобавитьЗначение("Неделя","Неделя");
      спОбороты.ДобавитьЗначение("Месяц","Месяц");
      спОбороты.ДобавитьЗначение("Квартал","Квартал");
      спОбороты.ДобавитьЗначение("Год","Год");
      спОбороты.Пометка(2+КолВС,1);
      спОбороты.Пометка(3+КолВС,1);
   КонецЕсли;
   
   Если ТипЗначенияСтр(Форма.Параметр)="СписокЗначений" Тогда
      //глТЗ_Показать(Форма.Параметр);
      глОтчетУстановитьПараметры(Контекст, Форма.Параметр);
      Обновить=Форма.Параметр.Получить("ОбновитьНастроить");
      Если (Обновить="Обновить") или (Обновить="Настройка") Тогда   //обновить-настроить
         Таб=Форма.Параметр.Получить("Таблица");
         Если Обновить="Обновить" Тогда  
            спрВалют=СоздатьОбъект("Справочник.Валюты");
            спрВалют.ВыбратьЭлементы();
            Пока спрВалют.ПолучитьЭлемент()=1 Цикл
               Попытка
                  Если спрВалют.ЭтоНормочас=Перечисление.Булево.Да Тогда
                     Продолжить;
                  КонецЕсли;
               Исключение
                  СтрокаСтатуса(ОписаниеОшибки());
               КонецПопытки;
               СпВалюта.ДобавитьЗначение(спрВалют.ТекущийЭлемент());
            КонецЦикла;
            СпВалюта.ТекущаяСтрока(ТекВалюта);
            Сформировать();
            СтатусВозврата(0);
         КонецЕсли;
      Иначе   //по расшифровке
            спрВалют=СоздатьОбъект("Справочник.Валюты");
            спрВалют.ВыбратьЭлементы();
            Пока спрВалют.ПолучитьЭлемент()=1 Цикл
               Попытка
                  Если спрВалют.ЭтоНормочас=Перечисление.Булево.Да Тогда
                     Продолжить;
                  КонецЕсли;
               Исключение
                  СтрокаСтатуса(ОписаниеОшибки());
               КонецПопытки;
               СпВалюта.ДобавитьЗначение(спрВалют.ТекущийЭлемент());
            КонецЦикла;
            Поз=СпВалюта.НайтиЗначение(Константа.ОсновнаяВалюта);
            СпВалюта.ТекущаяСтрока(Поз);
         Сформировать();
         СтатусВозврата(0);
      КонецЕсли;
   КонецЕсли;
   спрВалют=СоздатьОбъект("Справочник.Валюты");
   спрВалют.ВыбратьЭлементы();
   Пока спрВалют.ПолучитьЭлемент()=1 Цикл
      Попытка
         Если спрВалют.ЭтоНормочас=Перечисление.Булево.Да Тогда
            Продолжить;
         КонецЕсли;
      Исключение
         СтрокаСтатуса(ОписаниеОшибки());
      КонецПопытки;
      СпВалюта.ДобавитьЗначение(спрВалют.ТекущийЭлемент());
   КонецЦикла;  
   Поз=СпВалюта.НайтиЗначение(Константа.ОсновнаяВалюта);
   СпВалюта.УстановитьЗначение(Поз,Константа.ОсновнаяВалюта,СокрЛП(Константа.ОсновнаяВалюта.Наименование)+" (без пересчета)");
   СпВалюта.ТекущаяСтрока(Поз);
   СтрокаСтатуса();
КонецПроцедуры // ПриОткрытии()

//-----------------------------------------------
// Здесь заполняется список параметров, влияющих на формирование отчета,
// Для автоматического заполнения расшифровки при формировании отчета
// Значение - Идентификатор реквизита диалога, Представление - Имя параметра
// Параметры периода добавляются автоматически при открытии отчета
спПараметровОтчета.УдалитьВсе();
спПараметровОтчета.Установить("Подразделение","спПодразделения");
спПараметровОтчета.Установить("Сотрудники","спСотрудники");
спПараметровОтчета.Установить("ТекВалюта","ТекВалюта");
спПараметровОтчета.Установить("ИмяОтчета","Выработка");

//-----------------------------------------------
спВидовСвойств=СоздатьОбъект("СписокЗначений");
глСвойстваЗаполнитьСписокВидов(спВидовСвойств, "Подразделения");
КолВС=спВидовСвойств.РазмерСписка();

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск