helpf.pro
Регистрация

v8.2 УП: Как правильно записать, чтобы находить заданный ВР?

chainik
19.12.2013 15:22Прочитано: 3396
Из регистра сведений "Плановые начисления" необходимо выбрать тех люей, у которых есть ВР "Компенсация за молоко"
СокрЛП(РегистрыСведений.ПлановыеНачисленияРаботниковОрганизаций.ПолучитьПоследнее(ВыборкаДляШапки.ПериодРегистрации,Новый Структура("Сотрудник", ВыборкаРаботники.Сотрудник)).ВидРасчета)="Компенсация за спецмолоко" Тогда
....
КонецЕсли;
Попадают сотрудники, у которых этот ВР стоит последней строкой. Если же последней строкой строит "Оплата по окладу" и др. то сотрудник по условию не попадает. Как правильно записать, чтобы находить заданный ВР?
Изменено 20.12.13 15:55:49
Yandex
Возможно, вас также заинтересует
Реклама на портале
E_Migachev
19.12.2013 17:23Ответ № 1
(0) chainik, сделайте лучше запросом!
chainik
20.12.2013 08:57Ответ № 2
Запросы-это моя слабость. Тем более запрос большой, боюсь запутаться. Сделала следующим образом:
ВыбрРасчет=РегистрыСведений.ПлановыеНачисленияРаботниковОрганизаций.Выбрать(ВыборкаДляШапки.ПериодРегистрации,Новый Структура("Сотрудник", ВыборкаРаботники.Сотрудник));
Пока ВыбрРасчет.Следующий() Цикл
Если ВыбрРасчет.ВидРасчета="Компенсация за спецмолоко" Тогда
ТабДокумент.Вывести(ОбластьДанныхСтрока);

КонецЕсли;
КонецЦикла;
Но программа выдает ошибку:


ВыбрРасчет=РегистрыСведений.ПлановыеНачисленияРаботниковОрганизаций.Выбрать(ВыборкаДляШапки.ПериодРегистрации,Новый Структура("Сотрудник", ВыборкаРаботники.Сотрудник));
по причине:
Несоответствие типов (Параметр номер ""2"")
Не пойму ошибку.
oreol100
20.12.2013 09:15Ответ № 3
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Организация", ВашаОрганизация);
Запрос.УстановитьПараметр("ВидРасчета", ПланыВидовРасчета.ДополнительныеНачисленияОрганизаций.Компенсация за молоко);
Запрос.УстановитьПараметр("Дата", '00010101000000');
Запрос.Текст =
"ВЫБРАТЬ
ПлановыеНачисленияРаботниковОрганизаций.Сотрудник
ИЗ
РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций КАК ПлановыеНачисленияРаботниковОрганизаций
ГДЕ
ПлановыеНачисленияРаботниковОрганизаций.Организация = &Организация
И ПлановыеНачисленияРаботниковОрганизаций.ВидРасчета = &ВидРасчета
И ПлановыеНачисленияРаботниковОрганизаций.Сотрудник.ДатаУвольнения <> &Дата
АВТОУПОРЯДОЧИВАНИЕ"

Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следущий() Цикл
.....
КонецЦикла;
Изменено 20.12.13 09:33:36
chainik
20.12.2013 11:09Ответ № 4
Спасибо. Только этот номер не проходит.
ПланыВидовРасчета.ДополнительныеНачисленияОрганизаций.Компенсация за молоко ????????
При отладке ПланыВидовРасчета.ОсновныеНачисленияОрганизаций эту компенсацию не находит. Записала с.о.:
Запрос.УстановитьПараметр("ВидРасчета", ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоКоду("72м"));

