Сколько лет, месяцев, дней прошло между датами Код 1C v 8.х
ВЫБРАТЬ
МИНИМУМ( пДаты. _Дата) КАК лДата,
МАКСИМУМ( пДаты. _Дата) КАК пДата
ПОМЕСТИТЬ _д
ИЗ
( ВЫБРАТЬ НАЧАЛОПЕРИОДА( &лДата,ДЕНЬ) AS _Дата
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ НАЧАЛОПЕРИОДА( &пДата,ДЕНЬ)) КАК пДаты;
ВЫБРАТЬ
_д. лДата,
_д. пДата,
ВЫБОР
КОГДА ГОД( _д. пДата) > = ГОД( _д. лДата) ТОГДА
ВЫБОР
КОГДА МЕСЯЦ( _д. пДата) > = МЕСЯЦ( _д. лДата) ТОГДА ГОД( _д. пДата) - ГОД( _д. лДата)
КОГДА МЕСЯЦ( _д. пДата) < МЕСЯЦ( _д. лДата) ТОГДА ГОД( _д. пДата) - ГОД( _д. лДата) - 1
КОНЕЦ
КОНЕЦ КАК Лет,
ВЫБОР
КОГДА ГОД( _д. пДата) > = ГОД( _д. лДата) ТОГДА
ВЫБОР
КОГДА МЕСЯЦ( _д. пДата) > = МЕСЯЦ( _д. лДата) ТОГДА
ВЫБОР
КОГДА ДЕНЬ( _д. пДата) > = ДЕНЬ( _д. лДата) ТОГДА МЕСЯЦ( _д. пДата) - МЕСЯЦ( _д. лДата)
КОГДА ДЕНЬ( _д. пДата) < ДЕНЬ( _д. лДата) ТОГДА МЕСЯЦ( _д. пДата) - МЕСЯЦ( _д. лДата) - 1
КОНЕЦ
КОГДА МЕСЯЦ( _д. пДата) < МЕСЯЦ( _д. лДата) ТОГДА
ВЫБОР
КОГДА ДЕНЬ( _д. пДата) > = ДЕНЬ( _д. лДата) ТОГДА 12 + МЕСЯЦ( _д. пДата) - МЕСЯЦ( _д. лДата)
КОГДА ДЕНЬ( _д. пДата) < ДЕНЬ( _д. лДата) ТОГДА 12 + МЕСЯЦ( _д. пДата) - МЕСЯЦ( _д. лДата) - 1
КОНЕЦ
КОНЕЦ
КОНЕЦ КАК Месяцев,
ВЫБОР
КОГДА ГОД( _д. пДата) > = ГОД( _д. лДата) ТОГДА
ВЫБОР
КОГДА МЕСЯЦ( _д. пДата) > = МЕСЯЦ( _д. лДата) ТОГДА
ВЫБОР
КОГДА ДЕНЬ( _д. пДата) > = ДЕНЬ( _д. лДата) ТОГДА ДЕНЬ( _д. пДата) - ДЕНЬ( _д. лДата)
КОГДА ДЕНЬ( _д. пДата) < ДЕНЬ( _д. лДата) ТОГДА ( ДЕНЬ( КОНЕЦПЕРИОДА( _д. лДата, МЕСЯЦ) ) - ДЕНЬ( _д. лДата) ) + ДЕНЬ( _д. пДата)
КОНЕЦ
КОГДА МЕСЯЦ( _д. пДата) < МЕСЯЦ( _д. лДата) ТОГДА
ВЫБОР
КОГДА ДЕНЬ( _д. пДата) > = ДЕНЬ( _д. лДата) ТОГДА ДЕНЬ( _д. пДата) - ДЕНЬ( _д. лДата)
КОГДА ДЕНЬ( _д. пДата) < ДЕНЬ( _д. лДата) ТОГДА ( ДЕНЬ( КОНЕЦПЕРИОДА( _д. лДата, МЕСЯЦ) ) - ДЕНЬ( _д. лДата) ) + ДЕНЬ( _д. пДата) + 1
КОНЕЦ
КОНЕЦ
КОНЕЦ КАК Дней
Категория:
Работа с Датами (Временем) Сколько лет, месяцев, дней прошло между датами ////////////////////////// параметры даты в запрос ////////////////////////////////////// приведем период в нормальную форму к виду (с лДата по пДата) /////////// ВЫБРАТЬ МИНИМУМ(пДаты._Дата) КАК лДата, МАКСИМУМ(пДаты._Дата) КАК пДата ПОМЕСТИТЬ _д ИЗ(ВЫБРАТЬ НАЧАЛОПЕРИОДА(&лДата,ДЕНЬ) AS _Дата ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ НАЧАЛОПЕРИОДА(&пДата,ДЕНЬ)) КАК пДаты;////////////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ _д.лДата, _д.пДата, ВЫБОР КОГДА ГОД(_д.пДата)>= ГОД(_д.лДата)ТОГДА ВЫБОР КОГДА МЕСЯЦ(_д.пДата)>= МЕСЯЦ(_д.лДата)ТОГДА ГОД(_д.пДата)- ГОД(_д.лДата) КОГДА МЕСЯЦ(_д.пДата)< МЕСЯЦ(_д.лДата)ТОГДА ГОД(_д.пДата)- ГОД(_д.лДата)-1 КОНЕЦ КОНЕЦ КАК Лет, ВЫБОР КОГДА ГОД(_д.пДата)>= ГОД(_д.лДата)ТОГДА ВЫБОР КОГДА МЕСЯЦ(_д.пДата)>= МЕСЯЦ(_д.лДата)ТОГДА ВЫБОР КОГДА ДЕНЬ(_д.пДата)>= ДЕНЬ(_д.лДата)ТОГДА МЕСЯЦ(_д.пДата)- МЕСЯЦ(_д.лДата) КОГДА ДЕНЬ(_д.пДата)< ДЕНЬ(_д.лДата)ТОГДА МЕСЯЦ(_д.пДата)- МЕСЯЦ(_д.лДата)-1 КОНЕЦ КОГДА МЕСЯЦ(_д.пДата)< МЕСЯЦ(_д.лДата)ТОГДА ВЫБОР КОГДА ДЕНЬ(_д.пДата)>= ДЕНЬ(_д.лДата)ТОГДА12+ МЕСЯЦ(_д.пДата)- МЕСЯЦ(_д.лДата) КОГДА ДЕНЬ(_д.пДата)< ДЕНЬ(_д.лДата)ТОГДА12+ МЕСЯЦ(_д.пДата)- МЕСЯЦ(_д.лДата)-1 КОНЕЦ КОНЕЦ КОНЕЦ КАК Месяцев, ВЫБОР КОГДА ГОД(_д.пДата)>= ГОД(_д.лДата)ТОГДА ВЫБОР КОГДА МЕСЯЦ(_д.пДата)>= МЕСЯЦ(_д.лДата)ТОГДА ВЫБОР КОГДА ДЕНЬ(_д.пДата)>= ДЕНЬ(_д.лДата)ТОГДА ДЕНЬ(_д.пДата)- ДЕНЬ(_д.лДата) КОГДА ДЕНЬ(_д.пДата)< ДЕНЬ(_д.лДата)ТОГДА(ДЕНЬ(КОНЕЦПЕРИОДА(_д.лДата,МЕСЯЦ))- ДЕНЬ(_д.лДата))+ ДЕНЬ(_д.пДата) КОНЕЦ КОГДА МЕСЯЦ(_д.пДата)< МЕСЯЦ(_д.лДата)ТОГДА ВЫБОР КОГДА ДЕНЬ(_д.пДата)>= ДЕНЬ(_д.лДата)ТОГДА ДЕНЬ(_д.пДата)- ДЕНЬ(_д.лДата) КОГДА ДЕНЬ(_д.пДата)< ДЕНЬ(_д.лДата)ТОГДА(ДЕНЬ(КОНЕЦПЕРИОДА(_д.лДата,МЕСЯЦ))- ДЕНЬ(_д.лДата))+ ДЕНЬ(_д.пДата)+1 КОНЕЦ КОНЕЦ КОНЕЦ КАК Дней
Категория:
Работа с Датами (Временем) Как посчитать разницу между двумя датами ? Код уникален и сработает везде.
Код 1C v 8.3 Функция ПолучитьКоличествоДней()
Счетчик = 1 ;
НачалоПериода = Объект. НачалоПериода;
Пока НачалоПериода < Объект. КонецПериода Цикл
Счетчик = Счетчик + 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( К. ДатаКалендаря, добавитькдате( Р. Дата, день, Р. ОтсрочкаДней) ) ) как ДатаКредита
из Документ. Реализация как Р
левое соединение РегистрСведений. Календарь как К
по добавитькдате( Р. Дата, день, Р. ОтсрочкаДней) < = К. ДатаКалендаря
сгруппировать по
Р. Ссылка, Р. Дата
Собственно, если календарь содержит и праздничные дни, то можно добавить секцию ГДЕ, и там отобрать только рабочие дни. В секции ГДЕ можно отобрать и интересующий календарь, если ведется несколько календарей.
Категория:
Работа с Датами (Временем) Подсчет реального количества месяцев между датами , включая начало и конец месяца В одном проекте понадобилось подсчитывать полное количество месяцев между датами ,
Допустим надо получить кол-во месяцев между датами 25.10.14 и 21.11.14
Функция РазницаДатВМесяцах ( Как вычислить разницу между двумя датами в месяцах ) вернет 1 , по сути разница между датами = одному месяцу,
но по факту работы будут в 10 и 11 месяцах, т.е. всего 2, в итоге была написана простая функция, ее код ниже:
Код 1C v 8.2 УП тДат= ДатаНачала; КолМес = 0 ;
Пока Месяц( тДат) < > Месяц( ДатаОкончания) Цикл
КолМес = КолМес+ 1 ;
тДат = ДобавитьМесяц( тДат, 1 ) ;
КонецЦикла ;
Результат = КолМес+ 1 ;
Категория:
Работа с Датами (Временем) Как вычислить количество дней между датами Код 1C v 8.х Запрос= Новый Запрос( "ВЫБРАТЬ
| РАЗНОСТЬДАТ(&НачалоПериода,&КонецПериода,МЕСЯЦ) КАК Месяцев,
| РАЗНОСТЬДАТ(&НачалоПериода,&КонецПериода,ДЕНЬ) КАК Дней" ) ;
КоличествоДней = ( ДатаКонец - ДатаНачала) / 60 / 60 / 24 ;
Код 1C v 7.x КоличествоДней = ДатаКонец- ДатаНачала
Категория:
Работа с Датами (Временем) Как вычислить разницу между двумя датами в часах и минутах Код 1C v 8.х Функция РазностьВремени(Время1, Время2) ;
Разность = Время1 - Время2 ;
Если Разность > 0 Тогда
Часов = Цел( Разность / 3600 ) ;
Минут = Цел( ( Разность - Часов * 3600 ) / 60 ) ;
Возврат Дата( 1 , 1 , 1 , Часов, Минут, 0 ) ;
Иначе
Возврат Дата( 1 , 1 , 1 , 0 , 0 , 0 ) ;
КонецЕсли ;
КонецФункции
Опоздание= РазностьВремени( ВремяПриезда, ВремяПодачи) ;
Категория:
Работа с Датами (Временем) Вычислить возраст человека и выразить его прописью Основная функция будет использовать в себе три вспомогательных:
Код 1C v 8.х Функция РазностьМеждуДатамиВМесяцах(Дата1,Дата2)
Год1 = Год( Дата1 ) ;
Год2 = Год( Дата2 ) ;
Месяц1 = Месяц( Дата1 ) ;
Месяц2 = Месяц( Дата2 ) ;
День1 = День( Дата1 ) ;
День2 = День( Дата2 ) ;
Результат = ( Год1 - Год2 ) * 12 + Месяц1 - Месяц2 ;
Если Результат < 0 Тогда Результат = 0 - Результат; КонецЕсли ;
Если ( ( Дата1 > Дата2 ) И ( День1 < День2 ) ) ИЛИ ( ( Дата1 < Дата2 ) И ( День1 > День2 ) ) Тогда
Результат = Результат - 1 ;
КонецЕсли ;
Возврат Результат;
КонецФункции
Код 1C v 8.х Функция ВозрастВМесяцахИГодах(Месяцы)
Структура = Новый Структура;
Структура. Вставить( "Год" ) ;
Структура. Вставить( "Месяц" ) ;
Структура. Месяц = Месяцы % 12 ;
Структура. Год = ( Месяцы - Структура. Месяц) / 12 ;
Возврат Структура;
КонецФункции
Код 1C v 8.х Функция ВозрастПрописью(Структура)
Строка = "" ;
Если Структура. Год > 0 Тогда
ПоследняяЦифраГода = Число( Сред( Строка( Структура. Год) , СтрДлина( Строка( Структура. Год) ) , 1 ) ) ;
Если ( ПоследняяЦифраГода = 1 ) И ( Структура. Год < > 11 ) Тогда Строка = Строка( Структура. Год) + " год" ; КонецЕсли ;
Если ( ПоследняяЦифраГода > = 2 ) И ( ПоследняяЦифраГода < = 4 ) И ( ( Структура. Год < 12 ) ИЛИ ( Структура. Год > 14 ) ) Тогда Строка = Строка( Структура. Год) + " года" ; КонецЕсли ;
Если ( ( ПоследняяЦифраГода > = 5 ) И ( ПоследняяЦифраГода < = 9 ) ) ИЛИ ( ПоследняяЦифраГода = 0 ) Тогда Строка = Строка( Структура. Год) + " лет" ; КонецЕсли ;
Если ( Структура. Год > = 11 ) И ( Структура. Год < = 14 ) Тогда Строка = Строка( Структура. Год) + " лет" ; КонецЕсли ;
КонецЕсли ;
Если ( Структура. Год > 0 ) И ( Структура. Год < 3 ) И ( Структура. Месяц > 0 ) Тогда
Строка = Строка + ", " ;
КонецЕсли ;
Если ( Структура. Месяц > 0 ) И ( Структура. Год < = 3 ) Тогда
Если Структура. Месяц = 1 Тогда Строка = Строка + "1 месяц" ; КонецЕсли ;
Если ( Структура. Месяц > = 2 ) И ( Структура. Месяц < = 4 ) Тогда Строка = Строка + Строка( Структура. Месяц) + " месяца" ; КонецЕсли ;
Если Структура. Месяц > = 5 Тогда Строка = Строка + Строка( Структура. Месяц) + " месяцев" ; КонецЕсли ;
КонецЕсли ;
Возврат Строка;
КонецФункции
А вот и основная:
Код 1C v 8.х Функция ВозрастВычислить(Возраст,Дата)
Месяцы = РазностьМеждуДатамиВМесяцах( Возраст, Дата) ;
ВозрастСтруктура = ВозрастВМесяцахИГодах( Месяцы) ;
ВозрастПрописью = ВозрастПрописью( ВозрастСтруктура) ;
Возврат ВозрастПрописью;
КонецФункции
Изменения 2011.07.26: Небольшие доработки в процедуре
ВозрастПрописью - теперь всё работает правильно.
Категория:
Работа с Датами (Временем) Дополнение результата запроса Датами в Установленном ПЕРИОДЕ Иногда возникает необходимость вывести в отчет информацию таким образом, чтобы некоторые итоговые значения были рассчитаны на каждую дату в заданном интервале с указанной периодичностью. Например, требуется получить обороты по неделям вне зависимости от того, были ли обороты в конкретную неделю или нет. Для решения подобной задачи в языке запросов предусмотрена конструкция ПЕРИОДАМИ. Данная конструкция указывается в предложении ИТОГИ после поля "Период". После ключевого слова ПЕРИОДАМИ в скобках указывается вид периода (одно из Секунда, Минута, Час, День, Неделя, Месяц, Квартал, Год, Декада, Полугодие), начальная и конечные даты интересуемого периода. В случае если начальные и конечные даты не указаны, будут использованы первая и последняя даты, участвующие в результате.
Пример:
Код 1C v 8.х ВЫБРАТЬ
УчетНоменклатурыОбороты. Период КАК Период,
УчетНоменклатурыОбороты. КоличествоОборот КАК КоличествоОборот
ИЗ
РегистрНакопления. УчетНоменклатуры. Обороты( , , Неделя, ) КАК УчетНоменклатурыОбороты
УПОРЯДОЧИТЬ ПО
Период
ИТОГИ СУММА( КоличествоОборот) ПО
Период ПЕРИОДАМИ( НЕДЕЛЯ, , )
Результат данного запроса будет дополнен записями на даты начала каждой недели.
Заметим, что так как для дополненных периодов в результате запроса отсутствуют детальные записи, то дополненные записи будут получаться из выборки только в том случае, если при обходе выборки будут получаться все периоды, участвующие в запросе, что достигается установкой третьего параметра функции "Выбрать" результата запроса.
Пример:
Код 1C v 8.х ВыборкаПериод = Результат. Выбрать( ОбходРезультатаЗапроса. ПоГруппировкам, "Период" , "ВСЕ" ) ;
Пока ВыборкаПериод. Следующий( ) Цикл
ОбластьПериод. Параметры. Заполнить( ВыборкаПериод) ;
ТабДок. Вывести( ОбластьПериод, ВыборкаПериод. Уровень( ) ) ;
КонецЦикла ;
Категория:
Запросы Как получить количество ЛЕТ, МЕСЯЦЕВ, ДНЕЙ между датами ? Нужно получить разницу между
датами 31.12.2009 и
10.01.2005 и отобразить ее как:
4 года 11 месяцев 21 день
Код 1C v 8.х Процедура ТЕСТ_ВыполнитьНажатие(Кнопка)
ДатаНач = Дата( 2009 , 12 , 31 ) ;
ДатаКон = Дата( 2005 , 1 , 10 ) ;
Лет= 0 ; Мес= 0 ; Дн= 0 ;
РазобратьРазностьДат( ДатаНач, ДатаКон, Лет, Мес, Дн) ;
ЛетС = ФормаМножественногоЧисла( "год" , "года" , "лет" , Лет) ;
МесС = ФормаМножественногоЧисла( "месяц" , "месяца" , "месяцев" , Мес) ;
ДнС = ФормаМножественногоЧисла( "день" , "дня" , "дней" , Дн) ;
Сообщить( ? ( Лет> 0 , Строка( Лет) + " " + ЛетС, "" ) + " " + ? ( Мес> 0 , Строка( Мес) + " " + МесС, "" ) + " " + Строка( дн) + " " + ДнС) ;
КонецПроцедуры
Процедура РазобратьРазностьДат(Дата1, Дата2, Лет = 0, Месяцев = 0, Дней = 0)
Лет = 0 ;
Месяцев = 0 ;
Дней = 0 ;
Если Дата1 > Дата2 Тогда
ВременнаяДата = Дата1 ;
Если День( ВременнаяДата) < День( Дата2 ) Тогда
Дней = ( ВременнаяДата - ДобавитьМесяц( ВременнаяДата, - 1 ) ) / 86400 ;
ВременнаяДата = ДобавитьМесяц( ВременнаяДата, - 1 ) ;
КонецЕсли ;
Если Месяц( ВременнаяДата) < Месяц( Дата2 ) Тогда
ВременнаяДата = ДобавитьМесяц( ВременнаяДата, - 12 ) ;
Месяцев = 12 ;
КонецЕсли ;
Лет = Макс( Год( ВременнаяДата) - Год( Дата2 ) , 0 ) ;
Месяцев = Макс( Месяцев + Месяц( ВременнаяДата) - Месяц( Дата2 ) , 0 ) ;
Дней = Макс( Дней + День( ВременнаяДата) - День( Дата2 ) , 0 ) ;
Если Дата2 < > ( ДобавитьМесяц( Дата1 , - Лет * 12 - Месяцев) - Дней * 86400 ) Тогда
Дней = Дней + ( День( КонецМесяца( Дата2 ) ) - День( НачалоМесяца( Дата2 ) ) ) - ( День( КонецМесяца( ДобавитьМесяц( Дата1 , - 1 ) ) ) - День( НачалоМесяца( ДобавитьМесяц( Дата1 , - 1 ) ) ) ) ;
КонецЕсли ;
КонецЕсли ;
КонецПроцедуры
Функция ФормаМножественногоЧисла(Слово1, Слово2, Слово3, Знач ЦелоеЧисло)
Если ЦелоеЧисло < 0 Тогда
ЦелоеЧисло = - 1 * ЦелоеЧисло;
КонецЕсли ;
Если ЦелоеЧисло < > Цел( ЦелоеЧисло) Тогда
Возврат Слово2 ;
КонецЕсли ;
Остаток = ЦелоеЧисло%10 ;
Если ( ЦелоеЧисло > 10 ) И ( ЦелоеЧисло< 20 ) Тогда
Возврат Слово3 ;
ИначеЕсли Остаток= 1 Тогда
Возврат Слово1 ;
ИначеЕсли ( Остаток> 1 ) И ( Остаток< 5 ) Тогда
Возврат Слово2 ;
Иначе
Возврат Слово3 ;
КонецЕсли ;
КонецФункции
Категория:
Работа с Датами (Временем) Как вычислить разницу между двумя датами в днях Код 1C v 8.х РазницаВДнях = ( НачалоДня( ДатаОкончания) - НачалоДня( ДатаНачала) ) / ( 60 * 60 * 24 ) ;
Категория:
Работа с Датами (Временем) Функция ПредставлениеПериода() аналог 7-ной функции ПериодСтр() Функция позволяет формировать описание периода, заданного
датами начала и окончания на одном из языков, поддерживаемых платформой. Например, в результате выполнения следующего кода:
Код 1C v 8.2 УП ТекДата = ТекущаяДата( ) ;
НачПериода = НачалоМесяца( ТекДата) ;
КонПериода = КонецМесяца( ТекДата) ;
Сообщение = Новый СообщениеПользователю;
Сообщение. Текст = ПредставлениеПериода( НачПериода, КонПериода, "L=en_US" ) ;
Сообщение. Текст = ПредставлениеПериода( НачПериода, КонПериода, "L=ru_RU" ) ;
Сообщение. Сообщить( ) ;
будет получено представление периода на английском или русском языках!
Функция глобального контекста
ПредставлениеПериода() позволяет получить строковое представление периода, заданного
датами начала и окончания.
Например:
Код 1C v 8.х ПредставлениеПериода( '20050101000000 ', '20050101235959 ')
ПредставлениеПериода( '20050101000000 ', '20050131235959 ')
ПредставлениеПериода( '20050101000000 ', '20050228235959 ')
Кроме стандартных периодов эта функция позволяет получать представления так называемых финансовых периодов: первых девяти месяцев года и первого полугодия. Для этого используется форматная строка с указанием признака ФП:
Код 1C v 8.х ПредставлениеПериода( '20050101000000 ', '20050630235959 ', "ФП = Истина" )
ПредставлениеПериода( '20050101000000 ', '20050930235959 ', "ФП = Истина" )
Кроме этого форматная строка позволяет получать представление периода на языке, отличном от используемого по-умолчанию:
Код 1C v 8.х ПредставлениеПериода( '20050101000000 ', '20050331235959 ', "L = en_US" )
ПредставлениеПериода( '20050101000000 ', '20050331235959 ', "L = bg_BG" )
ПредставлениеПериода( '20050101000000 ', '20050331235959 ', "L = de_DE" )
Категория:
Работа с Датами (Временем) Функции для работы с датами через запрос (Разность, Добавление, Граница) Код 1C v 8.х
Функция ПолучитьРазностьДат(рНачДата,рКонДата,рВидРазности="ДЕНЬ" ) Экспорт
Если не ЗначениеЗаполнено( рНачДата) или не ЗначениеЗаполнено( рКонДата) Тогда Возврат - 1 КонецЕсли ;
Если рНачДата= рКонДата Тогда Возврат 0 КонецЕсли ;
строСтандПер= "СЕКУНДА МИНУТА ЧАС ДЕНЬ НЕДЕЛЯ ДЕКАДА МЕСЯЦ КВАРТАЛ ГОД" ;
Если Найти( строСтандПер, рВидРазности) = 0 Тогда рВидРазности= "ДЕНЬ" КонецЕсли ;
тз= "ВЫБРАТЬ РАЗНОСТЬДАТ(&НачДата,&КонДата," + СокрЛП( рВидРазности) + ")+1 КАК ПериодовВремени" ;
з= Новый Запрос( тз) ;
Если рВидРазности= "СЕКУНДА" или рВидРазности= "МИНУТА" или рВидРазности= "ЧАС" Тогда
Если рНачДата> рКонДата Тогда
рПервая= рКонДата; рВторая= рНачДата; коэф= - 1 ;
Иначе
рПервая= рНачДата; рВторая= рКонДата; коэф= 1 ;
КонецЕсли ;
Иначе
Если рНачДата> рКонДата Тогда
рПервая= НачалоДня( рКонДата) ; рВторая= НачалоДня( рНачДата) ; коэф= - 1 ;
Иначе
рПервая= НачалоДня( рНачДата) ; рВторая= НачалоДня( рКонДата) ; коэф= 1 ;
КонецЕсли ;
КонецЕсли ;
Попытка
з. УстановитьПараметр( "НачДата" , рПервая) ;
з. УстановитьПараметр( "КонДата" , рВторая) ;
рРезультат= з. Выполнить( ) . Выгрузить( ОбходРезультатаЗапроса. Прямой) . Получить( 0 ) . ПериодовВремени;
Если ТипЗнч( рРезультат) < > Тип( "Число" ) Тогда Возврат - 1 Иначе Возврат коэф* рРезультат КонецЕсли ;
Исключение
Возврат - 1
КонецПопытки ;
КонецФункции
Функция ДобавитьКДате(рДата,рРазность,рВидРазности="ДЕНЬ" ) Экспорт
Если рРазность= 0 Тогда Возврат рДата КонецЕсли ;
строСтандПер= "СЕКУНДА МИНУТА ЧАС ДЕНЬ НЕДЕЛЯ ДЕКАДА МЕСЯЦ КВАРТАЛ ГОД" ;
Если Найти( строСтандПер, рВидРазности) = 0 Тогда рВидРазности= "ДЕНЬ" КонецЕсли ;
тз= "ВЫБРАТЬ ДОБАВИТЬКДАТЕ(&УслДата," + СокрЛП( рВидРазности) + ",&УслРазность) КАК РезДата" ;
з= Новый Запрос( тз) ;
з. УстановитьПараметр( "УслДата" , рДата) ;
з. УстановитьПараметр( "УслРазность" , рРазность) ;
рРезультат= з. Выполнить( ) . Выгрузить( ОбходРезультатаЗапроса. Прямой) . Получить( 0 ) . РезДата;
Если ТипЗнч( рРезультат) < > Тип( "Дата" ) Тогда Возврат Дата( 1 , 1 , 1 ) Иначе Возврат рРезультат КонецЕсли ;
КонецФункции
Функция ГраницаПериода(рДата,рВидПериода="ДЕНЬ" ,рВидГраницы) Экспорт
строСтандПер= "СЕКУНДА МИНУТА ЧАС ДЕНЬ НЕДЕЛЯ ДЕКАДА МЕСЯЦ КВАРТАЛ ГОД" ;
Если Найти( строСтандПер, рВидПериода) = 0 Тогда рВидПериода= "ДЕНЬ" КонецЕсли ;
Если Найти( ВРег( рВидГраницы) , "НАЧ" ) < > 0 Тогда
рГраница= "НАЧАЛОПЕРИОДА" ;
ИначеЕсли Найти( ВРег( рВидГраницы) , "КОН" ) < > 0 Тогда
рГраница= "КОНЕЦПЕРИОДА" ;
Иначе
Возврат рДата;
КонецЕсли ;
тз= "ВЫБРАТЬ " + рГраница+ "(&УслДата," + СокрЛП( рВидПериода) + ") КАК РезДата" ;
з= Новый Запрос( тз) ;
з. УстановитьПараметр( "УслДата" , рДата) ;
рРезультат= з. Выполнить( ) . Выгрузить( ОбходРезультатаЗапроса. Прямой) . Получить( 0 ) . РезДата;
Если ТипЗнч( рРезультат) < > Тип( "Дата" ) Тогда Возврат Дата( 1 , 1 , 1 ) Иначе Возврат рРезультат КонецЕсли ;
КонецФункции
Категория:
Работа с Датами (Временем) Формат, функция форматирования значений Код 1C v 8.х
ЗначФормат = Формат( 123456.789 , "ЧЦ=10; ЧДЦ=2" ) ;
ЗначФормат = Формат( 123456.789 , "ЧГ=0; ЧДЦ=2" ) ;
ЗначФормат = Формат( 123456.789 , "ЧРД='-'" ) ;
ЗначФормат = Формат( - 123456.789 , "ЧО=0" ) ;
ЗначФормат = Формат( 13 , "ЧЦ=5; ЧВН=; ЧГ=0" ) ;
ЧислоПрописью( Сумма, "L=ru_RU" , Валюта. ПараметрыПрописиНаРусском)
ЧислоПрописью( 1457.25 , "L=en_US" , "dollar, dollars, cent, cents, 2" ) ;
ЧислоПрописью( Сумма, "Рубль,рубля,рублей,м,копейка,копейки,копеек,ж,2" ) ;
ЗначФормат = Формат( 25021949 , "ЧЦ=8; ЧРГ=.; ЧВН=; ЧГ=4,2,0" ) ;
ЗначФормат = Формат( '20020820153309 ', "ДФ="" дд ММММ гггг 'г.' ЧЧ:мм:сс"" " ) ;
ЗначФормат = Формат( '20020820153309 ', "ДФ="" дд/ММ-гггг"" " ) ;
ЗначФормат = Формат( '20020820153309 ', "ДФ='q "" кв."" yyyy'" ) ;
ЗначФормат = Формат( '20020820153309 ', "ДФ='"" Итого"" q "" квартал"" '" ) ;
ЗначФормат = Формат( '20020820153309 ', "ДФ='ММММ гггг'" ) ;
ЗначФормат = Формат( '20020820153309 ', "ДЛФ=ДД" ) ;
ЗначФормат = Формат( '20020820153309 ', "ДЛФ=Д" ) ;
ЗначФормат = Формат( '20020820153309 ', "ДЛФ=В" ) ;
ЗначФормат = Формат( '20020820153309 ', "ДФ=HHmmssyyyyMMdd" ) ;
ЗначФормат = Формат( '20020820153309 ', "ДФ=HH:mm:ss yyyy MM dd" ) ;
ЗначФормат = Формат( '20020820153309 ', "ДФ=hh:mm:ss yyyy MM dd" ) ;
Формат( Дата( 2009 , 1 , 1 ) , "ДЛФ=DD" ) + ", " + ОпределитьДеньНедели( ДеньНедели( Дата( 2009 , 1 , 1 ) ) ) ;
Формат( Дата( 2009 , 1 , 1 ) , "ДФ=ММММ" ) + ", " + Формат( Дата( 2009 , 1 , 1 ) , "ДФ=yyyy" ) + " г." ;
Формат( НачалоНедели( Дата( 2009 , 1 , 1 ) ) , "ДФ='dd MMMM yyyy'" ) + " г. - " + Формат( КонецНедели( Дата( 2009 , 1 , 1 ) ) , "ДФ='dd MMMM yyyy'" ) + " г." ;
Строка( Цел( День( Дата( '20020820153309 ') ) / 10 ) + 1 ) + " декада" = 2 декада
ЗначФормат = Формат( Истина , "БЛ=Отсутствует; БИ=Доступен" ) ;
ЗначФормат = Формат( Ложь , "БЛ=Нет; БИ=Да" ) ;
Код 1C v 7.x
ЗначФормат = Формат( 123.15 , "Ч(0)10.2" )
Долг = Строка( Формат( Долг( ) , "Ч12.2" ) ) + " " + Валюта. Сокр_назв;
ИтогоСуммаПрописью = Формат( Итог( "Сумма" ) , "ЧПДС" ) ;
КоличествоНаименованийПрописью = Формат( КоличествоСтрок( ) , "ЧП" ) ;
ДатаДокумента = Формат( Док. ДатаДок, "Д ДД.ММ.ГГ" ) ;
ДатаДокумента = Формат( "01.01.1999" , "Д(0)ДДММММГГГГ" ) ;
Категория:
Встроенные Функции Как вычислить разницу между двумя датами в месяцах Код 1C v 8.х
Функция РазницаДатВМесяцах(Дата1, Дата2) Экспорт
ДатаНач = ? ( Дата1 < Дата2 , Дата1 , Дата2 ) ;
ДатаКон = ? ( Дата1 < Дата2 , Дата2 , Дата1 ) ;
Годы = Год( датаКон ) - Год( датаНач ) ;
Месяцы = Месяц( датаКон ) - Месяц( датаНач ) ;
Разность = месяцы + годы * 12 ;
Возврат Разность;
КонецФункции
Категория:
Работа с Датами (Временем)