Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
30 Май 2017, 10:10
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Даты рождений контрагентов  (Прочитано 2398 раз)

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

Оффлайн 141219

  • *
  • Сообщений: 9
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2015-07-20
  • Сайт: 
  • Профессия: Ученик 1С
Приветствую всех, с наступившим новым годом.
В качестве изучения и закрепления материала пишу программу.
В процессе написания возникла непонятная ситуация с кодом. При запуске в режиме предприятия выдавались адекватные сообщения о днях рождения контрагентов, но с наступлением нового года стали выводиться сообщения: (выбранному контрагенту) исполнилось 2015 лет, причем только те лица присутствуют в списке даты рождений которых не указаны.
код прописан в общем модуле:

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


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


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


Оффлайн TerverVl

  • *
  • Сообщений: 33
  • РЕПУТАЦИЯ: 7
  • КПД: 21%
  • Регистрация: 2015-12-28
  • Сайт: 
  • Профессия: Программист 1С
Цитировать
Месяц(ТекущаяДата()) = Месяц(Выборка.ДатаРождения)
Изначально это место при следующих данных: День рождения 01.01.2016, текущая дата 31.12.2015 должно выдавать неверный результат:
Т.е. в коде не учитывается что месяцы могут быть разные, но разница в днях должна попадать в условие.

Оффлайн 141219

  • *
  • Сообщений: 9
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2015-07-20
  • Сайт: 
  • Профессия: Ученик 1С
Цитировать
Месяц(ТекущаяДата()) = Месяц(Выборка.ДатаРождения)
Изначально это место при следующих данных: День рождения 01.01.2016, текущая дата 31.12.2015 должно выдавать неверный результат:
Т.е. в коде не учитывается что месяцы могут быть разные, но разница в днях должна попадать в условие.
Прошу прощенья, но не уловил Вашу мысль.
Добавлено: 02 Янв 2016, 22:03

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

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


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

Последний раз редактировалось: 141219; 02 Янв 2016, 22:03. Причина: Объединение сообщений

Оффлайн TerverVl

  • *
  • Сообщений: 33
  • РЕПУТАЦИЯ: 7
  • КПД: 21%
  • Регистрация: 2015-12-28
  • Сайт: 
  • Профессия: Программист 1С
Ок. Давай сделаем код более читаемым и более оптимальным:
Выборка = Справочники.Контрагенты.Выбрать();
ТекГод   = Год(ТекущаяДата());
ТекМесяц = Месяц(ТекущаяДата());
ТекДень  = День(ТекущаяДата());

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

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

Если ТекМесяц = МесяцРождения И ТекДень = ДеньРождения И Лет < 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

  • *
  • Сообщений: 9
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2015-07-20
  • Сайт: 
  • Профессия: Ученик 1С
спасибо за интерес к моей теме. я вроде понял.
Правда изначально просто скопировал ваш код и вот что получилось:
 Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
 Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
 Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
 Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
 Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
 Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
 Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
 Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
 Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
 Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
 Сегодня дней рождения нет ни у кого и застолье ОТМЕНЯЕТСЯ
Завтра  исполняется  4  лет  Запасные части
Сегодня  исполнилось 2  лет  Заправка

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

Оффлайн TerverVl

  • *
  • Сообщений: 33
  • РЕПУТАЦИЯ: 7
  • КПД: 21%
  • Регистрация: 2015-12-28
  • Сайт: 
  • Профессия: Программист 1С
Всё верно. Код не работает.
Код который работает Ссылка
Но там пример реализации через запрос, но то же самое можно сделать и без запроса.
Подумай в сторону использования разности дат.

Оффлайн 141219

  • *
  • Сообщений: 9
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2015-07-20
  • Сайт: 
  • Профессия: Ученик 1С
Всё верно. Код не работает.
Код который работает Ссылка
Но там пример реализации через запрос, но то же самое можно сделать и без запроса.
Подумай в сторону использования разности дат.
Спасибо, дораьотал и все получились.


Теги:
 

помогите с отчетом "характеристики контрагентов"

Автор Vasya PovarРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 2
Просмотров: 1670
Последний ответ 07 Дек 2016, 15:53
от Kironten
Проблема при проведении реализации УТ 11 - сообщение дата оплаты меньше даты документа

Автор AndreyBlacksmithРаздел Пользователям "1С - Предприятие 8"

Ответов: 3
Просмотров: 2050
Последний ответ 05 Фев 2015, 11:53
от AndreyBlacksmith
ЗУП Даты получения дохода в регистре налогового учета НДФЛ не ставятся(((?

Автор may_sergРаздел Пользователям "1С - Предприятие 8"

Ответов: 1
Просмотров: 2652
Последний ответ 14 Июл 2011, 08:17
от may_serg
Установка даты запрета редактирования, как расширить выбором конкретных документов

Автор Саша ЛибертиРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 6
Просмотров: 2474
Последний ответ 13 Июн 2014, 11:24
от Саша Либерти
Нет значка изменения даты в документе поступления товара, в 1с 8.3 , Розница 2.1 базовая

Автор genyfildРаздел Пользователям "1С - Предприятие 8"

Ответов: 2
Просмотров: 2155
Последний ответ 24 Фев 2015, 12:16
от genyfild

* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
93 Сообщений
wise wise
68 Сообщений
MuI_I_Ika MuI_I_Ika
52 Сообщений
alex0402
49 Сообщений
Dethmontt Dethmontt
48 Сообщений
Сергей Федоров Сергей Федоров
29 Сообщений
ilyay ilyay
29 Сообщений
ilnur75
25 Сообщений
Дмитрий Медведков Дмитрий Медведков
19 Сообщений
DmitriyF DmitriyF
17 Сообщений

* Кто онлайн

* Облако тэгов

* Форум 1С с мобильного

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

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal