Функция расчет среднемесячного количества часов Код 1C v 8.3
&НаСервере
Функция СреднемесячноеКоличествоЧасов(Год)
Запрос = Новый Запрос;
Запрос. УстановитьПараметр( "Год" , Год) ;
Запрос. УстановитьПараметр( "РабочийДень" , Перечисления. ВидыДнейПроизводственногоКалендаря. Рабочий) ;
Запрос. УстановитьПараметр( "ПредпраздничныйДень" , Перечисления. ВидыДнейПроизводственногоКалендаря. Предпраздничный) ;
Запрос. Текст =
"ВЫБРАТЬ
| СУММА(ВЫБОР
| КОГДА РегламентированныйПроизводственныйКалендарь.ВидДня =РабочийДень
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ) КАК ЧислоРабочихДней,
| СУММА(ВЫБОР
| КОГДА РегламентированныйПроизводственныйКалендарь.ВидДня =ПредпраздничныйДень
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ) КАК ЧислоПредпраздничныхДней
|ИЗ
| РегистрСведений.ДанныеПроизводственногоКалендаря КАК РегламентированныйПроизводственныйКалендарь
|ГДЕ
| РегламентированныйПроизводственныйКалендарь.Год =Год" ;
ВыборкаКалендаря = Запрос. Выполнить( ) . Выбрать( ) ;
Если ВыборкаКалендаря. Следующий( ) тогда
ЧислоРабочихДнейВГоду = ? ( ВыборкаКалендаря. ЧислоРабочихДней = NULL , 0 , ВыборкаКалендаря. ЧислоРабочихДней) ;
ЧислоПредпраздничныхДнейВГоду = ? ( ВыборкаКалендаря. ЧислоПредпраздничныхДней= NULL , 0 , ВыборкаКалендаря. ЧислоПредпраздничныхДней) ;
Иначе
ЧислоРабочихДнейВГоду = 0 ;
ЧислоПредпраздничныхДнейВГоду = 0 ;
КонецЕсли ;
СреднеМесячное = Окр( ( ЧислоРабочихДнейВГоду* 8 + ЧислоПредпраздничныхДнейВГоду* 7 ) / 12 , 2 ) ;
Возврат СреднеМесячное;
КонецФункции
Категория:
1С Зарплата и Управление Персоналом 3.0 Как получить количество рабочих дней в месяце по календарю? Для одного проекта потребовалось получить количество рабочих дней в месяце по календарю, без учета праздников.
В результате получилась простая функция:
Код 1C v 8.3 Функция ПолучитьКолВоРабочихДнейПоКалендарю(ДатаМесяца)
Рабочие= 0 ;
Кон= НачалоМесяца( ДатаМесяца) ; КонМес = КонецМесяца( ДатаМесяца) ;
Пока Кон< = КонМес Цикл
Если ( ДеньНедели( Кон) = 6 ) или ( ДеньНедели( Кон) = 7 ) Тогда
Иначе
Рабочие= Рабочие+ 1 ;
КонецЕсли ;
Кон= Кон+ 86400 ;
КонецЦикла ;
Возврат Рабочие;
КонецФункции
А получить количество Выходных дней в месяце можно так:
Код 1C v 8.3 Функция ПолучитьКолВоРабочихДнейПоКалендарю(ДатаМесяца)
Вых= 0 ;
Кон= НачалоМесяца( ДатаМесяца) ; КонМес = КонецМесяца( ДатаМесяца) ;
Пока Кон< = КонМес Цикл
Если ( ДеньНедели( Кон) = 6 ) или ( ДеньНедели( Кон) = 7 ) Тогда
Вых= Вых+ 1 ;
КонецЕсли ;
Кон= Кон+ 86400 ;
КонецЦикла ;
Возврат Вых;
КонецФункции
Категория:
Работа с Датами (Временем) Разница между датами в рабочих днях, подсчет рабочих дней в 1С Разрабатывая некий функционал в 1С, бывает, необходимо посчитать количество рабочих дней после какой-то даты.
В этой статье примеры кода и запросы в которых считается количество рабочих дней:
Код, при вычислении определяет только по дню недели, викидывая выходные. Праздники не учитывает!
Код 1C v 8.х Функция РабочихДнейСДаты(НачДата,КолвоДней) Экспорт
Перем РабочихДней, ОбычныхДней, ДеньНедели;
РабочихДней = 0 ; ОбычныхДней = 0 ;
Пока РабочихДней < Число( КолвоДней) Цикл
ОбычныхДней = ОбычныхДней+ 1 ;
ДеньНедели= ДеньНедели( НачДата+ ( ОбычныхДней* 86400 ) ) ;
Если ДеньНедели < 6 Тогда
РабочихДней= РабочихДней+ 1 ;
КонецЕсли ;
КонецЦикла ;
Возврат ( НачДата + ( РабочихДней* 86400 ) ) ;
КонецФункции
ТриДняОтОбработки = РабочихДнейСДаты( нДатаОбработки, 3 ) ;
Если РабочаяДата> ТриДняОтОбработки Тогда
Предупреждение( "Прошло больше 3-х дней после обработки заказа. Цены не актуальны!
|Отправьте заказ на новую обработку! " ) ;
Иначе
КонецЕсли ;
В запросе, с использованием производственного календаря и учетом всех праздников:
Код 1C v 8.х ВЫБРАТЬ
РегламентированныйПроизводственныйКалендарь. ДатаКалендаря КАК Дата
ПОМЕСТИТЬ Даты
ИЗ
РегистрСведений. РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
РегламентированныйПроизводственныйКалендарь. ДатаКалендаря В( &ВходящиеДаты)
;
ВЫБРАТЬ
Даты. Дата,
КОЛИЧЕСТВО( РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь. ДатаКалендаря) КАК КоличествоРабочихДней,
МАКСИМУМ( РегламентированныйПроизводственныйКалендарь. ДатаКалендаря) КАК ДатаКалендаря,
РегламентированныйПроизводственныйКалендарь1 . ДатаКалендаря КАК ДатаКалендаряДляГруппировки
ИЗ
РегистрСведений. РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Даты КАК Даты
ПО ( Даты. Дата < = РегламентированныйПроизводственныйКалендарь. ДатаКалендаря)
И ( ДОБАВИТЬКДАТЕ( Даты. Дата, ДЕНЬ, ГлубинаДней) > РегламентированныйПроизводственныйКалендарь. ДатаКалендаря)
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений. РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь1
ПО РегламентированныйПроизводственныйКалендарь. ДатаКалендаря < = РегламентированныйПроизводственныйКалендарь1 . ДатаКалендаря
ГДЕ
( РегламентированныйПроизводственныйКалендарь. ВидДня = ЗНАЧЕНИЕ( Перечисление. ВидыДнейПроизводственногоКалендаря. Предпраздничный)
ИЛИ РегламентированныйПроизводственныйКалендарь. ВидДня = ЗНАЧЕНИЕ( Перечисление. ВидыДнейПроизводственногоКалендаря. Рабочий) )
СГРУППИРОВАТЬ ПО
РегламентированныйПроизводственныйКалендарь1 . ДатаКалендаря,
Даты. Дата
ИМЕЮЩИЕ
МАКСИМУМ( РегламентированныйПроизводственныйКалендарь. ДатаКалендаря) = РегламентированныйПроизводственныйКалендарь1 . ДатаКалендаря
И КОЛИЧЕСТВО( РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь. ДатаКалендаря) = РабочихДней
Еще один вариант, в котором допустим, что:
1) Регистр сведений Календарь имеет структуру (Измерения={ДатаКалендаря}, Ресурсы={ВидДня}), а перечисление ВидыДня задано как {Рабочий, Предпразничный} и праздничные дни в календаре отсутствуют.
2) В документе Реализация заданы поля Дата и ОтсрочкаДней. Тогда:
Код 1C v 8.х Выбрать
Р. Ссылка, Р. Дата,
минимум( isnull( К. ДатаКалендаря, добавитькдате( Р. Дата, день, Р. ОтсрочкаДней) ) ) как ДатаКредита
из Документ. Реализация как Р
левое соединение РегистрСведений. Календарь как К
по добавитькдате( Р. Дата, день, Р. ОтсрочкаДней) < = К. ДатаКалендаря
сгруппировать по
Р. Ссылка, Р. Дата
Собственно, если календарь содержит и праздничные дни, то можно добавить секцию ГДЕ, и там отобрать только рабочие дни. В секции ГДЕ можно отобрать и интересующий календарь, если ведется несколько календарей.
Категория:
Работа с Датами (Временем) Получить количество рабочих дней сотрудника В данной статье описаны функции которые вы можете использовать в ЗУП для получения количества рабочих дней по графику работы сотрудника или по производственному календарю
Код 1C v 8.х
Функция КоличествоРабочихДнейПоГрафикуРаботы(ДатаН, ДатаК, ГрафикРаботы)
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ГрафикиРаботыПоВидамВремени.ГрафикРаботы,
| ГрафикиРаботыПоВидамВремени.ВидУчетаВремени,
| СУММА(ГрафикиРаботыПоВидамВремени.ОсновноеЗначение) КАК ОсновноеЗначение,
| СУММА(ГрафикиРаботыПоВидамВремени.ДополнительноеЗначение) КАК ДополнительноеЗначение,
| СУММА(ГрафикиРаботыПоВидамВремени.ОсновноеЗначениеНорма) КАК ОсновноеЗначениеНорма,
| СУММА(ГрафикиРаботыПоВидамВремени.ДополнительноеЗначениеНорма) КАК ДополнительноеЗначениеНорма
|ИЗ
| РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботыПоВидамВремени
|ГДЕ
| ГрафикиРаботыПоВидамВремени.ГрафикРаботы = &ГрафикРаботы
| И ГрафикиРаботыПоВидамВремени.Дата МЕЖДУ &ДатаН И &ДатаК
| И ГрафикиРаботыПоВидамВремени.ВидУчетаВремени = &ВидУчетаВремени
|
|СГРУППИРОВАТЬ ПО
| ГрафикиРаботыПоВидамВремени.ГрафикРаботы,
| ГрафикиРаботыПоВидамВремени.ВидУчетаВремени" ;
Запрос. УстановитьПараметр( "ГрафикРаботы" , ГрафикРаботы) ;
Запрос. УстановитьПараметр( "ДатаК" , ДатаК) ;
Запрос. УстановитьПараметр( "ДатаН" , ДатаН) ;
Запрос. УстановитьПараметр( "ВидУчетаВремени" , Перечисления. ВидыУчетаВремени. ПоДням) ;
Выборка = Запрос. Выполнить( ) . Выбрать( ) ;
Если Выборка. Следующий( ) Тогда
ОсновноеЗначение = Выборка. ОсновноеЗначение;
Иначе
ОбщегоНазначенияЗК. СообщитьОбОшибке( "Проверьте заполнение графика!" ) ;
ОсновноеЗначение = 0 ;
КонецЕсли ;
Возврат ОсновноеЗначение;
КонецФункции
Функция КоличествоРабочихДнейПоПроизвКаленд(ДатаН, ДатаК)
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| СУММА(РегламентированныйПроизводственныйКалендарь.КалендарныеДни) КАК КоличествоДней,
| СУММА(РегламентированныйПроизводственныйКалендарь.Пятидневка) КАК Пятидневка,
| СУММА(РегламентированныйПроизводственныйКалендарь.Шестидневка) КАК Шестидневка
|ИЗ
| РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
|ГДЕ
| РегламентированныйПроизводственныйКалендарь.ДатаКалендаря >= &ДатаН
| И РегламентированныйПроизводственныйКалендарь.ДатаКалендаря <= &ДатаК" ;
Запрос. УстановитьПараметр( "ДатаК" , ДатаК) ;
Запрос. УстановитьПараметр( "ДатаН" , ДатаН) ;
Выборка = Запрос. Выполнить( ) . Выбрать( ) ;
Если Выборка. Следующий( ) Тогда
ОсновноеЗначение = Выборка. Пятидневка;
Иначе
ОбщегоНазначенияЗК. СообщитьОбОшибке( "Проверьте заполнение графика!" ) ;
ОсновноеЗначение = 0 ;
КонецЕсли ;
Возврат ОсновноеЗначение;
КонецФункции
Категория:
1С Зарплата и Управление Персоналом 2.5 Как произвести поиск нескольких строк в "ТаблицаЗначений" по двум и более полям? Для поиска нескольких строк предназначен метод НайтиСтроки.
В платформе он определен таким образом.
Код 1C v 8.х НайтиСтроки( < Параметры_Отбора> )
Где
<Параметры_Отбора> представляют структуру, в которой ключ структуры определяет имя колонки, а значение структуры - искомое значение. Возвращает этот метод массив строк ТаблицыЗначений.
Стоит помнить, что массив содержит не копии строк, а ссылки на строки таблицы источника! Т.е. внеся изменения в строку из массива, вы изменяете строки в таблице.
Добавляя в структуру несколько записей вы, соответственно, устанавливаете отбор по нескольким полям.
Выглядит это примерно вот так:
Код 1C v 8.х ТЗРабочихДнейПоГрафику = Новый ТаблицаЗначений;
ТЗРабочихДнейПоГрафику. Колонки. Добавить( "месяцИнтервала" ) ;
ТЗРабочихДнейПоГрафику. Колонки. Добавить( "График" ) ;
ТЗРабочихДнейПоГрафику. Колонки. Добавить( "РабочихДней" ) ;
. . .
ОтборПоГрафику = Новый Структура;
ОтборПоГрафику. Вставить( "месяцИнтервала" , СтрокаПериода. МесяцПериода) ;
ОтборПоГрафику. Вставить( "График" , Групп_Задача. График) ;
НайденныеСтроки = ТЗРабочихДнейПоГрафику. НайтиСтроки( ОтборПоГрафику) ;
Автор: Андрей Окипний
Категория:
Работа с Таблицей Значений