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

Кол-во рабочих дней за определенный месяц

Автор JoeButcher, 06 сен 2013, 13:02

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

JoeButcher

Доброго времени суток! Подскажите пожалуйста, как для конкретного работника в запросе получить количество дней, которое он отработал в заданном месяце? Заранее спасибо!


конфигурация: ЗиУП 8.2, редакция 2.5

LordWizard

Регистр расчета "ОсновныеНачисленияРаботниковОрганизаций" - Измерения: Сотрудник, Ресуры: (ОтработаноДней, ОтработаноЧасов) тут наверное забери.
Правильно ведите учет или пишите программы и вам воздастся!...

(Кстати - кнопочку Сказать Спасибо - никто не отменял)

JoeButcher

Цитата: LordWizard от 06 сен 2013, 13:21
Регистр расчета "ОсновныеНачисленияРаботниковОрганизаций" - Измерения: Сотрудник, Ресуры: (ОтработаноДней, ОтработаноЧасов) тут наверное забери.
Благодарю, пошел смотреть :)

JoeButcher

Доброго времени суток! Подскажите пожалуйста, в чем может быть ошибка.
В виде функции оформил следующий запрос:
Функция ЗапросПоСменам()
ЗапросПоСменам = Новый Запрос();
ТекстЗапроса = "
|ВЫБРАТЬ
|ОсновныеНачисленияРаботниковОрганизаций.ФизЛицо.Наименование КАК ФизЛицо,
|ОсновныеНачисленияРаботниковОрганизаций.ОтработаноДней,
|ОсновныеНачисленияРаботниковОрганизаций.НормаДней,
|ОсновныеНачисленияРаботниковОрганизаций.БазовыйПериодНачало,
|ОсновныеНачисленияРаботниковОрганизаций.ГрафикРаботы.Наименование КАК ГрафикРаботы
|ИЗ
|РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК ОсновныеНачисленияРаботниковОрганизаций ";
ЗапросПоСменам.Текст = ТекстЗапроса;
Возврат ЗапросПоСменам.Выполнить();
КонецФункции


Далее, в процедуре формирования отчета, делаю выборку по запросу

ч = 0;
Результат = ЗапросПоСменам();
Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.Прямой);


Далее, пытаюсь поместить в созданные массивы значения кол-ва рабочих дней по норме и по факту, однако на выходе не получаю ничего. Значение "ч" после завершения цикла равно 0, следовательно по запросу не нашлось данных, удовлетворяющих условию, однако в Регистре ОсновныеНачисленияРаботниковОрганизаций есть данные по указанному работнику и с указанным значением "ТекДата"
Пока Выборка.Следующий() Цикл
Если (Выборка.ФизЛицо = Строка(ТекстРаботник))И(Выборка.БазовыйПериодНачало = ТекДата) Тогда
МассивСменФакт[ч] = Выборка.ОтработаноДней;
МассивСменНорма[ч] = Выборка.НормаДней;
ч = ч + 1;
КонецЕсли;
КонецЦикла;


Подскажите, пожалуйста, в чем может быть проблема? Заранее спасибо.

mixqn

1. запрос у вас вообще без каких-либо отборов, т.е. выбирается полностью весь регистр - это нормально? может быть следовало бы установить отбор по периоду (вероятно, текущий месяц) и работнику (особенно, учитывая, что именно эти 2 условия используются потом в цикле, то есть все данные запроса не нужны изначально, нужны только по определенному работнику за определенный период)?
2. почему физ.лицо ищите по наименованию? по ссылке надо искать.
3. чтобы получить массивы из колонок выборки запроса можно использовать методы Выгрузить() для результата запроса и затем ВыгрузитьКолонку() для колонки таблицы значений.
примерно так:
Результат = ЗапросПоСменам();
ТаблицаРезультата = Результат.Выгрузить();
МассивСменФакт = ТаблицаРезультата.ВыгрузитьКолонку("ОтработаноДней");
МассивСменНорма= ТаблицаРезультата.ВыгрузитьКолонку("НормаДней");

JoeButcher

Цитата: mixqn от 09 сен 2013, 08:13
1. запрос у вас вообще без каких-либо отборов, т.е. выбирается полностью весь регистр - это нормально? может быть следовало бы установить отбор по периоду (вероятно, текущий месяц) и работнику (особенно, учитывая, что именно эти 2 условия используются потом в цикле, то есть все данные запроса не нужны изначально, нужны только по определенному работнику за определенный период)?
2. почему физ.лицо ищите по наименованию? по ссылке надо искать.
3. чтобы получить массивы из колонок выборки запроса можно использовать методы Выгрузить() для результата запроса и затем ВыгрузитьКолонку() для колонки таблицы значений.
примерно так:
Результат = ЗапросПоСменам();
ТаблицаРезультата = Результат.Выгрузить();
МассивСменФакт = ТаблицаРезультата.ВыгрузитьКолонку("ОтработаноДней");
МассивСменНорма= ТаблицаРезультата.ВыгрузитьКолонку("НормаДней");


