подскажите как из глобального модуля перенести переменну.
18.06.2009
16:26
#32
"Для вашей функции будет по всем сотрудникам.
Поскольку переменная Сотрудник объявлена внутри запроса
> |Сотрудник = Документ.Отпускные.Сотрудник;
Затем идет условия сравнения этой переменной с ею самой
> |Условие(Сотрудник = Сотрудник);
Которое будет всегда истиной
В приведенном мною примере, функцию нужно будет вызывать так
Пока Запрос.Группировка() = 1 Цикл
Премия =Окр(ОтработаноЗаМесяц*0.3*Запрос.ПремияПроцент/100,2);//мы вычислили премию теперь объявляем функцию, для нахождения сред.
// подразумеваем что в запросе по котором делается цикл Пока Запрос.Группировка() = 1 есть Сотрудник
СформироватьСредний(Запрос.Сотрудник);//это функция объявления, которая находится в глобальнике т.е.ушли в глобальник сформировали там запрос:
"
Поскольку переменная Сотрудник объявлена внутри запроса
> |Сотрудник = Документ.Отпускные.Сотрудник;
Затем идет условия сравнения этой переменной с ею самой
> |Условие(Сотрудник = Сотрудник);
Которое будет всегда истиной
В приведенном мною примере, функцию нужно будет вызывать так
Пока Запрос.Группировка() = 1 Цикл
Премия =Окр(ОтработаноЗаМесяц*0.3*Запрос.ПремияПроцент/100,2);//мы вычислили премию теперь объявляем функцию, для нахождения сред.
// подразумеваем что в запросе по котором делается цикл Пока Запрос.Группировка() = 1 есть Сотрудник
СформироватьСредний(Запрос.Сотрудник);//это функция объявления, которая находится в глобальнике т.е.ушли в глобальник сформировали там запрос:
"
24.06.2009
12:13
#33
Условие это я прописывала для того (оно не правильное я с вами согласна), чтобы взять средний по нужному человеку не выбирая его в диалоге, т.е.нажимая сформировать он пошел обрабатывать всех сотрудников -нашел их средний вычислил отпускные, пошел дальше но получается он по одному сотруднику вычислил средний и пропечатал его по всем, получается он не берёт за период а берет последний документ(который находится в июне нашел по нему и высчитал всем по этой цифре).
24.06.2009
12:25
#34
"Вы когда запросы пишете, следите, чтобы идентификаторы внутренних переменных запросов не совпадали с идентификаторами, задействованными в контексте. То есть, не надо, что бы внутри запроса использовались для описания внутренней переменной "Код", "Наименование", идентификатор любого реквизита, если запрос выполняется в контексте формы списка справочника или форме элемента справочника, аналогично по документам - не надо в запросе использовать в качестве внутренних переменных названия общих реквизитов, реквизитов шапки или табличной части. Кроме того, следите за тем, чтобы не пересечься с названиями глобальных переменных. Я так же стараюсь не использовать в качестве внутренних переменных предикаты, например "Сумма", "НачОст" и т.п. Это все логические ошибки, на которые никакой интерпритатор или компилятор вам не ругнется, а в отладке такое ищется проблемно.
Ваш текст запроса конечно же не должен содержать строку вида:
|Условие(Сотрудник = Сотрудник);
потому что в ней, прямо скажем, смысла нет никакого. Подозреваю, что вы имели ввиду что то вроде:
|Условие(Сотрудник = НужныйСотрудник);
где Сотрудник - внутренняя переменная запроса, а НужныйСотрудник - внешняя по отношению к запросу переменная, значение которой задается где то перед выполнением запроса"
Ваш текст запроса конечно же не должен содержать строку вида:
|Условие(Сотрудник = Сотрудник);
потому что в ней, прямо скажем, смысла нет никакого. Подозреваю, что вы имели ввиду что то вроде:
|Условие(Сотрудник = НужныйСотрудник);
где Сотрудник - внутренняя переменная запроса, а НужныйСотрудник - внешняя по отношению к запросу переменная, значение которой задается где то перед выполнением запроса"
24.06.2009
12:29
#35
"получается я должна в первом запросе присвоить какой-то переменной: Наимен = Запрос.Сотрудники;и перенести её во-второй запрос(в глобальник), и по этой переменной сделать запрос ? И вы хотите сказать что во втором запросе
|Сумма = Документ.Отпускные.Сумма;
|Функция СуммаСреднее = Среднее(Сумма);сумма объявлена не правильно, тогда как?"
|Сумма = Документ.Отпускные.Сумма;
|Функция СуммаСреднее = Среднее(Сумма);сумма объявлена не правильно, тогда как?"
24.06.2009
13:19
#36
"> ... и перенести её во-второй запрос(в глобальник)
я бегло посмотрел пост, не понял зачем вообще нужно создавать глобальную переменную. С моей точки зрения задача решается так:
пусть у вас есть документ, в котором есть какая то подзадача по расчету этого самого среднего и данные сведения нужны в контексте модуля проведения документа.
Первая мысль, которая возникает, - зачем нам ДВА запроса вообще?
Вариант решения "а" (все в одном запросе):
Процедура ОбработкаПроведения()
СписокНужныхСотрудников=СоздатьОбъект("СписокЗначений");
ВыгрузитьТабличнуюЧасть(СписокНужныхСотрудников,"Сотрудник");
НачДата=ДобавитьМесяц(НачМесяца(ДатаДок),-3)
КонДата=НачМесяца(ДатаДок)-1;
ТекстЗапроса="Период с НачДата По КонДата;
|ОбрабатыватьДокументы Проведенные;
|ВПСотрудник=Документ.НачислениеОтпускных.Сотрудник; //ВПСотрудник - это "внутренняя переменная сотрудник"
|НачисленнаяСумма=Документ.НачислениеОтпускных.Сумма;
|Условие(ВПСотрудник в СписокНужныхСотрудников);
|Функция СуммаСреднее=Среднее(НачисленнаяСумма);
|Группировка ВПСотрудник без групп без упорядочивания;";
Запрос=СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
Сообщить("Ошибка выполнения запроса");
СтатусВозврата(0);
Возврат;
КонецЕсли;
//и дальше по нужному вам алгоритму... я не знаю что у вас там задумано, ну пусть, например так:
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
СредняяСуммаОтпускных=0;
Запрос.ВНачалоВыборки();
Если Запрос.Получить(Сотрудник)=1 Тогда
СредняяСуммаОтпускных=Запрос.СуммаСреднее;
КонецЕсли;
....
Вариант "б" (два запроса, цель примера - показать как надо использовать вызовы функций с передачей параметров, а то у вас недопонимание по этому вопросу, отсюда и странное решение по созданию глобальной переменной):
Процедура ОбработкаПроведения()
//формируем и выполянем запрос на выборку сотрудников, правда непонятно зачем это надо, так как они в табличной части документа, вероятно и так уже перечислены, напишем запрос на выборку всех элементов, которые есть в справочнике для примера
ТекстЗапроса="ВПСотрудник=Справочник.Сотрудники.ТекущийЭлемент;
|Группировка ВПСотрудник без групп без упорядочивания;"
Запрос=СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
Сообщить("Ошибка выполнения запроса");
СтатусВозврата(0);
Возврат;
КонецЕсли;
НачДата=ДобавитьМесяц(НачМесяца(ДатаДок),-3)
КонДата=НачМесяца(ДатаДок)-1;
Пока Запрос.Группировка("ВПСотрудник")=1 Цикл
СредняяСуммаОтпускных=СформироватьСредний(Запрос.ВПСотрудник,НачДата,КонДата);
...
при этом может быть в глобальном модуле (только неполянтно зачем), либо прямо в модуле проведения нашего документа чуть выше имеется функция:
Функция СформироватьСредний(НужныйСотрудник,НачДата,КонДата)
ТекстЗапроса="Период с НачДата По КонДата;
|ОбрабатыватьДокументы Проведенные;
|ВПСотрудник=Документ.НачислениеОтпускных.Сотрудник;
|НачисленнаяСумма=Документ.НачислениеОтпускных.Сумма;
|Условие(ВПСотрудник = НужныйСотрудник);
|Функция СуммаСреднее=Среднее(НачисленнаяСумма);
|Группировка ВПСотрудник без групп без упорядочивания;";
Запрос=СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса)=1 Тогда
Возврат(Запрос.СуммаСреднее);
Иначе
Возврат(0);
КонецЕсли;
КонецФункции
> сумма объявлена не правильно, тогда как?
да нет, правильно, но я бы так не стал.
"
я бегло посмотрел пост, не понял зачем вообще нужно создавать глобальную переменную. С моей точки зрения задача решается так:
пусть у вас есть документ, в котором есть какая то подзадача по расчету этого самого среднего и данные сведения нужны в контексте модуля проведения документа.
Первая мысль, которая возникает, - зачем нам ДВА запроса вообще?
Вариант решения "а" (все в одном запросе):
Процедура ОбработкаПроведения()
СписокНужныхСотрудников=СоздатьОбъект("СписокЗначений");
ВыгрузитьТабличнуюЧасть(СписокНужныхСотрудников,"Сотрудник");
НачДата=ДобавитьМесяц(НачМесяца(ДатаДок),-3)
КонДата=НачМесяца(ДатаДок)-1;
ТекстЗапроса="Период с НачДата По КонДата;
|ОбрабатыватьДокументы Проведенные;
|ВПСотрудник=Документ.НачислениеОтпускных.Сотрудник; //ВПСотрудник - это "внутренняя переменная сотрудник"
|НачисленнаяСумма=Документ.НачислениеОтпускных.Сумма;
|Условие(ВПСотрудник в СписокНужныхСотрудников);
|Функция СуммаСреднее=Среднее(НачисленнаяСумма);
|Группировка ВПСотрудник без групп без упорядочивания;";
Запрос=СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
Сообщить("Ошибка выполнения запроса");
СтатусВозврата(0);
Возврат;
КонецЕсли;
//и дальше по нужному вам алгоритму... я не знаю что у вас там задумано, ну пусть, например так:
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
СредняяСуммаОтпускных=0;
Запрос.ВНачалоВыборки();
Если Запрос.Получить(Сотрудник)=1 Тогда
СредняяСуммаОтпускных=Запрос.СуммаСреднее;
КонецЕсли;
....
Вариант "б" (два запроса, цель примера - показать как надо использовать вызовы функций с передачей параметров, а то у вас недопонимание по этому вопросу, отсюда и странное решение по созданию глобальной переменной):
Процедура ОбработкаПроведения()
//формируем и выполянем запрос на выборку сотрудников, правда непонятно зачем это надо, так как они в табличной части документа, вероятно и так уже перечислены, напишем запрос на выборку всех элементов, которые есть в справочнике для примера
ТекстЗапроса="ВПСотрудник=Справочник.Сотрудники.ТекущийЭлемент;
|Группировка ВПСотрудник без групп без упорядочивания;"
Запрос=СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
Сообщить("Ошибка выполнения запроса");
СтатусВозврата(0);
Возврат;
КонецЕсли;
НачДата=ДобавитьМесяц(НачМесяца(ДатаДок),-3)
КонДата=НачМесяца(ДатаДок)-1;
Пока Запрос.Группировка("ВПСотрудник")=1 Цикл
СредняяСуммаОтпускных=СформироватьСредний(Запрос.ВПСотрудник,НачДата,КонДата);
...
при этом может быть в глобальном модуле (только неполянтно зачем), либо прямо в модуле проведения нашего документа чуть выше имеется функция:
Функция СформироватьСредний(НужныйСотрудник,НачДата,КонДата)
ТекстЗапроса="Период с НачДата По КонДата;
|ОбрабатыватьДокументы Проведенные;
|ВПСотрудник=Документ.НачислениеОтпускных.Сотрудник;
|НачисленнаяСумма=Документ.НачислениеОтпускных.Сумма;
|Условие(ВПСотрудник = НужныйСотрудник);
|Функция СуммаСреднее=Среднее(НачисленнаяСумма);
|Группировка ВПСотрудник без групп без упорядочивания;";
Запрос=СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса)=1 Тогда
Возврат(Запрос.СуммаСреднее);
Иначе
Возврат(0);
КонецЕсли;
КонецФункции
> сумма объявлена не правильно, тогда как?
да нет, правильно, но я бы так не стал.
"
24.06.2009
13:38
#37
спасибо вам огромное что пытаетесь мне помочь, просто что я делаю это палка о двух концах, но ладно не будем об этом, обьясню что я делаю: я пишу отчет в самодельной конфигурации, который берёт начальные данные за месяц по всем сотрудникам(мы указываем период в диалоге) из документов,например за июнь он должен посчитать оплату по табелю и т.д.это все работает замечательно, но для расчета отпускных надо среднюю сумму взятую за три месяца из документа НачислениеОтпускных,(я его назвала не много не так и теперь все запутались, в нем отражается фиксированная сумма по сдельной оплате),и в этой средней я запуталась, мне помогли вытащить из глобальника эту переменную но она идет одна для всех и по одному документу.
Читают тему
(гостей: 1)