1с запрос количество дней в месяце

Функции языка запросов 1С. Работа с датами

Функции работы с датами

Дата — один из примитивных типов данных в системе 1С:Предприятие. Дата всегда имеет формат год, месяц, день, час, минута, секунда. Таким образом, переменная типа дата содержит не только дату, но и время.

Одной из первых моих статей в этой рубрике была небольшая шпаргалка по работе с датами, но о датах в запросах там было написано очень мало. В запросах 1С с датами приходится работать довольно часто, особенно когда запрос строится к объектам метаданных в которых содержится периодическая информация. Как правило это регистры (сведений, накопления, расчета, бухгалтерии).

Функция Год

Функция Квартал

Возвращает номер квартала даты (целочисленное значение от 1 до 4)

Предположим, в ЗаказПокупателя передаем заказ №100 от 12.03.2016, в этом случае наш запрос вернет НомерКвартала = 1

Функция Месяц

Принимает параметр типа ДАТА. Возвращает номер месяца даты (целочисленное значение от 1 до 12).

Функция ДеньГода

Принимает параметр типа ДАТА. Возвращает номер дня в году (целочисленное значение от 1 до 366).

Запрос вернет — 175

Функция День

Принимает параметр типа ДАТА. Возвращает номер дня в месяце (целочисленное значение от 1 до 31).

Функция Неделя

Принимает параметр типа ДАТА. Возвращает номер недели в году.

Функция ДеньНедели

Принимает параметр типа ДАТА. Возвращает номер дня недели (целочисленной значение от 1 (понедельник) до 7 (воскресенье)).

Функция Час

Принимает параметр типа ДАТА. Возвращает час суток (целочисленное значение от 0 до 23).

Функция Минута

Принимает параметр типа ДАТА. Возвращает минуты часа (целочисленное значение от 0 до 59).

Функция Секунда

Принимает параметр типа ДАТА. Возвращает секунды минуты (целочисленное значение от 0 до 59).

Функция НачалоПериода

Функция возвращает для указанной даты начало периода в который она входит. Период может принимать следующие значения: МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД, ДЕКАДА, ПОЛУГОДИЕ

Запрос вернет – 01.06.2016

Функция КонецПериода

Функция возвращает для указанной даты конец периода в который она входит. Период может принимать следующие значения: МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД, ДЕКАДА, ПОЛУГОДИЕ

Запрос вернет – 30.06.2016

Функция ДобавитьКДате

Функция добавляет к дате указанное количество временных интервалов.

Получаем дату 15.10.2016 0:00:00 Очень удобно, что не приходится задумываться о количестве дней в месяцах.
Количество может быть и отрицательным. Тогда отсчет интервала производится в обратную сторону.

Функция РазностьДат

Функция рассчитывает календарную разницу между двумя датами и ее нельзя использовать в местах, где необходимо рассчитать банковских или рабочих дней. Тип может принимать следующие значения: МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД, ДЕКАДА, ПОЛУГОДИЕ

Источник

помогите найти количество дней в месяце

Форум 1С: Одинэс.Ру

помогите найти количество дней в месяце

мне нужно узнать сколько дней в месяце, за который формируется отчет, т.е. если за январь, то 31, если за февраль, то 28, или может быть есть для этого какая либо функция?
вообще сначала идет запрос по РегиструНакопления ОстаткиИОбороты с периодичностью = день, нужно после выполнения запроса еще найти и количество дней в месяце

Интересные темы

Re: помогите найти количество дней в месяце

Re: помогите найти количество дней в месяце

пишет сообщение (преобразование к числу типа дата не может быть выполнено)

Re: помогите найти количество дней в месяце

отчет:
Макет = ОтчетОбъект.ПолучитьМакет(«НулевыеОстатки»);
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура КАК Номенклатура,
| ПРЕДСТАВЛЕНИЕ(ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура),
| ОстаткиНоменклатурыОстаткиИОбороты.Период КАК Период,
| 0 КАК КоличествоНулевыхДней,
| ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты(&Нач, &Кон, День, ДвиженияИГраницыПериода, ) КАК ОстаткиНоменклатурыОстаткиИОбороты
|ИТОГИ
| СУММА(КоличествоНулевыхДней)
|ПО
| Номенклатура»;

Запрос.УстановитьПараметр(«Кон», Кон);
Запрос.УстановитьПараметр(«Нач», Нач);

ОбластьЗаголовок = Макет.ПолучитьОбласть(«Заголовок»);
ОбластьПодвал = Макет.ПолучитьОбласть(«Подвал»);
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть(«ШапкаТаблицы»);
ОбластьПодвалТаблицы = Макет.ПолучитьОбласть(«ПодвалТаблицы»);
ОбластьНоменклатура = Макет.ПолучитьОбласть(«Номенклатура»);
ОбластьПериод = Макет.ПолучитьОбласть(«Период»);