Большое спасибо! Насчет первого пункта - согласен, доработаю. Но, в данный момент, меня интересует, почему не находятся результаты запроса по условию. Из-за того, что я ищу сотрудника по наименованию, а не по ссылке?

mixqn

Цитата: JoeButcher от 09 сен 2013, 08:20Из-за того, что я ищу сотрудника по наименованию, а не по ссылке?
вполне вероятно.
Цитата: JoeButcher от 09 сен 2013, 08:20Но, в данный момент, меня интересует, почему не находятся результаты запроса по условию
лучше не пытайтесь решить сиюминутную неправильно поставленную задачу, а сделайте все правильно изначально. тогда не придется выяснять, почему не отрабатывают условия.

а вообще, если все таки есть желание разобраться, то выведите результат запроса любым удобным способом - либо в отладчике (поставьте точку остановка, нажмите "рассчитать выражение" для Результат.Выгрузить(), затем F2 на строке со значением, затем из контекстного меню "вывести список"), либо кодом; короче цель в том, чтобы посмотреть, что получилось в результате запроса и есть ли там строки, удовлетворяющие условиям (особенно внимательно смотрим на строки - если где-то лишний пробел, то строки уже будут не равны: "Иванов Иван Иванович" не равно "Иванов Иван Иванович ")

JoeButcher

Цитата: mixqn от 09 сен 2013, 08:56
Цитата: JoeButcher от 09 сен 2013, 08:20Из-за того, что я ищу сотрудника по наименованию, а не по ссылке?
вполне вероятно.
Цитата: JoeButcher от 09 сен 2013, 08:20Но, в данный момент, меня интересует, почему не находятся результаты запроса по условию
лучше не пытайтесь решить сиюминутную неправильно поставленную задачу, а сделайте все правильно изначально. тогда не придется выяснять, почему не отрабатывают условия.

а вообще, если все таки есть желание разобраться, то выведите результат запроса любым удобным способом - либо в отладчике (поставьте точку остановка, нажмите "рассчитать выражение" для Результат.Выгрузить(), затем F2 на строке со значением, затем из контекстного меню "вывести список"), либо кодом; короче цель в том, чтобы посмотреть, что получилось в результате запроса и есть ли там строки, удовлетворяющие условиям (особенно внимательно смотрим на строки - если где-то лишний пробел, то строки уже будут не равны: "Иванов Иван Иванович" не равно "Иванов Иван Иванович ")

Еще раз большое спасибо :) Пошел разбираться.
Добавлено: 09 сен 2013, 12:09


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

Далее в программе пытаюсь выгрузить результат выборки в массивы и получаю, что массивы пусты:
Результат = ЗапросПоСменам();
ТаблицаРезультата = Результат.Выгрузить();
МассивСменФакт = Новый Массив();
МассивСменНорма= Новый Массив();
МассивСменФакт = ТаблицаРезультата.ВыгрузитьКолонку("ОтработаноДней");
МассивСменНорма= ТаблицаРезультата.ВыгрузитьКолонку("НормаДней");
Сообщить("Всего единиц факт: "+МассивСменФакт.Количество() );
Сообщить("Всего единиц норма: "+МассивСменНорма.Количество() );


Как пример, задаваемые на форме значения: Работник = "Сазонов Александр Юрьевич", ДатаНач = 01.05.2011 0:00:00, ДатаКон = 30.09.2013 0:00:00
И подходящие данные из регистра ОсновныеНачисленияРаботниковОрганизаций:

Почему выборка получается пустая, ума не приложу...
Добавлено: 09 сен 2013, 12:14


up

Dethmontt

Типы то верны?

Процедура ПроверитьВсеЛиЯТипыУказалПравильно()
   Сообщить("Тип передаваемого параметра - "+ТипЗнч(Работник));

   МетаРегистр = Метаданные.РегистрыРасчета.ОсновныеНачисленияРаботниковОрганизаций;
   Измерения = МетаРегистр.Измерения;
   Измерение = Измерения.Найти("ФизЛицо");
   Сообщить("Тип поля условия - "+Строка(Измерение.Тип));
КонецПроцедуры

Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

JoeButcher

Цитата: Dethmontt от 09 сен 2013, 13:44
Типы то верны?

Процедура ПроверитьВсеЛиЯТипыУказалПравильно()
   Сообщить("Тип передаваемого параметра - "+ТипЗнч(Работник));

   МетаРегистр = Метаданные.РегистрыРасчета.ОсновныеНачисленияРаботниковОрганизаций;
   Измерения = МетаРегистр.Измерения;
   Измерение = Измерения.Найти("ФизЛицо");
   Сообщить("Тип поля условия - "+Строка(Измерение.Тип));
КонецПроцедуры


С типами вроде все в порядке. Запрос заработал, после того как поменял поле "БазовыйПериодНачало" на "ДатаНачалаСобытия"...
Однако, оказалось, что по каждому месяцу в регистре идет несколько записей, а что с ними делать непонятно: то ли просто просуммировать по каждому месяцу, то ли что...
Кстати, еще вопрос: а можно ли выгрузить ТаблицуРезультата в многомерный массив?

Теги:

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

Рейтинг@Mail.ru

Поиск