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

Даты рождений контрагентов

Автор 141219, 02 янв 2016, 18:12

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

141219

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

Процедура СформироватьДниРождения() Экспорт
         //----Вычисление Дней Рождения и Дней Перечисления Пенсий ----
    Д = ТекущаяДата();
    Т = Формат(Д,"ДЛФ =ДД");   //-----Формат Даты 20 января 2001 год.---
    Сообщить( " Сегодня  --  " + Т);
   
          // --------Дни Рождения Контрагентов--------------------------
         
   Выборка = Справочники.Контрагенты.Выбрать();
   Пока Выборка.Следующий() Цикл
      Если Выборка.ЭтоГруппа Тогда Продолжить;
      КонецЕсли;
      Если Месяц(ТекущаяДата()) = Месяц(Выборка.ДатаРождения) И
         //Г = Год(ТекущаяДата()) - Год(Выборка.ДатаРождения) И
          День(ТекущаяДата()) = День(Выборка.ДатаРождения) Тогда
          Сообщить("Сегодня  исполнилось " + ( Год(ТекущаяДата()) - Год(Выборка.ДатаРождения)) + "  лет  " +  Выборка.Наименование);
      ИначеЕсли Месяц(ТекущаяДата()) = Месяц(Выборка.ДатаРождения) И
          День(ТекущаяДата()) + 1 = День(Выборка.ДатаРождения) Тогда
           Сообщить("Завтра  исполняется  " +( Год(ТекущаяДата()) - Год(Выборка.ДатаРождения) + 1) + "  лет  "+  Выборка.Наименование);
      ИначеЕсли Месяц(ТекущаяДата()) = Месяц(Выборка.ДатаРождения) И
          День(ТекущаяДата())+ 2 = День(Выборка.ДатаРождения) Тогда
           Сообщить("Послезавтра   исполняется  " +( Год(ТекущаяДата()) - Год(Выборка.ДатаРождения) + 1) + "  лет  "+  Выборка.Наименование);
      ИначеЕсли Месяц(ТекущаяДата()) = Месяц(Выборка.ДатаРождения) И
          День(ТекущаяДата()) - 1 = День(Выборка.ДатаРождения) Тогда
             Сообщить("Вчера исполнилось " + ( Год(ТекущаяДата()) - Год(Выборка.ДатаРождения)) + "  лет  " +  Выборка.Наименование);
      ИначеЕсли Месяц(ТекущаяДата()) = Месяц(Выборка.ДатаРождения) И
          День(ТекущаяДата()) - 2 = День(Выборка.ДатаРождения) Тогда
             Сообщить("Позавчера исполнилось " + ( Год(ТекущаяДата()) - Год(Выборка.ДатаРождения)) + "  лет  " +  Выборка.Наименование);
      //Иначе Сообщить (" Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ");
   КонецЕсли;
КонецЦикла;


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


Хотел добавить строку "Год(ТекущаяДата()) - Год(Выборка.ДатаРождения) > 150 ......., но 10-е чувство подсказывает, что это не правильно. Что скажете?

TerverVl

Цитировать
Месяц(ТекущаяДата()) = Месяц(Выборка.ДатаРождения)
Изначально это место при следующих данных: День рождения 01.01.2016, текущая дата 31.12.2015 должно выдавать неверный результат:
Т.е. в коде не учитывается что месяцы могут быть разные, но разница в днях должна попадать в условие.

141219

Цитата: TerverVl от 02 янв 2016, 19:02
Цитировать
Месяц(ТекущаяДата()) = Месяц(Выборка.ДатаРождения)
Изначально это место при следующих данных: День рождения 01.01.2016, текущая дата 31.12.2015 должно выдавать неверный результат:
Т.е. в коде не учитывается что месяцы могут быть разные, но разница в днях должна попадать в условие.
Прошу прощенья, но не уловил Вашу мысль.
Добавлено: 02 янв 2016, 22:03


В общем сделал так:

   Выборка = Справочники.Контрагенты.Выбрать();
   Пока Выборка.Следующий() Цикл
      Если Выборка.ЭтоГруппа Тогда Продолжить;
      КонецЕсли;
      Если Месяц(ТекущаяДата()) = Месяц(Выборка.ДатаРождения) И
         //Г = Год(ТекущаяДата()) - Год(Выборка.ДатаРождения) И
          День(ТекущаяДата()) = День(Выборка.ДатаРождения) И
          ( Год(ТекущаяДата()) - Год(Выборка.ДатаРождения)) < 105 Тогда
          Сообщить("Сегодня  исполнилось " + ( Год(ТекущаяДата()) - Год(Выборка.ДатаРождения)) + "  лет  " +  Выборка.Наименование);
      ИначеЕсли Месяц(ТекущаяДата()) = Месяц(Выборка.ДатаРождения) И
          День(ТекущаяДата()) + 1 = День(Выборка.ДатаРождения) И
           ( Год(ТекущаяДата()) - Год(Выборка.ДатаРождения)) < 105 Тогда
           Сообщить("Завтра  исполняется  " +( Год(ТекущаяДата()) - Год(Выборка.ДатаРождения) + 1) + "  лет  "+  Выборка.Наименование);
      ИначеЕсли Месяц(ТекущаяДата()) = Месяц(Выборка.ДатаРождения) И
          День(ТекущаяДата())+ 2 = День(Выборка.ДатаРождения) И
           ( Год(ТекущаяДата()) - Год(Выборка.ДатаРождения)) < 105 Тогда
           Сообщить("Послезавтра   исполняется  " +( Год(ТекущаяДата()) - Год(Выборка.ДатаРождения) + 1) + "  лет  "+  Выборка.Наименование);
      ИначеЕсли Месяц(ТекущаяДата()) = Месяц(Выборка.ДатаРождения)  И
          День(ТекущаяДата()) - 1 = День(Выборка.ДатаРождения)
          И  ( Год(ТекущаяДата()) - Год(Выборка.ДатаРождения)) < 105 Тогда
             Сообщить("Вчера исполнилось " + ( Год(ТекущаяДата()) - Год(Выборка.ДатаРождения)) + "  лет  " +  Выборка.Наименование);
      ИначеЕсли Месяц(ТекущаяДата()) = Месяц(Выборка.ДатаРождения) И
          День(ТекущаяДата()) - 2 = День(Выборка.ДатаРождения) И
           ( Год(ТекущаяДата()) - Год(Выборка.ДатаРождения)) < 105 Тогда
             Сообщить("Позавчера исполнилось " + ( Год(ТекущаяДата()) - Год(Выборка.ДатаРождения)) + "  лет  " +  Выборка.Наименование);
      //Иначе Сообщить (" Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ");
   КонецЕсли;
КонецЦикла;


я добился правильного отображения, но правильно это или нет?

TerverVl

Ок. Давай сделаем код более читаемым и более оптимальным:

Выборка = Справочники.Контрагенты.Выбрать();
ТекГод   = Год(ТекущаяДата());
ТекМесяц = Месяц(ТекущаяДата());
ТекДень  = День(ТекущаяДата());

Пока Выборка.Следующий() Цикл
Если Выборка.ЭтоГруппа Тогда Продолжить;
КонецЕсли;

Лет = ТекГод - Год(Выборка.ДатаРождения);
МесяцРождения = Месяц(Выборка.ДатаРождения);
ДеньРождения  = День(Выборка.ДатаРождения);

Если ТекМесяц = МесяцРождения И ТекДень = ДеньРождения И Лет < 105 Тогда

Сообщить("Сегодня  исполнилось " + Лет + "  лет  " +  Выборка.Наименование);

ИначеЕсли ТекМесяц = МесяцРождения И ТекДень + 1 = ДеньРождения И Лет < 105 Тогда

Сообщить("Завтра  исполняется  " +(Лет + 1) + "  лет  "+  Выборка.Наименование);

ИначеЕсли ТекМесяц = МесяцРождения И ТекДень + 2 = ДеньРождения И Лет < 105 Тогда

Сообщить("Послезавтра   исполняется  " +(Лет + 1) + "  лет  "+  Выборка.Наименование);

ИначеЕсли ТекМесяц = МесяцРождения  И ТекДень - 1 = ДеньРождения И  Лет < 105 Тогда

Сообщить("Вчера исполнилось " + Лет + "  лет  " +  Выборка.Наименование);

ИначеЕсли ТекМесяц = МесяцРождения И  ТекДень - 2 = ДеньРождения И  Лет < 105 Тогда

Сообщить("Позавчера исполнилось " + Лет + "  лет  " +  Выборка.Наименование);

Иначе
Сообщить (" Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ");
КонецЕсли;
КонецЦикла;


Здесь мы видим что условия ТекМесяц = МесяцРождения и Лет < 105 повторяются во всех ветках. Упрощаем далее:


Если ТекМесяц = МесяцРождения И Лет < 105 Тогда

Если ТекДень = ДеньРождения Тогда

Сообщить("Сегодня  исполнилось " + Лет + "  лет  " +  Выборка.Наименование);

ИначеЕсли ТекДень + 1 = ДеньРождения Тогда

Сообщить("Завтра  исполняется  " +(Лет + 1) + "  лет  "+  Выборка.Наименование);

ИначеЕсли ТекДень + 2 = ДеньРождения Тогда

Сообщить("Послезавтра   исполняется  " +(Лет + 1) + "  лет  "+  Выборка.Наименование);

ИначеЕсли ТекДень - 1 = ДеньРождения Тогда

Сообщить("Вчера исполнилось " + Лет + "  лет  " +  Выборка.Наименование);

ИначеЕсли ТекДень - 2 = ДеньРождения Тогда

Сообщить("Позавчера исполнилось " + Лет + "  лет  " +  Выборка.Наименование);

КонецЕсли;
КонецЕсли;

И теперь легче будет понять.
День рождения: 30.01.2016 года
Текущая дата:  01.02.2016 года
День рождения у контрагента был позавчера и должно выводится соответствующее сообщение.
Проверяем условие: ТекМесяц = МесяцРождения
ТекМесяц = 2, МесяцРождения = 1, соответственно результат будет ЛОЖЬ и мы не попадаем в ветку проверки дня рождения,
т.е. такой алгоритм правильно работать не будет.

В общем попытался донести мысль понятнее :)
Ну и возьми на вооружение как делать код удобнее для чтения, проще находить ошибки.

141219

спасибо за интерес к моей теме. я вроде понял.
Правда изначально просто скопировал ваш код и вот что получилось:
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Завтра  исполняется  4  лет  Запасные части
Сегодня  исполнилось 2  лет  Заправка

Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
т.е. неправильно прописан цикл

TerverVl

Всё верно. Код не работает.
Код который работает Ссылка
Но там пример реализации через запрос, но то же самое можно сделать и без запроса.
Подумай в сторону использования разности дат.

141219

Цитата: TerverVl от 03 янв 2016, 18:58
Всё верно. Код не работает.
Код который работает Ссылка
Но там пример реализации через запрос, но то же самое можно сделать и без запроса.
Подумай в сторону использования разности дат.
Спасибо, дораьотал и все получились.

Теги:

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

Рейтинг@Mail.ru

Поиск