Но это условие не выполняется. Выбираются все сотрудники, даже те, у которых этой компенсации нет
oreol100
20.12.2013 12:02Ответ № 5
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Организация", ВашаОрганизация);
Запрос.УстановитьПараметр("ВидРасчета", ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоКоду("72м");
Запрос.УстановитьПараметр("Дата", '00010101000000');
Запрос.УстановитьПараметр("Действие", Перечисления.ВидыДействияСНачислением.Прекратить);
Запрос.Текст = "ВЫБРАТЬ
| ПлановыеНачисленияРаботниковОрганизаций.Сотрудник
|ИЗ
| РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций КАК ПлановыеНачисленияРаботниковОрганизаций
|ГДЕ
| ПлановыеНачисленияРаботниковОрганизаций.Организация = &Организация
| И ПлановыеНачисленияРаботниковОрганизаций.ВидРасчета = &ВидРасчета
| И ПлановыеНачисленияРаботниковОрганизаций.Сотрудник.ДатаУвольнения = &Дата
| И ПлановыеНачисленияРаботниковОрганизаций.Действие <> &Действие
|АВТОУПОРЯДОЧИВАНИЕ"

Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следущий() Цикл
.....
КонецЦикла;

Попробуйте так. Может у тех сотрудников когда-то планировалась эта доплата, а потом ее сняли. А вообще я бы выбирал из регистра расчета Основные начисления работников организаций.
chainik
20.12.2013 12:54Ответ № 6
Попробую, но за результат не уверена. Дело в том, что очень многие работники в течении месяца переводчтся на оплату по среднему, и действие "прекратить" повторяется несколько раз для оплаты по производственным нарядам. В этом вся трудность. За месяц у одного работника имеется более 10 строк в регистре сведений, и только где-то в начале года стоит одна строка "Компенсация...".
Строка:
Запрос.УстановитьПараметр("ВидРасчета", ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоКоду("72м")
определяется всегда у любого сотрудника. Возможно, в ней ошибка.
chainik
20.12.2013 12:55Ответ № 7
Вот поэтому при обходе строк документа "Табель ..." я и планировала обращаться непосредственно к регистру, не используя запрос.
oreol100
20.12.2013 13:13Ответ № 8
Попробуйте поставить точку останова в Конфигураторе и посмотреть какое значение возвращает запись - ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоКоду("72м").
Запрос точно работает. Проверял.
chainik
20.12.2013 14:50Ответ № 9
Я уже совсем затупила. Возможно, неправильно составила цикл.
Пока ВыборкаРаботники.Следующий() Цикл // обход по строкам документа (документСсылка=Табель-текущий документ)

Пока Результат.Следующий() Цикл // обход по строкам регистра
Если ВыборкаРаботники.Сотрудник=Результат.Сотрудник
ТабДокумент.Вывести(ОбластьДанныхСтрока)
КонецЕсли;
КонецЦикла;
КонецЦикла;

В итоге данную секцию не выводит
chainik
20.12.2013 14:57Ответ № 10
Если рассматривать региср расчета, то только предыдущий период. В текущий период данные попадут только после документа "Начисление зарплаты", а печ.форма нужна уже в табеле текущего периода.
oreol100
20.12.2013 16:27Ответ № 11
Жесть. )
Тогда можно поступить по другому.
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Организация", Объект.Организация);
Запрос.УстановитьПараметр("ВидРасчета", ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоКоду("72м");
Для Каждого Строка ИЗ Объект.ОтработанноеВремя Цикл
Запрос.УстановитьПараметр("Сотрудник", Строка.Сотрудник);
Запрос.Текст = "ВЫБРАТЬ
| ПлановыеНачисленияРаботниковОрганизаций.Сотрудник
|ИЗ
| РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций КАК ПлановыеНачисленияРаботниковОрганизаций
|ГДЕ
| ПлановыеНачисленияРаботниковОрганизаций.Организация = &Организация
| И ПлановыеНачисленияРаботниковОрганизаций.ВидРасчета = &ВидРасчета
| И ПлановыеНачисленияРаботниковОрганизаций.Сотрудник = &Сотрудник";
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Количество() <> 0 Тогда
ТабДокумент.Вывести(ОбластьДанныхСтрока);
КонецЕсли;
КонецЦикла;
Изменено 20.12.13 16:31:08
chainik
23.12.2013 12:38Ответ № 12
Что-то стало получаться. Сделала след.обр:
Пока Результат.Следующий() Цикл
Если ВыборкаРаботники.Сотрудник=Результат.Сотрудник И Результат.ВидРасчета=ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоКоду("72м") Тогда
ТабДокумент.Вывести(ОбластьДанныхСтрока);
Иначе
КонецЕсли;
КонецЦикла;
Но опять новая проблема. У сотрудника может быть несколько строчек с этим начислением. Вот и выводится столько раз, сколько строк в регистре. Как вывести ОДНУ ПОСЛЕДНЮЮ (именно этого начисления) строку. Но...в самом регистре последней строкой может стоять другое начисление. Полный капец.)
oreol100
23.12.2013 16:00Ответ № 13
Сделай отбор по периоду:
И ПлановыеНачисленияРаботниковОрганизаций.Период МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаДокумента, МЕСЯЦ) И КОНЕЦПЕРИОДА(&ДатаДокумента, МЕСЯЦ)

Параметр &ДатаЛокумента, Объект.Дата.