ТабДок.Очистить();
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Вывести(ОбластьШапкаТаблицы);
ТабДок.НачатьАвтогруппировкуСтрок();

ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
КоличествоНулевыхДней=0;
КоличествоДнейВМесяце = День(КонецМесяца(ВыборкаНоменклатура.Период));

Пока ВыборкаНоменклатура.Следующий() Цикл

ОбластьНоменклатура.Параметры.Заполнить(ВыборкаНоменклатура);
ТабДок.Вывести(ОбластьНоменклатура, ВыборкаНоменклатура.Уровень());

Пока ВыборкаПериод.Следующий() Цикл
//посчитаем количество дней, когда товар был на складе
//вставка
Если ВыборкаПериод.Остаток =0 Тогда
КоличествоНулевыхДней=КоличествоНулевыхДней+1;
КонецЕсли;
//конец вставка
ОбластьПериод.Параметры.Заполнить(ВыборкаПериод);
ОбластьПериод.Параметры.КоличествоНулевыхДней=КоличествоНулевыхДней;
ТабДок.Вывести(ОбластьПериод, ВыборкаПериод.Уровень());
КонецЦикла;
//Сообщить(КоличествоНулевыхДней);
КонецЦикла;

ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал);

Источник

Еще раз о рабочих днях. Быстрый способ расчета в запросах

Работа с производственными календарями, рабочими графиками часто встречается в практике разработки. Большинство задач можно свести к двум: 1) Добавить к дате (отнять от даты) некоторое количество рабочих дней и 2) найти разницу в рабочих днях между двумя датами. Несмотря на кажущуюся простоту, в этих задачах достаточно подводных камней, как методических, так и технологических. Естественно эта тема не была обойдена вниманием разработчиков типовых конфигураций и членов нашего сообщества. Простой поиск дает несколько результатов:

На мой взгляд, предлагаемые решения обладают теми или иными недостатками. В их числе:

Предлагаю свой вариант решения.

Постановка задачи:

Предположим, на предприятии ведется учет выполняемых работ. Каждая работа выполняется целое число дней, всегда начинается в начале дня, а заканчивается через несколько дней в конце дня. Продолжительность работ может быть от 1 дня, до нескольких лет (важность условия этого будет упомянута ниже). Необходимо иметь инструмент, позволяющий выполнять расчеты дат начала, окончания работ, продолжительностей работ, временных промежутков между работами. Все расчеты выполнять в рабочих днях. Решение должно позволять использование его в запросах.

Решение:

Решение поставленной задачи неожиданно получилось довольно простым.

Для учета рабочих графиков (производственных календарей) используем вспомогательный регистр сведений:

1с запрос количество дней в месяце

Регистр необходимо заполнить на весь период, в пределах которого будут производится расчеты.

1с запрос количество дней в месяце

Теперь для нахождения разницы дат нам надо в регистре найти два числа, соответствующие этим датам и определить их разницу. Для добавления к дате некоторого числа рабочих дней, надо в регистре найти соответствующее дате число, добавить к нему число рабочих дней, и по результату найти в регистре соответствующую дату рабочего дня. Осталось учесть упомянутые выше сложности и получим следующее:

Примеры использования

Как видим запросы получаются довольно простыми, не используются ни временные таблицы, ни группировки с агрегатными функциями, ни постобработка. Ничего не мешает производить расчет в запросе для нескольких записей. В прилагаемом файле реализован пример отчета по выполненным работам: дана дата начала, предполагаемая плановая продолжительность работы и фактическая дата завершения, определяется плановая дата завершения и отставание факта от плана.

1с запрос количество дней в месяце

Может возникнуть вопрос: оправдано ли с точки зрения производительности использование дополнительного регистра такой структуры, ведь при изменении флага рабочего/выходного дня надо пересчитывать все записи с большей датой? Я считаю, что вполне. Во-первых, изменение производственного календаря происходит обычно не чаще одного раза в месяц, а полный пересчет и сохранение набора записей за 100 лет(

40000 записей) по выбранному графику занимает считанные секунды. А во-вторых, выгода от использования быстрого массового расчета как правило с лихвой перекроет все время, потраченное на предварительную подготовку.

А что же БСП?

Опытный разработчик, использующий БСП, может сказать: «Так ведь в БСП реализовано почти что то же самое!». Да, действительно в БСП есть аналогичный регистр:

1с запрос количество дней в месяце

UPD 25.06.2019:

К статье приложена информационная база, в которой реализован описанный функционал, примеры отчетов, а также процедура заполнения и пересчета регистра.

