Как получить количество рабочих дней в месяце по календарю? Для одного проекта потребовалось получить количество рабочих дней в месяце по календарю, без учета праздников.
В результате получилась простая функция:
Код 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( К. ДатаКалендаря, добавитькдате( Р. Дата, день, Р. ОтсрочкаДней) ) ) как ДатаКредита
из Документ. Реализация как Р
левое соединение РегистрСведений. Календарь как К
по добавитькдате( Р. Дата, день, Р. ОтсрочкаДней) < = К. ДатаКалендаря
сгруппировать по
Р. Ссылка, Р. Дата
Собственно, если календарь содержит и праздничные дни, то можно добавить секцию ГДЕ, и там отобрать только рабочие дни. В секции ГДЕ можно отобрать и интересующий календарь, если ведется несколько календарей.
Категория:
Работа с Датами (Временем) Как в зуп провести день уход за детьми-инвалидами Рассчитывается как Оплата по среднему, там есть вид расчета "Оплата дополнительных выходных дней по уходу за детьми - инвалидами". Документ заполняется и рассчитывается как обычно.
Для кадровиков кроме ввода "Неявки и болезни в организации" со статусом:
1) Уход за больным ребенком
2) Дополнительные выходные дни (оплачиваемые)
больше вроде мало что подходит. Но отдельно упоминания об уходе за детьми-инвалидами нет.
Категория:
1С Зарплата и Управление Персоналом 2.5 Как ввести двойную оплату за праздничный или выходной день Нужно в док «Оплата праздничных и выходных дней» делать 2 строчки начисления на сотрудника: «Оплата праздничных и выходных дней» и «Доплата за работу в праздники и выходные »
Категория:
1С Зарплата и Управление Персоналом 2.5 Поиск в базе битых ссылок - "объект не найден" В статье
Битая ссылка, <Объект не найден>, Уникальный Идентификатор, GUID мы обсуждали как востановить битые ссылки!
А вот как найти в базе все битые ссылки, которые имеют вид типа "<Объект не найден> (137:8b270030482898d011daad3cc45fc830)"?
Для поиска этого была написана данная обработка:
Скачивать файлы может только зарегистрированный пользователь!
Для поиска: Выбираем объекты метаданных , которые хотим проверить, жмем кнопочку "Выполнить" и наблюдаем в таблице
выходные данные. Откуда можем попасть в объекты-источники.
Для программиста:
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
ИспользоватьОграничение = ЗначениеЗаполнено( ОграничениеТипов) ;
РезультатПоиска. Очистить( ) ;
Для Каждого ОбъектыМетаданных Из КоллекцияОбъектов Цикл
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Состояние( ОбъектМетаданных. ПолноеИмя( ) ) ;
ПроверитьОбъектНаБитыеСсылки( ОбъектМетаданных) ;
КонецЦикла ;
КонецЦикла ;
Для Каждого ОбъектыМетаданных Из КоллекцияРегистров Цикл
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Состояние( ОбъектМетаданных. ПолноеИмя( ) ) ;
ПроверитьРегистрНаБитыеСсылки( ОбъектМетаданных) ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Процедура ВывестиДанные(ТекстЗапроса)
Запрос = Новый Запрос( ТекстЗапроса) ;
Попытка
РезультатЗапроса = Запрос. Выполнить( ) ;
Если Не РезультатЗапроса. Пустой( ) Тогда
ТЗ = РезультатЗапроса. Выгрузить( ) ;
Для Каждого Стр Из ТЗ Цикл
ОбработкаПрерыванияПользователя( ) ;
Строка = РезультатПоиска. Добавить( ) ;
ЗаполнитьЗначенияСвойств( Строка, Стр) ;
КонецЦикла ;
КонецЕсли ;
Исключение
Сообщить( ИнформацияОбОшибке( ) . Описание + " " + ИнформацияОбОшибке( ) . Причина) ;
КонецПопытки ;
КонецПроцедуры
Процедура ПроверитьРегистрНаБитыеСсылки(ОбъектМетаданных)
ИмяТаблицы = ОбъектМетаданных. ПолноеИмя( ) ;
Если Метаданные. РегистрыСведений. Содержит( ОбъектМетаданных) Тогда
Если ОбъектМетаданных. РежимЗаписи = НезависимыйРежимЗаписи Тогда
Возврат ;
КонецЕсли ;
АнализСвойствРегистра( ОбъектМетаданных, ОбъектМетаданных. Реквизиты, ИмяТаблицы) ;
КонецЕсли ;
АнализСвойствРегистра( ОбъектМетаданных, ОбъектМетаданных. Измерения, ИмяТаблицы) ;
АнализСвойствРегистра( ОбъектМетаданных, ОбъектМетаданных. Реквизиты, ИмяТаблицы) ;
АнализРегистратораРегистра( ОбъектМетаданных, ИмяТаблицы) ;
Если Метаданные. РегистрыБухгалтерии. Содержит( ОбъектМетаданных) Тогда
КонецЕсли ;
Если Метаданные. РегистрыРасчета. Содержит( ОбъектМетаданных) Тогда
КонецЕсли ;
КонецПроцедуры
Процедура ПроверитьОбъектНаБитыеСсылки(ОбъектМетаданных)
ИмяТаблицы = ОбъектМетаданных. ПолноеИмя( ) ;
АнализСвойствОбъекта( ОбъектМетаданных, ОбъектМетаданных. Реквизиты, ИмяТаблицы) ;
Для Каждого ТабЧасть Из ОбъектМетаданных. ТабличныеЧасти Цикл
Если ТабличныеЧастиИсключения. Найти( ТабЧасть. Имя) < > Неопределено Тогда
Продолжить;
КонецЕсли ;
АнализСвойствОбъекта( ОбъектМетаданных, ТабЧасть. Реквизиты, ИмяТаблицы + "." + ТабЧасть. Имя)
КонецЦикла ;
Если Метаданные. Справочники. Содержит( ОбъектМетаданных) И ОбъектМетаданных. Владельцы. Количество( ) > 0 Тогда
МассивВладельцев = Новый Массив;
Для Каждого Элемент Из ОбъектМетаданных. Владельцы Цикл
МассивВладельцев. Добавить( Элемент) ;
КонецЦикла ;
КонецЕсли ;
ОбработкаПрерыванияПользователя( ) ;
КонецПроцедуры
Процедура АнализСвойствОбъекта(ОбъектМетаданных, Свойства, ИмяТаблицы)
Для Каждого Реквизит Из Свойства Цикл
Если РеквизитыИсключения. Найти( Реквизит. Имя) < > Неопределено Тогда
Продолжить;
КонецЕсли ;
Для Каждого моТип Из Реквизит. Тип. Типы( ) Цикл
ТекстЗапроса = "" ;
МетаданныеТипа = Метаданные. НайтиПоТипу( моТип) ;
Если МетаданныеТипа < > Неопределено
И Не Метаданные. Перечисления. Содержит( МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу( МетаданныеТипа. ПолноеИмя( ) ) Тогда
Продолжить;
КонецЕсли ;
КонецЕсли ;
ДобавитьВЗапросОбъект( ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, Реквизит. Имя, моТип) ;
КонецЕсли ;
Если Не ПустаяСтрока( ТекстЗапроса) Тогда
ВывестиДанные( ТекстЗапроса) ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Процедура АнализСвойствРегистра(ОбъектМетаданных, Свойства, ИмяТаблицы)
Для Каждого Реквизит Из Свойства Цикл
Если РеквизитыИсключения. Найти( Реквизит. Имя) < > Неопределено Тогда
Продолжить;
КонецЕсли ;
Для Каждого моТип Из Реквизит. Тип. Типы( ) Цикл
ТекстЗапроса = "" ;
МетаданныеТипа = Метаданные. НайтиПоТипу( моТип) ;
Если МетаданныеТипа < > Неопределено
И Не Метаданные. Перечисления. Содержит( МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу( МетаданныеТипа. ПолноеИмя( ) ) Тогда
Продолжить;
КонецЕсли ;
КонецЕсли ;
ДобавитьВЗапросРегистр( ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, Реквизит. Имя, моТип) ;
КонецЕсли ;
Если Не ПустаяСтрока( ТекстЗапроса) Тогда
ВывестиДанные( ТекстЗапроса) ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Процедура АнализРегистратораРегистра(ОбъектМетаданных, ИмяТаблицы)
МассивРегистраторов = ПолучитьСписокРегистраторов( ОбъектМетаданных) ;
Для Каждого Регистратор Из МассивРегистраторов Цикл
Если РеквизитыИсключения. Найти( "Регистратор" ) < > Неопределено Тогда
Продолжить;
КонецЕсли ;
моТип = Регистратор;
ТекстЗапроса = "" ;
МетаданныеТипа = Метаданные. НайтиПоТипу( моТип) ;
Если МетаданныеТипа < > Неопределено
И Не Метаданные. Перечисления. Содержит( МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу( МетаданныеТипа. ПолноеИмя( ) ) Тогда
Продолжить;
КонецЕсли ;
КонецЕсли ;
ДобавитьВЗапросРегистр( ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, "Регистратор" , моТип) ;
КонецЕсли ;
Если Не ПустаяСтрока( ТекстЗапроса) Тогда
ВывестиДанные( ТекстЗапроса) ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Функция ПолучитьСписокРегистраторов(ОбъектМетаданных)
МассивРегистраторов = Новый Массив;
МенеджерОбъект = ПолучитьМенеджерОбъекта( ОбъектМетаданных) ;
Если МенеджерОбъект < > Неопределено Тогда
НаборЗаписей = МенеджерОбъект. СоздатьНаборЗаписей( ) ;
ЭлементОтбора = НаборЗаписей. Отбор. Регистратор;
МассивРегистраторов = ЭлементОтбора. ТипЗначения. Типы( ) ;
КонецЕсли ;
Возврат МассивРегистраторов;
КонецФункции
Функция ПолучитьМенеджерОбъекта(ОбъектМетаданных)
Перем МенеджерОбъекта;
Если Метаданные. РегистрыБухгалтерии. Содержит( ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыБухгалтерии[ОбъектМетаданных. Имя];
ИначеЕсли Метаданные. РегистрыНакопления. Содержит( ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыНакопления[ОбъектМетаданных. Имя];
ИначеЕсли Метаданные. РегистрыСведений. Содержит( ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыСведений[ОбъектМетаданных. Имя];
ИначеЕсли Метаданные. РегистрыРасчета. Содержит( ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыРасчета[ОбъектМетаданных. Имя];
КонецЕсли ;
Возврат МенеджерОбъекта;
КонецФункции
Функция ПоискПоТипу(ИмяТипа)
Результат = Ложь ;
Если ИспользоватьОграничение Тогда
МассивСтрок = ОграничениеТипов. НайтиСтроки( Новый Структура( "ТипДанных" , ИмяТипа) ) ;
Если ЗначениеЗаполнено( МассивСтрок) Тогда
Результат = Истина ;
КонецЕсли ;
КонецЕсли ;
Возврат Результат;
КонецФункции
Процедура ДобавитьВЗапросРегистр(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, ИмяРеквизита, ТипРеквизита)
Текст = "ВЫБРАТЬ Об." + ИмяРеквизита + " КАК Объект,
| "" " + ИмяТаблицы + "." + ИмяРеквизита + """ КАК ТаблицаИсточник,
| Об.Регистратор КАК ОбъектИсточник,
| " + ДобавитьОписаниеТипа( ИмяРеквизита, ТипРеквизита) + "
|ИЗ
| " + ИмяТаблицы + " КАК Об
|ГДЕ " + ДобавитьУсловия( ИмяРеквизита, ТипРеквизита) ;
ТекстЗапроса = ТекстЗапроса + ? ( ПустаяСтрока( ТекстЗапроса) , "" , Символы. ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы. ПС) + Текст;
КонецПроцедуры
Процедура ДобавитьВЗапросОбъект(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, ИмяРеквизита, ТипРеквизита)
Текст = "ВЫБРАТЬ Об." + ИмяРеквизита + " КАК Объект,
| "" " + ИмяТаблицы + "." + ИмяРеквизита + """ КАК ТаблицаИсточник,
| Об.Ссылка КАК ОбъектИсточник,
| " + ДобавитьОписаниеТипа( ИмяРеквизита, ТипРеквизита) + "
|ИЗ
| " + ИмяТаблицы + " КАК Об
|ГДЕ " + ДобавитьУсловия( ИмяРеквизита, ТипРеквизита) ;
ТекстЗапроса = ТекстЗапроса + ? ( ПустаяСтрока( ТекстЗапроса) , "" , Символы. ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы. ПС) + Текст;
КонецПроцедуры
Функция ДобавитьУсловия(ИмяРеквизита, ТипРеквизита)
мдОбъекта = Метаданные. НайтиПоТипу( ТипРеквизита) ;
ИмяТаблицы = мдОбъекта. ПолноеИмя( ) ;
ПроверкаНаПустыеЗначения = " Об." + ИмяРеквизита + " ССЫЛКА " + ИмяТаблицы;
ПроверкаНаПустыеЗначения = ПроверкаНаПустыеЗначения + " И ВЫРАЗИТЬ(Об." + ИмяРеквизита + " КАК " + ИмяТаблицы + ").Ссылка есть null" ;
Если Не Метаданные. Перечисления. Содержит( мдОбъекта) Тогда
ПроверкаНаПустыеЗначения = ПроверкаНаПустыеЗначения + " И Об." + ИмяРеквизита + " <> Значение(" + ИмяТаблицы + ".ПустаяСсылка)" ;
КонецЕсли ;
Возврат ПроверкаНаПустыеЗначения;
КонецФункции
Функция ДобавитьОписаниеТипа(ИмяРеквизита, ТипРеквизита)
ОбъектТипа = Метаданные. НайтиПоТипу( ТипРеквизита) ;
ИмяТаблицы = ОбъектТипа. ПолноеИмя( ) ;
ОписаниеТипа = """ " + ИмяТаблицы + """ КАК ТипДанных" ;
Возврат ОписаниеТипа;
КонецФункции
Процедура ОграничениеТиповТипДанныхНачалоВыбора(Элемент, СтандартнаяОбработка)
Перем ЭлементСписка;
СтандартнаяОбработка = Ложь ;
Строка = ЭлементыФормы. ОграничениеТипов. ТекущиеДанные;
Если Не ПустаяСтрока( Строка. ТипДанных) Тогда
ЭлементСписка = СписокТипов. НайтиПоЗначению( Строка. ТипДанных) ;
КонецЕсли ;
ВыбранныйЭлемент = СписокТипов. ВыбратьЭлемент( , ЭлементСписка) ;
Если ВыбранныйЭлемент < > Неопределено Тогда
Строка. ТипДанных = ВыбранныйЭлемент. Значение;
КонецЕсли ;
КонецПроцедуры
РеквизитыИсключения = Новый Массив;
ТабличныеЧастиИсключения = Новый Массив;
СписокТипов = Новый СписокЗначений;
Для Каждого ОбъектМетаданных Из Метаданные. Справочники Цикл
СписокТипов. Добавить( ОбъектМетаданных. ПолноеИмя( ) , ОбъектМетаданных. Имя, , БиблиотекаКартинок. СправочникОбъект) ;
КонецЦикла ;
Для Каждого ОбъектМетаданных Из Метаданные. Документы Цикл
СписокТипов. Добавить( ОбъектМетаданных. ПолноеИмя( ) , ОбъектМетаданных. Имя, , БиблиотекаКартинок. ДокументОбъект) ;
КонецЦикла ;
КоллекцияОбъектов = Новый Массив;
КоллекцияОбъектов. Добавить( Метаданные. ПланыОбмена) ;
КоллекцияОбъектов. Добавить( Метаданные. Справочники) ;
КоллекцияОбъектов. Добавить( Метаданные. Документы) ;
КоллекцияОбъектов. Добавить( Метаданные. ПланыВидовХарактеристик) ;
КоллекцияОбъектов. Добавить( Метаданные. ПланыСчетов) ;
КоллекцияОбъектов. Добавить( Метаданные. ПланыВидовРасчета) ;
КоллекцияОбъектов. Добавить( Метаданные. БизнесПроцессы) ;
КоллекцияОбъектов. Добавить( Метаданные. Задачи) ;
КоллекцияРегистров = Новый Массив;
КоллекцияРегистров. Добавить( Метаданные. РегистрыСведений) ;
КоллекцияРегистров. Добавить( Метаданные. РегистрыНакопления) ;
КоллекцияРегистров. Добавить( Метаданные. РегистрыБухгалтерии) ;
КоллекцияРегистров. Добавить( Метаданные. РегистрыРасчета) ;
Категория:
1С Общие вопросы - Обычные формы Диаграмма Ганта - Как выделить выходные другим цветом? Код 1C v 8.х Неделя = 3600 * 24 * 7 ;
Выходные = 3600 * 48 ;
МаксимальнаяДата = ДатаД1 ;
ТекущаяДата = ДатаД;
Пока ТекущаяДата < = МаксимальнаяДата Цикл
Конец = НачалоНедели( ТекущаяДата) ;
Начало = Конец - Выходные;
ИнтФ= ДГ. ИнтервалыФона. Добавить( Начало, Конец) ;
ИнтФ. Цвет = WebЦвета. Красный;
ТекущаяДата = ТекущаяДата + Неделя;
КонецЦикла ;
Категория:
Диаграмма