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

Как задать дату рождения при расчете возраста используя разность дат без запросов и скд?

Автор Ledgik, 06 мар 2019, 13:12

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

Ledgik

Есть поле ТекущаяДата, поле ДатаРождения и поле Возраст. Как правильно задать поле ДатаРождения чтобы рассчитать Возраст? Привожу код ниже. Не могу найти где ошибаюсь.

&НаКлиенте
Процедура ПолучениеДняРождения()
Стр = Элементы.ТЧСтаж.ТекущиеДанные;
Стр.ДеньРождения = НачалоДня(Стр.ДеньРождения);
КонецПроцедуры

&НаКлиенте
Процедура РасчетВозраста()
Стр = Элементы.ТЧСтаж.ТекущиеДанные;
Стр.Возраст = (ТекущаяДата() - Стр.ДеньРождения) /(60 * 60 * 24);
КонецПроцедуры

&НаКлиенте
Процедура ДатаРожденияПриИзменении(Элемент)
РасчетВозраста();
КонецПроцедуры

&НаКлиенте
Процедура ТЧСтажВозрастПриИзменении(Элемент)
РасчетВозраста();
КонецПроцедуры

antoneus


Ledgik


antoneus

Ну вроде в днях должно работать. Что не получается-то? ДеньРождения нужно задавать как Дата, состав - Дата.
В общем вот, накалякал на коленке, посмотри.

Ledgik

В днях я уже вчера сам разобрался. Решил еще один вопрос разобрать связанный с Возрастом. Потом решение этого вопроса можно будет перенести в расчет Стажа. Для этого создал проверочный справочник Расчет с табличной частью ТЧВозраст, и реквизитами в ней ДатаРождения и ТекущаяДата, и Возраст. Взял за основу код из примера в синтаксис-справочнике. Попробовал создать на его основе код. При проверке кода на синтаксис вылазит ошибка:
{Справочник.Расчет.Форма.ФормаЭлемента.Форма(68,2)}: Недостаточно фактических параметров (РасчетВозраста)<<?>>РасчетВозраста(); (Проверка: Тонкий клиент)
Почему понять не могу. Код привожу ниже:

&НаКлиенте
Процедура РасчетДатыРождения()
Стр = Элементы.ТЧВозраст.ТекущиеДанные;
Стр.ДатаРождения=Дата(Год(Элементы.ТЧВозраст.ДатаРождения()),     
            Месяц(Элементы.ТЧВозраст.ДатаРождения()), День(Элементы.ТЧВозраст.ДатаРождения()));
КонецПроцедуры

&НаКлиенте
Процедура РасчетТекущейДаты()
Стр = Элементы.ТЧВозраст.ТекущиеДанные;
Стр.ТекущаяДата = ТекущаяДата();
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Для Каждого Стр ИЗ Объект.ТЧВозраст Цикл
Стр.ТекущаяДата = ТекущаяДата();
КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
Для Каждого Стр ИЗ Объект.ТЧВозраст Цикл
Стр.ТекущаяДата = ТекущаяДата();
КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ТЧВозрастДатаРожденияПриИзменении(Элемент)
РасчетДатыРождения();
КонецПроцедуры

&НаКлиенте
Процедура ТЧВозрастТекущаяДатаПриИзменении(Элемент)
РасчетТекущейДаты();
КонецПроцедуры

&НаКлиенте
Процедура РасчетВозраста(Знач РасчетДатыРождения,
Знач РасчетТекущейДаты, Лет=0, Месяцев=0, Дней=0) Экспорт
     Стр = Элементы.ТЧВозраст.ТекущиеДанные;
Если РасчетТекущейДаты>=РасчетДатыРождения Тогда
    Лет1 = Год(РасчетТекущейДаты);
Месяцев1 = Месяц(РасчетТекущейДаты);
Если НачалоДня(РасчетТекущейДаты)<>НачалоДня(КонецМесяца(РасчетТекущейДаты))
                Тогда
    Дней1 = День(РасчетТекущейДаты);
