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

Ребята, помогите по работе с датами

Автор Алексей_1985_06, 06 дек 2021, 20:18

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

Алексей_1985_06

Всем доброго времени суток!
Вообщем необходимо выводить список сотрудников у которых день рождения в текущей недели (динамический список), написал код, но в таком случае неправильно выводится сотрудники, если например неделя с 27.12.2021 по 02.01.2022 - то выводятся сотрудники у которых ДР, например 26.01.1957 что не соответствует действительности. Подскажите что нужно исправить, или может по другому надо это реализовать? У неравнодушных прошу помощи!

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

// 1. ДНИ РОЖДЕНИЯ НА ЭТОЙ НЕДЕЛИ:

// Например:     06.12.2021
                 
НН =  НачалоНедели(ТекущаяДатаСеанса());  // начало недели
ДеньНачалаНедели = День(НН); // 06
МесяцНачалаНедели = Месяц(НН); // 12

КН =  КонецНедели(ТекущаяДатаСеанса()); // конец недели
ДеньКонцаНедели = День(КН); // 12
МесяцКонецНедели = Месяц(КН); // 12

// Создаем массив
МассивДней = Новый Массив;
МассивМесяцев = Новый Массив;

// Помещаем данные в массив
Для НомерДня = ДеньНачалаНедели по ДеньКонцаНедели Цикл
МассивДней.Добавить(НомерДня);
КонецЦикла;

Для НомерМесяца = МесяцНачалаНедели по МесяцКонецНедели Цикл
МассивМесяцев.Добавить(НомерМесяца);
КонецЦикла;

// Установка параметров для динамического списка :
ДинамСписокНеделя.Параметры.УстановитьЗначениеПараметра("МассивДней", МассивДней);
ДинамСписокНеделя.Параметры.УстановитьЗначениеПараметра("МассивМесяцев", МассивМесяцев);

КонецПроцедуры

Запрос динамического списка:
ВЫБРАТЬ
Сотрудники.Фамилия + " " + Сотрудники.Имя + " " + Сотрудники.Отчество КАК ФИО,
Сотрудники.ДатаРожденияСотрудника КАК ДатаРожденияСотрудника
ИЗ
Справочник.Сотрудники КАК Сотрудники
ГДЕ
ДЕНЬ(Сотрудники.ДатаРожденияСотрудника) В (&МассивДней) И
МЕСЯЦ(Сотрудники.ДатаРожденияСотрудника) В (&МассивМесяцев)


antoneus

А так?

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
       
// 1. ДНИ РОЖДЕНИЯ НА ЭТОЙ НЕДЕЛЕ:
   
     // Например:     06.12.2021
                             
    НН =  НачалоНедели(ТекущаяДатаСеанса());      // начало недели
    ДеньНачалаНедели = ДеньГода(НН);               
       
    КН =  КонецНедели(ТекущаяДатаСеанса());     // конец недели
    ДеньКонцаНедели = ДеньГода(КН);                 

// Создаем массив   
МассивДней = Новый Массив;

// Помещаем данные в массив
    Для НомерДня = ДеньНачалаНедели по ДеньКонцаНедели Цикл
        МассивДней.Добавить(НомерДня);
    КонецЦикла;

// Установка параметров для динамического списка :
ДинамСписокНеделя.Параметры.УстановитьЗначениеПараметра("МассивДней", МассивДней);

КонецПроцедуры


ВЫБРАТЬ
    Сотрудники.Фамилия + " " + Сотрудники.Имя + " " + Сотрудники.Отчество КАК ФИО,
    Сотрудники.ДатаРожденияСотрудника КАК ДатаРожденияСотрудника
ИЗ
    Справочник.Сотрудники КАК Сотрудники
ГДЕ
    ДЕНЬГОДА(Сотрудники.ДатаРожденияСотрудника) В (&МассивДней)

LexaK

antoneus, нет, не так, задача же с подвохом! неделя на переломе года, поэтому другой алгоритм получения дней года нужен,
например такой

ДатаНачала = Дата(2021,12,27);                           
// Создаем массив   
МассивДней = Новый Массив;
// Помещаем данные в массив
Для ДниНедели = 0 по 6 Цикл
МассивДней.Добавить(ДеньГода(ДатаНачала + (ДниНедели * 24 * 3600)));
КонецЦикла;

а дальше МассивДней в виде параметра в динамический список передать,

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

Алексей_1985_06

LexaK, да, Вы совершенно правы, подскажите как правильно реализовать пару день+месяц, чтобы избежать казуса в високосным годом? Сейчас действительно проблема только с високосным годом, ошибка на один день происходит  :dfbbdrfb:  :dfbbdrfb:  :dfbbdrfb:

Сейчас код такой:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// ДНИ РОЖДЕНИЯ НА ЭТОЙ НЕДЕЛИ:

ДатаНачала = НачалоНедели(ТекущаяДатаСеанса()); // получаем начало текущей недели

МассивДней = Новый Массив; // создаем массив из номеров дней года для текущей недели
МассивМесяцев = Новый Массив; // создаем массив из номеров месяцев для текущей недели

Для ДеньНедели = 0 по 6 Цикл
МассивМесяцев.Добавить(Месяц(ДатаНачала + (ДеньНедели * 86400))); // массив из месяцев за текущую неделю
    МассивДней.Добавить(ДеньГода(ДатаНачала + (ДеньНедели * 86400))); // массив из номеров дней за текущую неделю
КонецЦикла;

// Установка параметров для динамического списка:
ДинамСписокНеделя.Параметры.УстановитьЗначениеПараметра("МассивДней", МассивДней);
ДинамСписокНеделя.Параметры.УстановитьЗначениеПараметра("МассивМесяцев", МассивМесяцев);

КонецПроцедуры

Произвольный запрос в динам.списке:
ВЫБРАТЬ
Сотрудники.Фамилия + " " + Сотрудники.Имя + " " + Сотрудники.Отчество КАК ФИО,
Сотрудники.ДатаРожденияСотрудника КАК ДатаРожденияСотрудника
ИЗ
Справочник.Сотрудники КАК Сотрудники
ГДЕ
ДЕНЬГОДА(Сотрудники.ДатаРожденияСотрудника) В (&МассивДней) И
МЕСЯЦ(Сотрудники.ДатаРожденияСотрудника) В (&МассивМесяцев)

LexaK

Алексей_1985_06, дааа, вроде простенькая задачка, да и подсказка была: Использовать Месяц и День - парами!
вот примерное решение, попробуйте так
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// ДНИ РОЖДЕНИЯ НА ЭТОЙ НЕДЕЛИ:

ДатаНачала = НачалоНедели(ТекущаяДатаСеанса()); // получаем начало текущей недели

МассивДней = Новый Массив; // создаем массив из номеров дней года для текущей недели
//МассивМесяцев = Новый Массив; // создаем массив из номеров месяцев для текущей недели

Для ДеньНедели = 0 по 6 Цикл
лкДата = ДатаНачала + (ДеньНедели * 86400);
    МассивДней.Добавить(Месяц(лкДата) * 100 + День(лкДата)); // массив из месяц + день за текущую неделю
КонецЦикла;

// Установка параметров для динамического списка:
ДинамСписокНеделя.Параметры.УстановитьЗначениеПараметра("МассивДней", МассивДней);
//ДинамСписокНеделя.Параметры.УстановитьЗначениеПараметра("МассивМесяцев", МассивМесяцев);

КонецПроцедуры

//запрос динамического списка с Одним параметром!
ВЫБРАТЬ
    Сотрудники.Фамилия + " " + Сотрудники.Имя + " " + Сотрудники.Отчество КАК ФИО,
    Сотрудники.ДатаРожденияСотрудника КАК ДатаРожденияСотрудника
ИЗ
    Справочник.Сотрудники КАК Сотрудники
ГДЕ
    МЕСЯЦ(Сотрудники.ДатаРожденияСотрудника) * 100 + День(Сотрудники.ДатаРожденияСотрудника) В (&МассивДней)


 
если помогло нажмите: Спасибо!

Алексей_1985_06

Цитата: LexaK от 08 дек 2021, 10:14Алексей_1985_06, дааа, вроде простенькая задачка, да и подсказка была: Использовать Месяц и День - парами!
вот примерное решение, попробуйте так
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// ДНИ РОЖДЕНИЯ НА ЭТОЙ НЕДЕЛИ:

ДатаНачала = НачалоНедели(ТекущаяДатаСеанса()); // получаем начало текущей недели

МассивДней = Новый Массив; // создаем массив из номеров дней года для текущей недели
//МассивМесяцев = Новый Массив; // создаем массив из номеров месяцев для текущей недели

Для ДеньНедели = 0 по 6 Цикл
лкДата = ДатаНачала + (ДеньНедели * 86400);
    МассивДней.Добавить(Месяц(лкДата) * 100 + День(лкДата)); // массив из месяц + день за текущую неделю
КонецЦикла;

// Установка параметров для динамического списка:
ДинамСписокНеделя.Параметры.УстановитьЗначениеПараметра("МассивДней", МассивДней);
//ДинамСписокНеделя.Параметры.УстановитьЗначениеПараметра("МассивМесяцев", МассивМесяцев);

КонецПроцедуры

//запрос динамического списка с Одним параметром!
ВЫБРАТЬ
    Сотрудники.Фамилия + " " + Сотрудники.Имя + " " + Сотрудники.Отчество КАК ФИО,
    Сотрудники.ДатаРожденияСотрудника КАК ДатаРожденияСотрудника
ИЗ
    Справочник.Сотрудники КАК Сотрудники
ГДЕ
    МЕСЯЦ(Сотрудники.ДатаРожденияСотрудника) * 100 + День(Сотрудники.ДатаРожденияСотрудника) В (&МассивДней)


 
LexaK, Вы профессионал своего дела! Спасибо Вам огромное!!!!

Теги:

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

Рейтинг@Mail.ru

Поиск