Еще можно в запросе поставить группировку по виду расчета
Изменено 23.12.13 16:02:58
oreol100
23.12.2013 16:08Ответ № 14
Вообще конечно не совсем понятно при чем здесь Табель учета отр.времени и плановые начисления сотрудников. Просто сложно что-либо подсказать, когда не видишь всей картины задачи.
chainik
23.12.2013 16:10Ответ № 15
Не пройдет. Документ текущего месяца, а последние данные регистра могут быть в любом месяце. Вообще задание такое:
Табеля на предприятии заполняют на местах (в цехах, отделах). У пользователей есть только доступ к документу "Табель..." своего подразделения. В цехах многие рабочие получают за вредность компенсацию за молоко. В конце месяца на основании текущего табеля необходимо вывести документ со списком работников, отработанными сменами и суммой к получению, чтобы каждый смог расписаться под своими суммами. Табель нужен в каждом месяце, а плановое начисление на компенсацию введено в разное время. Поэтому сравнивать даты регистра с датой документа недопустимо. А вот как выбрать максимальную дату строки регистра? Саму программу написала, а вот нюансы не могу откорректировать из-за особенностей заполнения регистра.
oreol100
23.12.2013 16:17Ответ № 16
Значит переделай запрос:
ВЫБРАТЬ
ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник
ИЗ
РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций.СрезПоследних(
&Дата,
Организация = &Организация
И ВидРасчета = &ВидРасчета
И Сотрудник = &Сотрудник) КАК ПлановыеНачисленияРаботниковОрганизацийСрезПоследних

где &Дата это ТекущаяДата()
Изменено 23.12.13 16:18:58
Jonsony
23.12.2013 16:40Ответ № 17
(15) chainik, ну почем уже не допустимо?
судя по вашему желанию (сочтём это за ТЗ) вы хотите по итогам месяца получить список работников которые имеют право на компенсацию молоком, работавшие в этом месяце и объём этой компенсации в размере отработанного?

в принципе можно по данным табеля это получить, из табеля получаем список работников, просеиваем оставляя тех у кого назначена компенсация и выводим нужную таблицу
chainik
15.01.2014 11:23Ответ № 18
Не так все просто, как кажется. В основом все сделано, но....опять непредвиденные обстоятельства из-за работы по среднему. В табеле это увидеть нельзя, только из регистра. При подсчете количества отработанных дней необходимо убрать все дни, когда сорудник работал по среднему. Поэтому поледний запрос не проходит (СрезПоследних неприменим). В 7-ке я бы сделала просто: Группировка по строкам, цикл по заданному условию, внутри которого рассчитать дни, в конце цикла подсчет дней. В 8-ке совсем иначе.
Jonsony
15.01.2014 11:32Ответ № 19
(18) chainik, а запрос к регистру с условием?
chainik
15.01.2014 16:02Ответ № 20
Вот примерно как может выглядеть запись в регистре на сотрудника за месяц:
Бочаров Виталий Викторович 01.10.2013 Прекратить Оплата по производственным нарядам 02.10.2013 Начать Оплата по производственным нарядам
Бочаров Виталий Викторович 08.10.2013 Прекратить Оплата по производственным нарядам 09.10.2013 Начать Оплата по производственным нарядам
Бочаров Виталий Викторович 08.10.2013 Прекратить Доплата за ночные часы 09.10.2013 Начать
Бочаров Виталий Викторович 09.10.2013 Прекратить Оплата по производственным нарядам 10.10.2013 Начать Оплата по производственным нарядам
Бочаров Виталий Викторович 09.10.2013 Прекратить Доплата за ночные часы 10.10.2013 Начать
Бочаров Виталий Викторович 11.10.2013 Прекратить Оплата по производственным нарядам 12.10.2013 Начать Оплата по производственным нарядам
Бочаров Виталий Викторович 11.10.2013 Прекратить Доплата за ночные часы 12.10.2013 Начать
Бочаров Виталий Викторович 15.10.2013 Прекратить Оплата по производственным нарядам 16.10.2013 Начать Оплата по производственным нарядам
Бочаров Виталий Викторович 16.10.2013 Прекратить Оплата по производственным нарядам 17.10.2013 Начать Оплата по производственным нарядам
Бочаров Виталий Викторович 21.10.2013 Прекратить Оплата по производственным нарядам 22.10.2013 Начать Оплата по производственным нарядам
Бочаров Виталий Викторович 21.10.2013 Прекратить Доплата за ночные часы 22.10.2013 Начать
Бочаров Виталий Викторович 22.10.2013 Прекратить Оплата по производственным нарядам 23.10.2013 Начать Оплата по производственным нарядам
Бочаров Виталий Викторович 22.10.2013 Прекратить Доплата за ночные часы 23.10.2013 Начать
Бочаров Виталий Викторович 29.10.2013 Прекратить Оплата по производственным нарядам 30.10.2013 Начать Оплата по производственным нарядам


И это еще не самая большая запись. ОК еще не вводил ВР"Компенсация за молоко" прекратить-начать. У некоторых и такие записи присутствуют. Вот из этого всего необходимо выбрать реально работающие дни. И как без условия? Неважно, где его ставить: в запросе или в цикле. Но без него никак. Даже не одно будет.
Jonsony
15.01.2014 16:43Ответ № 21
(20) chainik, ну как сказать "не важно" запрос уже вернёт данные с выбранным условием и их циклом пробежишь, а в цикле надо все данные мутузить, объём разный весьма
Подсказка: Вы получили ответ на свой вопрос - закройте вопрос!
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.