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

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

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
Просмотров: 1559
Последний ответ 07 Дек 2016, 15:53
от Kironten
Проблема при проведении реализации УТ 11 - сообщение дата оплаты меньше даты документа

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

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

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

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

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

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

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

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

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

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

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


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

* Реклама

* Поиск

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

* Реклама

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

Геннадий ОбьГЭС Геннадий ОбьГЭС
160 Сообщений
alex0402
127 Сообщений
MuI_I_Ika MuI_I_Ika
57 Сообщений
Norfolk
52 Сообщений
LexaK
49 Сообщений
друган
20 Сообщений
alexandr_ll
20 Сообщений
AsadRoman
18 Сообщений
Константин5825
18 Сообщений
MrLvovsky MrLvovsky
16 Сообщений

* Кто онлайн

  • Точка Гостей: 468
  • Точка Скрытых: 0
  • Точка Пользователей: 10
  • Точка Сейчас на форуме:

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

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

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

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

Поиск

 

Dellos Catering - выездной ресторан кейтеринг по всему Миру
SimplePortal 2.3.5 © 2008-2012, SimplePortal