Иначе
Дней1 = (((365*3+366)/4)/12); //В каждом месяце ровно 30,4375 дней.
КонецЕсли;
    Лет2 = Год(РасчетДатыРождения);
Месяцев2 = Месяц(РасчетДатыРождения);
Если НачалоДня(РасчетДатыРождения)<>НачалоДня(КонецМесяца(РасчетДатыРождения))
                Тогда
Дней2 = День(РасчетДатыРождения);
Иначе
Дней2 = (((365*3+366)/4)/12); //В каждом месяце ровно 30,4375 дней.
КонецЕсли;
Лет = Лет1 - Лет2;
Месяцев = Месяцев1 - Месяцев2;
Дней = Дней1 - Дней2;
Иначе
    Лет = 0;
Месяцев = 0;
Дней = 0;
КонецЕсли;
КонецПроцедуры 

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
РасчетВозраста();
КонецПроцедуры



antoneus

Ну, по-русски вроде написано) Недостаточно фактических параметров - это значит, что в объявленную процедуру нужно передавать параметры: РасчетДатыРождения и РасчетТекущейДаты, т.к. для них не задано значений по умолчанию.

alex0402

Цитата: Ledgik от 07 мар 2019, 09:53Процедура РасчетВозраста(Знач РасчетДатыРождения,
    Знач РасчетТекущейДаты, Лет=0, Месяцев=0, Дней=0) Экспорт

Нужно во всех вызовах передавать все параметры, можно опустить те, где есть =0 (будет использовано значение 0), если все такие параметры вконце, то запятые ставить не обязательно...
да и Экспорт писать не нужно, если  процедура используется только внутри модуля.
Спасибо за Сказать спасибо

Ledgik

Подставил параметры. Ситуация изменилась, но не намного теперь другая ошибка выходит:

{Справочник.Расчет.Форма.ФормаЭлемента.Форма(68,17)}: Ожидается выражение
РасчетВозраста(<<?>>Знач РасчетДатыРождения,  (Проверка: Сервер)
{Справочник.Расчет.Форма.ФормаЭлемента.Форма(68,41)}: Ожидается выражение
РасчетВозраста(Знач РасчетДатыРождения,<<?>>  (Проверка: Сервер)
{Справочник.Расчет.Форма.ФормаЭлемента.Форма(74,17)}: Ожидается выражение
РасчетВозраста(<<?>>Знач РасчетДатыРождения,  (Проверка: Сервер)
{Справочник.Расчет.Форма.ФормаЭлемента.Форма(74,41)}: Ожидается выражение
РасчетВозраста(Знач РасчетДатыРождения,<<?>>  (Проверка: Сервер)
{Справочник.Расчет.Форма.ФормаЭлемента.Форма(68,17)}: Ожидается выражение
РасчетВозраста(<<?>>Знач РасчетДатыРождения,  (Проверка: Тонкий клиент)
{Справочник.Расчет.Форма.ФормаЭлемента.Форма(68,41)}: Ожидается выражение
РасчетВозраста(Знач РасчетДатыРождения,<<?>>  (Проверка: Тонкий клиент)
{Справочник.Расчет.Форма.ФормаЭлемента.Форма(74,17)}: Ожидается выражение
РасчетВозраста(<<?>>Знач РасчетДатыРождения,  (Проверка: Тонкий клиент)
{Справочник.Расчет.Форма.ФормаЭлемента.Форма(74,41)}: Ожидается выражение
РасчетВозраста(Знач РасчетДатыРождения,<<?>>  (Проверка: Тонкий клиент)


О каком выражении в сообщении об ошибке идет речь?

antoneus

При вызове процедуры Знач писать не надо. Это ключевое слово в объявлении процедуры, которое означает, что параметр передается по значению (т.е. если в вызываемой процедуре он будет изменен, то в контексте вызывающей процедуры останется без изменений).

Ledgik

Спасибо!
Добавлено: 09 мар 2019, 16:34


Все равно выдает ошибку, даже если в параметрах убрать указнание Знач, а просто написать РасчетДатыРождения и РасчетТекущейДаты.

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

Рейтинг@Mail.ru

Поиск