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

24.06.2009
13:38
#37
спасибо вам огромное что пытаетесь мне помочь, просто что я делаю это палка о двух концах, но ладно не будем об этом, обьясню что я делаю: я пишу отчет в самодельной конфигурации, который берёт начальные данные за месяц по всем сотрудникам(мы указываем период в диалоге) из документов,например за июнь он должен посчитать оплату по табелю и т.д.это все работает замечательно, но для расчета отпускных надо среднюю сумму взятую за три месяца из документа НачислениеОтпускных,(я его назвала не много не так и теперь все запутались, в нем отражается фиксированная сумма по сдельной оплате),и в этой средней я запуталась, мне помогли вытащить из глобальника эту переменную но она идет одна для всех и по одному документу.
Читают тему
(гостей: 1)