Источник

Список дат произвольного месяца в запросе

Для разворачивания остатков/приходов/расходов на каждую дату месяца в запросе требуется как минимум список дат месяца. Порывшись в интернете я нашел советы использовать для этого: а) РегистрСведений.КурсыВалют (не айс решение) б)РегистрСведений.РегламентированныйПроизводственный1Календарь (уже лучше, если он у Вас есть в конфигурации) в)заполнить список в цикле и подтянуть его в запрос (тривиально довольно) Мое решение самому создать список дат в запросе:

ВЫБРАТЬ
таб.Даты
ИЗ
(ВЫБРАТЬ
НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ) КАК Даты
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 1)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 2)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 3)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 4)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 5)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 6)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 7)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 8)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 9)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 10)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 11)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 12)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 13)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 14)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 15)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 16)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 17)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 18)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 19)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 20)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 21)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 22)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 23)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 24)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 25)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 26)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 27)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ВЫБОР
КОГДА ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 28) > КОНЕЦПЕРИОДА(&дат1, МЕСЯЦ)
ТОГДА ДАТАВРЕМЯ(1, 1, 1)
ИНАЧЕ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 28)
КОНЕЦ
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ВЫБОР
КОГДА ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 29) > КОНЕЦПЕРИОДА(&дат1, МЕСЯЦ)
ТОГДА ДАТАВРЕМЯ(1, 1, 1)
ИНАЧЕ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 29)
КОНЕЦ
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ВЫБОР
КОГДА ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 30) > КОНЕЦПЕРИОДА(&дат1, МЕСЯЦ)
ТОГДА ДАТАВРЕМЯ(1, 1, 1)
ИНАЧЕ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 30)
КОНЕЦ) КАК таб
ГДЕ
таб.Даты <> ДАТАВРЕМЯ(1, 1, 1)

Можно было бы и по короче (выкинув средину), но большинству будет удобней просто скопировать в КонсольЗапросов код запроса. От сюда не далеко до списка за интервал дат месяца, за несколько месяцев. Предлагаю обсудить возможность более компактного построения запроса и другие способы получения списка дат в запросе.

Источник

Запросы 1С:Предприятие 8. Функции работы с датами

В запросах 1С, так же как и во встроенном языке платформы 1С:Предприятие, есть функции для работы с датами. Они помогают упростить преобразования дат в запросах, избежать использования большого количества параметров. Рассмотрим эти функции.

Как задать дату в запросах 1С в виде константы

Для этого используется функция ДАТАВРЕМЯ (Год, Месяц, День, Час, Минута, Секунда). Параметры Год, Месяц и День являются обязательными, остальные — нет. Если не указать время, то системой будет установлено начало дня.

Кроме того, в качестве параметров этой функции могут быть указаны только числа в явном виде. Нельзя в качестве параметров указывать значения других функций. Например, такая конструкция работать не будет:

Как получить начало или конец года, полугодия, квартала, месяца, декады, недели, дня, часа, минуты в запросах 1С

Для этого используются соответственно функции:

В качестве параметра Дата передается значение с типом Дата. Параметр Период может принимать одно из следующих значений: МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, ДЕКАДА, МЕСЯЦ, КВАРТАЛ, ПОЛУГОДИЕ, ГОД.

Как видно из примеров, в этих функциях можно использовать другие, вложенные, функции.

Как получить в запросах 1С год, день года, квартал, месяц, неделю, день недели, день, час, минуту, секунду из даты

Для этого существуют соответствующие функции, в которые нужно передать дату в качестве параметра.

Как добавить к дате или отнять от даты год, полугодие, квартал, месяц, декаду, неделю, день, час, минуту, секунду в запросах 1С

Для этого используется функция ДобавитьКДате (Дата, Период, Значение).

В качестве параметра Дата передается значение с типом Дата. Параметр Период может принимать одно из следующих значений: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, ДЕКАДА, МЕСЯЦ, КВАРТАЛ, ПОЛУГОДИЕ, ГОД.

Параметр Значение показывает количество добавляемых периодов. Если период нужно вычесть, то параметр Значение должен быть отрицательным.

Как вычислить разность дат в запросах 1С

Для этого используется функция РазностьДат (Дата1, Дата2, Период).

Параметр Дата1 — дата, которую вычитают.

Параметр Дата2 — дата, из которой вычитают.

Параметр Период может принимать одно из следующих значений: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, МЕСЯЦ, КВАРТАЛ, ГОД. Он показывает, в каких единицах мы хотим получить результат

Во всех функциях, кроме функции ДАТАВРЕМЯ, в качестве параметра Дата может выступать не только конкретное значение даты (константа или параметр запроса), но и поля таблицы источника.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *