вывод количества рабочих часов из регистра сведений в документ

  • Автор темы aimp
  • Дата начала

Darlock

Well-known member
04.01.2008
560
1
#22
Вариант номер Раз:

Если платформа 8.1 и умеет работать с пакетами запросов

Код:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|	ЗарплатаЗарплата.Ссылка,
|	ЗарплатаЗарплата.Сотрудник,
|	ЗарплатаЗарплата.Сотрудник.График КАК График,
|	ЗарплатаЗарплата.ОтЧисла,
|	ЗарплатаЗарплата.ДоЧисла,
|	ЗарплатаЗарплата.ТарифнаяСтавка
|ПОМЕСТИТЬ ТЧСотрудники
|ИЗ
|	Документ.Зарплата.Зарплата КАК ЗарплатаЗарплата
|ГДЕ
|	ЗарплатаЗарплата.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
|	ЗарплатаЗарплата.Сотрудник,
|	ЗарплатаЗарплата.Сотрудник.График,
|	ЗарплатаЗарплата.Ссылка,
|	ЗарплатаЗарплата.ОтЧисла,
|	ЗарплатаЗарплата.ДоЧисла,
|	ЗарплатаЗарплата.ТарифнаяСтавка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	СУММА(ГрафикиРаботы.Часы) КАК КоличествоРабочихЧасов,
|	ТЧСотрудники.Сотрудник,
|	ТЧСотрудники.ОтЧисла,
|	ТЧСотрудники.ДоЧисла,
|	ТЧСотрудники.График КАК ГрафикРаботы,
|	ТЧСотрудники.ТарифнаяСтавка
|ИЗ
|	ТЧСотрудники КАК ТЧСотрудники
|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
|		ПО ТЧСотрудники.График = ГрафикиРаботы.ГрафикиРаботыСотрудников
|ГДЕ
|	ГрафикиРаботы.Дата МЕЖДУ ТЧСотрудники.ОтЧисла И ТЧСотрудники.ДоЧисла
|
|СГРУППИРОВАТЬ ПО
|	ТЧСотрудники.Сотрудник,
|	ТЧСотрудники.ОтЧисла,
|	ТЧСотрудники.ДоЧисла,
|	ТЧСотрудники.График,
|	ТЧСотрудники.ТарифнаяСтавка";
Вариант Номер 2:

И в 8.0 должен сработать

Код:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|	СУММА(ГрафикиРаботы.Часы) КАК КоличествоРабочихЧасов,
|	ВложенныйЗапрос.Сотрудник,
|	ВложенныйЗапрос.ОтЧисла,
|	ВложенныйЗапрос.ДоЧисла,
|	ВложенныйЗапрос.График КАК ГрафикРаботы,
|	ВложенныйЗапрос.ТарифнаяСтавка
|ИЗ
|	(ВЫБРАТЬ
|		ЗарплатаЗарплата.Ссылка КАК Ссылка,
|		ЗарплатаЗарплата.Сотрудник КАК Сотрудник,
|		ЗарплатаЗарплата.Сотрудник.График КАК График,
|		ЗарплатаЗарплата.ОтЧисла КАК ОтЧисла,
|		ЗарплатаЗарплата.ДоЧисла КАК ДоЧисла,
|		ЗарплатаЗарплата.ТарифнаяСтавка КАК ТарифнаяСтавка
|	ИЗ
|		Документ.Зарплата.Зарплата КАК ЗарплатаЗарплата
|	ГДЕ
|		ЗарплатаЗарплата.Ссылка = &Ссылка
|	
|	СГРУППИРОВАТЬ ПО
|		ЗарплатаЗарплата.Сотрудник,
|		ЗарплатаЗарплата.Сотрудник.График,
|		ЗарплатаЗарплата.Ссылка,
|		ЗарплатаЗарплата.ОтЧисла,
|		ЗарплатаЗарплата.ДоЧисла,
|		ЗарплатаЗарплата.ТарифнаяСтавка) КАК ВложенныйЗапрос
|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
|		ПО ВложенныйЗапрос.График = ГрафикиРаботы.ГрафикиРаботыСотрудников
|ГДЕ
|	ГрафикиРаботы.Дата МЕЖДУ ВложенныйЗапрос.ОтЧисла И ВложенныйЗапрос.ДоЧисла
|
|СГРУППИРОВАТЬ ПО
|	ВложенныйЗапрос.Сотрудник,
|	ВложенныйЗапрос.ОтЧисла,
|	ВложенныйЗапрос.ДоЧисла,
|	ВложенныйЗапрос.График,
|	ВложенныйЗапрос.ТарифнаяСтавка";
После всего этого

Код:
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить();
Зарплата.Очистить();
Зарплата.Загрузить(Результат.Выгрузить());
 
A
#23
я достал версию 8.1
К сожалению не получается, вводил и то и то, ошибок нету, но и в документе поля не заполняются
В 8.1 не могу запустить проект, так как базу не получается переконвертировать, может из за того что учебная
 

Darlock

Well-known member
04.01.2008
560
1
#24
нет. чтоб сконвертировать БД необходимо в конфигураторе открывать БД
 
A
#25
этот код нало вставлять в модуль документа в процедуру Процедура ОбработкаПроведения(Отказ, Режим)?

переконвертировал, но ничего не изменилось
 

Darlock

Well-known member
04.01.2008
560
1
#26
этот код нало вставлять в модуль документа в процедуру Процедура ОбработкаПроведения(Отказ, Режим)?

переконвертировал, но ничего не изменилось
Можно вставлять куда угодно.

Я оставил там где у вас было. при проведении заполняется колонка "РабочихЧасов", как-то так она называется
 

Вложения

A
#27
понятно, заполнение поля происходи при записи или проведении. Но теперь из за этого, или не из-за это, но все другие операции вычислени не проходят из-за того, что другие поля это поле считают пустым, и по этому умножая на пустоту в других полях пустота

пытаюсь сделать так, чтобы график работы сотрудника загружался автоматически, как сделать так, чтобы вбить значение Реквизит.График
СтрокаТабличнойЧасти.ГрафикРаботы = Справочники.Сотрудники.НайтиПоРеквизиту(.График);
 

Darlock

Well-known member
04.01.2008
560
1
#28
пытаюсь сделать так, чтобы график работы сотрудника загружался автоматически, как сделать так, чтобы вбить значение Реквизит.График
СтрокаТабличнойЧасти.ГрафикРаботы = Справочники.Сотрудники.НайтиПоРеквизиту(.График);
все расчеты в запрос вставь и вынеси из "проведения" в кнопку, "Рассчитать"
 
A
#29
вот код в форме документа

Код:
Процедура ЗарплатаСотрудникПриИзменении(Элемент)
СтрокаТабличнойЧасти = ЭлементыФормы.Зарплата.ТекущиеДанные;
СтрокаТабличнойЧасти.ТарифнаяСтавка = Зарплата(Дата, Элемент.Значение);
РассчитатьКВыплате(СтрокаТабличнойЧасти);

КонецПроцедуры


Процедура Кнопка1Нажатие(Элемент)




Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|	ЗарплатаЗарплата.Ссылка,
|	ЗарплатаЗарплата.Сотрудник,
|	ЗарплатаЗарплата.Сотрудник.График КАК График,
|	ЗарплатаЗарплата.ОтЧисла,
|	ЗарплатаЗарплата.ДоЧисла,
|	ЗарплатаЗарплата.ТарифнаяСтавка
|ПОМЕСТИТЬ ТЧСотрудники
|ИЗ
|	Документ.Зарплата.Зарплата КАК ЗарплатаЗарплата
|ГДЕ
|	ЗарплатаЗарплата.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
|	ЗарплатаЗарплата.Сотрудник,
|	ЗарплатаЗарплата.Сотрудник.График,
|	ЗарплатаЗарплата.Ссылка,
|	ЗарплатаЗарплата.ОтЧисла,
|	ЗарплатаЗарплата.ДоЧисла,
|	ЗарплатаЗарплата.ТарифнаяСтавка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	СУММА(ГрафикиРаботы.Часы) КАК КоличествоРабочихЧасов,
|	ТЧСотрудники.Сотрудник,
|	ТЧСотрудники.ОтЧисла,
|	ТЧСотрудники.ДоЧисла,
|	ТЧСотрудники.График КАК ГрафикРаботы,
|	ТЧСотрудники.ТарифнаяСтавка
|ИЗ
|	ТЧСотрудники КАК ТЧСотрудники
|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
|		ПО ТЧСотрудники.График = ГрафикиРаботы.ГрафикиРаботыСотрудников
|ГДЕ
|	ГрафикиРаботы.Дата МЕЖДУ ТЧСотрудники.ОтЧисла И ТЧСотрудники.ДоЧисла
|
|СГРУППИРОВАТЬ ПО
|	ТЧСотрудники.Сотрудник,
|	ТЧСотрудники.ОтЧисла,
|	ТЧСотрудники.ДоЧисла,
|	ТЧСотрудники.График,
|	ТЧСотрудники.ТарифнаяСтавка";




Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить();
Зарплата.Очистить();
Зарплата.Загрузить(Результат.Выгрузить());


СтрокаТабличнойЧасти = ЭлементыФормы.Зарплата.ТекущиеДанные;
СтрокаТабличнойЧасти.Начисленно = СтрокаТабличнойЧасти.ТарифнаяСтавка * СтрокаТабличнойЧасти.КоличествоРабочихЧасов; //<------------Ошибка----
РассчитатьКВыплате(СтрокаТабличнойЧасти);

КонецПроцедуры
Стрелочкой обозначена строка с ошибкой
Значение не является значением объектного типа (Начисленно)
СтрокаТабличнойЧасти.Начисленно = СтрокаТабличнойЧасти.ТарифнаяСтавка * СтрокаТабличнойЧасти.КоличествоРабочихЧасов;
 

Darlock

Well-known member
04.01.2008
560
1
#30
СтрокаТабличнойЧасти = ЭлементыФормы.Зарплата.ТекущиеДанные; СтрокаТабличнойЧасти.Начисленно = СтрокаТабличнойЧасти.ТарифнаяСтавка * СтрокаТабличнойЧасти.КоличествоРабочихЧасов; //<------------Ошибка---- РассчитатьКВыплате(СтрокаТабличнойЧасти);
Убери "ЭлементыФормы"
 
A
#31
убрал, потом стал ругаться на СтрокаТабличнойЧасти
её убрал, поменял на зарплата
потом стал ругаться на РассчитатьКВыплате(СтрокаТабличнойЧасти);
и это убрал, потом стал ругаться так Поле объекта не обнаружено (Начисленно)
Зарплата.Начисленно = Зарплата.ТарифнаяСтавка * Зарплата.КоличествоРабочихЧасов;
 

Darlock

Well-known member
04.01.2008
560
1
#32
Слушай, открой секрет. Отладчиком пользовался?

1) Смени имя табличной части;
2) Измени имя процедуры (Зарплата)
3) ЗАПОМНИ: Никогда не давай одинаковые имена разным сущностям в коде

Есть правило в программировании в 1С: Никогда не давать имена своих переменных похожих на платформенные
 
A
#33
Код:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|	ЗарплатаСотрудниковЗарплата.Ссылка,
|	ЗарплатаСотрудниковЗарплата.Сотрудник,
|	ЗарплатаСотрудниковЗарплата.Сотрудник.График КАК График,
|	ЗарплатаСотрудниковЗарплата.ОтЧисла,
|	ЗарплатаСотрудниковЗарплата.ДоЧисла,
|	ЗарплатаСотрудниковЗарплата.ТарифнаяСтавка
|ПОМЕСТИТЬ ТЧСотрудники
|ИЗ
|	Документ.ЗарплатаСотрудников.Зарплата КАК ЗарплатаСотрудниковЗарплата
|ГДЕ
|	ЗарплатаСотрудниковЗарплата.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
|	ЗарплатаСотрудниковЗарплата.Сотрудник,
|	ЗарплатаСотрудниковЗарплата.Сотрудник.График,
|	ЗарплатаСотрудниковЗарплата.Ссылка,
|	ЗарплатаСотрудниковЗарплата.ОтЧисла,
|	ЗарплатаСотрудниковЗарплата.ДоЧисла,
|	ЗарплатаСотрудниковЗарплата.ТарифнаяСтавка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	СУММА(ГрафикиРаботы.Часы) КАК КоличествоРабочихЧасов,
|	ТЧСотрудники.Сотрудник,
|	ТЧСотрудники.ОтЧисла,
|	ТЧСотрудники.ДоЧисла,
|	ТЧСотрудники.График КАК ГрафикРаботы,
|	ТЧСотрудники.ТарифнаяСтавка
|ИЗ
|	ТЧСотрудники КАК ТЧСотрудники
|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
|		ПО ТЧСотрудники.График = ГрафикиРаботы.ГрафикиРаботыСотрудников
|ГДЕ
|	ГрафикиРаботы.Дата МЕЖДУ ТЧСотрудники.ОтЧисла И ТЧСотрудники.ДоЧисла
|
|СГРУППИРОВАТЬ ПО
|	ТЧСотрудники.Сотрудник,
|	ТЧСотрудники.ОтЧисла,
|	ТЧСотрудники.ДоЧисла,
|	ТЧСотрудники.График,
|	ТЧСотрудники.ТарифнаяСтавка";




Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить();
Зарплата.Очистить();
Зарплата.Загрузить(Результат.Выгрузить());


СтрокаТабличнойЧасти = Зарплата.ТекущиеДанные; <-------------------------------------суда ругается----------
СтрокаТабличнойЧасти.Начисленно = СтрокаТабличнойЧасти.ТарифнаяСтавка * СтрокаТабличнойЧасти.КоличествоРабочихЧасов;
РассчитатьКВыплате(СтрокаТабличнойЧасти);
я переименовал Название документа на ЗарплатаСотрудников

он ТекущиеДанные за поле принимает
 

Darlock

Well-known member
04.01.2008
560
1
#34
у тебя функция есть которая зовется "Зарплата" или ее переименуй или табличную часть переименуй
 
A
#35
переименовал функцию

Код:
Процедура ЗарплатаСотрудникПриИзменении(Элемент)
СтрокаТабличнойЧасти = ЭлементыФормы.Зарплата.ТекущиеДанные;
СтрокаТабличнойЧасти.ТарифнаяСтавка = РасчётЗарплата(Дата, Элемент.Значение);
РассчитатьКВыплате(СтрокаТабличнойЧасти);

КонецПроцедуры

Процедура ЗарплатаКоличествоРабочихЧасовПриИзменении(Элемент)
СтрокаТабличнойЧасти = ЭлементыФормы.Зарплата.ТекущиеДанные;
РассчитатьКВыплате(СтрокаТабличнойЧасти);

КонецПроцедуры


Процедура Кнопка1Нажатие(Элемент)

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|	ЗарплатаСотрудниковЗарплата.Ссылка,
|	ЗарплатаСотрудниковЗарплата.Сотрудник,
|	ЗарплатаСотрудниковЗарплата.Сотрудник.График КАК График,
|	ЗарплатаСотрудниковЗарплата.ОтЧисла,
|	ЗарплатаСотрудниковЗарплата.ДоЧисла,
|	ЗарплатаСотрудниковЗарплата.ТарифнаяСтавка
|ПОМЕСТИТЬ ТЧСотрудники
|ИЗ
|	Документ.ЗарплатаСотрудников.Зарплата КАК ЗарплатаСотрудниковЗарплата
|ГДЕ
|	ЗарплатаСотрудниковЗарплата.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
|	ЗарплатаСотрудниковЗарплата.Сотрудник,
|	ЗарплатаСотрудниковЗарплата.Сотрудник.График,
|	ЗарплатаСотрудниковЗарплата.Ссылка,
|	ЗарплатаСотрудниковЗарплата.ОтЧисла,
|	ЗарплатаСотрудниковЗарплата.ДоЧисла,
|	ЗарплатаСотрудниковЗарплата.ТарифнаяСтавка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	СУММА(ГрафикиРаботы.Часы) КАК КоличествоРабочихЧасов,
|	ТЧСотрудники.Сотрудник,
|	ТЧСотрудники.ОтЧисла,
|	ТЧСотрудники.ДоЧисла,
|	ТЧСотрудники.График КАК ГрафикРаботы,
|	ТЧСотрудники.ТарифнаяСтавка
|ИЗ
|	ТЧСотрудники КАК ТЧСотрудники
|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
|		ПО ТЧСотрудники.График = ГрафикиРаботы.ГрафикиРаботыСотрудников
|ГДЕ
|	ГрафикиРаботы.Дата МЕЖДУ ТЧСотрудники.ОтЧисла И ТЧСотрудники.ДоЧисла
|
|СГРУППИРОВАТЬ ПО
|	ТЧСотрудники.Сотрудник,
|	ТЧСотрудники.ОтЧисла,
|	ТЧСотрудники.ДоЧисла,
|	ТЧСотрудники.График,
|	ТЧСотрудники.ТарифнаяСтавка";




Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить();
Зарплата.Очистить();
Зарплата.Загрузить(Результат.Выгрузить());

СтрокаТабличнойЧасти = РасчётЗарплата.ТекущиеДанные;
СтрокаТабличнойЧасти.Начисленно = СтрокаТабличнойЧасти.ТарифнаяСтавка * СтрокаТабличнойЧасти.КоличествоРабочихЧасов; //<------------Ошибка----
РассчитатьКВыплате(СтрокаТабличнойЧасти); 

КонецПроцедуры
если я оставляю ЭлементыФормы Ошибка: значение не является значением объектного типа (Начисленно)
Если убираю, то на ТекущиеДанные
 

Darlock

Well-known member
04.01.2008
560
1
#36
СтрокаТабличнойЧасти = Зарплата.ТекущиеДанные;
СтрокаТабличнойЧасти.Начисленно = СтрокаТабличнойЧасти.ТарифнаяСтавка * СтрокаТабличнойЧасти.КоличествоРабочихЧасов;
РассчитатьКВыплате(СтрокаТабличнойЧасти);
 
A
#37
я так уже пробовал, он текущие данные за поле принимает: Поле объекта не обнаружено (ТекущиеДанные)
я даже РасчётЗарплата вместо зарплаты вставлял, ну и по разному, просто на шару, комбинации которые могли бы быть, не получается
 

Darlock

Well-known member
04.01.2008
560
1
#38
я так уже пробовал, он текущие данные за поле принимает: Поле объекта не обнаружено (ТекущиеДанные)
я даже РасчётЗарплата вместо зарплаты вставлял, ну и по разному, просто на шару, комбинации которые могли бы быть, не получается
На шару не надо. выкладывай БД. через час-полтора смогу посмотреть
 

Darlock

Well-known member
04.01.2008
560
1
#40
СтрокаТабличнойЧасти = РасчётЗарплата.ТекущиеДанные;
СтрокаТабличнойЧасти.Начисленно = СтрокаТабличнойЧасти.ТарифнаяСтавка * СтрокаТабличнойЧасти.КоличествоРабочихЧасов; //<------------Ошибка----
РассчитатьКВыплате(СтрокаТабличнойЧасти);
Сбил с толку строкой "РасчётЗарплата.ТекущиеДанные;"

Заключи в цикл:
Код:
Для Каждого СтрокаТабличнойЧасти Из Зарплата Цикл
СтрокаТабличнойЧасти.Начисленно = СтрокаТабличнойЧасти.ТарифнаяСтавка * СтрокаТабличнойЧасти.КоличествоРабочихЧасов; РассчитатьКВыплате(СтрокаТабличнойЧасти);
КонецЦикла;