Вход | Регистрация


1С:Предприятие ::

Метки:

Зеленый вопрос. Преобразование типов.

Я
   В рубахе парень
 
30.01.04 - 19:27
Здравствуйте.  У меня большая просьба подсказать одну вещь касающуюся преобразования типов данных. Может быть  все и просто, однако, моя не понимать особенно тама где моя написала что начались непонятности, как получилось число 2452641? И очень интересует работа функций в конце примера.
//Объявляем явно переменные модуля, т.е. начинается раздел //описания
переменных
Перем а;
Перем б;
Перем стр;
Перем дат;
//Основная программа, (процедур и функций нет)

а=5; б=6; 
//Присваиваем значения двум переменным.           

//Они, соответственно, приобретают числовой тип
стр = "Это строка"; //присваиваем значение переменной стр

дат = ’01.01.03’;   //то же соответственно 

а = стр;            //теперь а = "Это строка" и имеет         
//строковый тип
До сюда конечно понятно, а вот дальше……темный лес соответсвенно.

б = 1*дат;          //после выполнения этой строки б =  2452641, обратите внимание на способ преобразования 

//строки в число

б = "" + б;         //теперь б = "2452641"

стр = стр + " " + дат//стр = "Это строка 01.01.03"

б = 1*стр;           //б = 0

дат = Дата(2452640); //дат = ’31.12.02’


Специальные функции
а = Число(дат);      //а = 2452641

стр = Строка((123+453)/5); //стр = "115.2"

дат = Дата("23.45.ыва");
 
 
   Львенок
 
1 - 30.01.04 - 19:59
Делать вам, батенька, нечего. Когда коту делать нечего с ним все понятно, а вот когда программисту...
___
Искренне Ваш, Львенок
   В рубахе парень
 
2 - 30.01.04 - 20:53
Уважаемый, Львенок!
Что-то не припомню я этой поговорки про котов, но если судить что творится на чердаке хотя пока не март, то я в данный момент занимаюсь вовсе не этим, а хочу стать суперстар в 1с, и при том как в былые времена пятилетку за три года перевыполнить, а вот с такими намеками далеко стахановцем не станешь. Сказал бы типа: это не важно или я не знаю этого ваще, без этого у меня все получается, короче учи другое….Или как?????

П.С Товарищи! Поможем молодым начинаниям и будущим соратникам в борьбе за великое опять же начинание (пока что)  в деле продвижения, процветания и могущества
   345
3 - 30.01.04 - 20:58
Лениво сегодня много писать ... Давай завтра ... вечером ...
   Львенок
 
4 - 30.01.04 - 21:02
(2) Подскажу. С большой долей веротяности могу сказать, что поскольку Дата1-Дата2=ДнейМеждуДатами (причем это число), то Число(Дата1) это Число дней прошедший с какой-то условной даты. Севершенно логично, что Дата(Число(Дата1)-1)= дата предыдущая от Дата1. 1*Дата1=Число(Дата1), это тоже логично. Приведение типов, однако. 1*Стр=Число(Стр) и в вашем случае =0, тоже логично т.к. строка начиналась с букв и не может быть преобразована в число. Так и не понял, что же вам не очевидно?
___
Искренне Ваш, Львенок.
   T-34
5 - 30.01.04 - 22:32
(4)Ну не совсем так, я имею ввиду даты. Иначе как объяснить такой конфуз:

date(8126667) = 21.71.53 при этом
valuetypestr(date(8126667)) = Дата

например эксель преобразует дату в число по следующему алгоритму (вольная интерпритация на 1С)

var array[12];

array[01] = 0;
array[02] = array[01] + 31;
array[03] = array[02] + 28;
array[04] = array[03] + 31;
array[05] = array[04] + 30;
array[06] = array[05] + 31;
array[07] = array[06] + 30;
array[08] = array[07] + 31;
array[09] = array[08] + 31;
array[10] = array[09] + 30;
array[11] = array[10] + 31;
array[12] = array[11] + 30;

data = '01.01.1900';

year = getyear(data);
month = getmonth(data);
if ((int(year / 4) = (year / 4)) 
     and ((int(year / 100) <> (year / 100)) 
     or ((int(year / 400) <> (year / 400)))) 
     and (month < 3)) then
    flag = 1;
else
    flag = 0;
endif;
day = (year - 1900) * 365 + array[month] + getday(data);
day = day + int(year / 4) - int(year / 100) + int(year / 400);
day = day - (int(1900 / 4) - int(1900 / 100) + int(1900 / 400)) - flag;


Что подобное думаю есть и 1С, также сюда скорее всего добавлено время. Ну а если сильно хочешь надо лезть в MSDN не думаю, что программисты из 1С сильно далеко уходили от МС
   WhiteCat
 
6 - 30.01.04 - 23:08
Так что там про котов?

Я когда начал учить 1С, то понял, что это - смечь JavaScript и Delphi. Вот эти приемы - из области JavaScript.

б = 1*дат; // б =  2452641
Дата во внутреннем представлении - это Integer. Поскольку первым операндом стоит число, то второй тоже воспринимается как число. Поэтому 2452641

стр = стр + " " + дат;//стр = "Это строка 01.01.03"
Теперь дата переводится в текстовый формат, а в текстовом формате дата - это "01.01.03"

б = 1*стр; //б = 0
Все верно, первый операед - число, второй тоже переводится в формат числа, то есть становится нулем. А 1 * 0 = 0

Исходя из этого до остального легко додуматься самостоятельно
   В рубахе парень
 
7 - 31.01.04 - 09:47
Извините, можно про integer и б = 1*дат, б =2452641 поподробней. Спасибо.
   mike
 
8 - 31.01.04 - 10:40
нафига вам такие сложности , можно же придумать  алгоритмы, которые будут работать и будете писать программы. А первое впечаление  от прочитанного , что человек изучает,  как работает язык 1с в части преобразования типов. То есть до реальных задач еще далеко.
   В рубахе парень
 
9 - 31.01.04 - 11:20
(8)До реальных задач я еще не дошел это точно, сейчас лишь этап изучения, в частности теоретический, хотя по ходу дела практика проскакивает ну оооооочень простая и не хотелось бы оставлть что то пропущенным , а вдруг пригодится, ну не въеду я как перевести дату в число в частности в этом примере, и вообще часто ли приходится сталкиваться реально с такими вещами, ась???
   mike
 
10 - 31.01.04 - 11:33
знаешь, честно говоря не часто , но если столкнулся,то  то у тебя под рукой и отладчик и табло в самой 1с. У себя я такие манипуляции не проделываю.  Практически всегда можно все на месте  у заказчика проделать.
 
  Рекламное место пустует
   T-34
11 - 31.01.04 - 13:35
(10)Правильно делает. Позволит избежать кучу проблем в будущем.

Правило простое 1С стремиться преобразовать все значения к типу первого операнда. Отсюда, попытка вывести строку сообщения в таком ввиде message(документ + " " + total(документ.сумма)) даст пустое значение. Надо приводить к явному типу значений message(string(документ) + " " + string(total(документ.сумма))).
   WhiteCat
 
12 - 31.01.04 - 14:12
(7) Лениво, времени нет, так что извини
   В рубахе парень
 
13 - 31.01.04 - 20:23
Это хорошо , что 1С стремиться преобразовать все значения к типу первого операнда, но як же це происходит на пальцах???Т.е это аз, буки, веди...
дат = ’01.01.03’; 
б = 1*дат;          //после выполнения этой строки 

б=2452641,
   skunk
 
14 - 31.01.04 - 20:29
чего же не понятного

Рез = 1 * Дата   равносильно Рез = 1 * Число(Дата)
   В рубахе парень
 
15 - 31.01.04 - 20:52
Уж раз пошла такая тема то спрашиваю прямо: каким образом ’01.01.03’ превратилось в  2452641, ну а то что 452641*1=452641 ясно Т.е понятно что ’01.01.03’ преобразуетсяя в числовой тип, а алгоритм, правила их у нас нет пока что, чтоб домохозяину ясно было.
   345
16 - 31.01.04 - 21:04
выполни след код

Процедура Сформировать() 
    
дат = '01.01.03';  // здесь дат - тип ДАТА

сообщить ("Дат ="+ ТипЗначенияСтр(дат));   // что и подтверждается

сообщить ("Дат ="+ дат);     // значение ДАТЫ

Message  ("---------------");

б = 1*дат;                                  
сообщить  ("б ="+ ТипЗначенияСтр(б));      // тип б

сообщить  ("б ="+ б);                     // значение б

Message  ("---------------");

сообщить  ("Тип преобр ="+ ТипЗначенияСтр(дат));     
сообщить  ("значение преобр ="+ Число(дат));         
Message  ("---------------");


дат = "01.01.03";    // здесь дат - тип СТРОКА

сообщить ("Дат ="+ ТипЗначенияСтр(дат));   // что и подтверждается

сообщить ("Дат ="+ дат);      // значение ДАТЫ

Message  ("---------------");
КонецПроцедуры



результат выполнения
Дат =Дата
Дат =01.01.03
---------------
б =Число
б =2452641
---------------
Тип преобр =Дата
значение преобр =2452641
---------------
Дат =Строка
Дат =01.01.03
---------------


==============================================
==============================================
==============================================
дат = '01.01.03';    здесь дат - тип ДАТА

б = 1*дат;                                  
здесь выполняется формула (с преобразованиями типов)
б = Число(1) * Число(от Даты!)


дат = "01.01.03";    здесь дат - тип СТРОКА


разница заключается в кавычках - в одном случае они двойные и это СТРОКА, в другом - одинарные и это воспринимается как определение переменной типа ДАТА

При приведении типа работает преобразование внутреннего формата даты в число.... а внутренний формат есть смещение в каких то единицах от 1700, чтоли, года ...

год точно не знаю .....
   345
17 - 31.01.04 - 21:06
Вообще лучше явно ставить преобразования .... В 1С можно так налететь


А вот следствия преобразований с датой иногда прикольные

А= '01.01.03';
а = а+5;

имеем - увеличение даты на 5 дней ....
   В рубахе парень
 
19 - 31.01.04 - 22:18
Вот меня и интересовало преобразование  даты в число, т.е чтоб без компутера привести её к числовому типу, простым карандашом на клочке бумаги, что например дата ‘23.12.03’ это есть число 27645386  например, и только потом его умножать, в данном случае на еденицу..Как к примеру 59 десятичное, есть 111011 двоичное и сделать это можно на простом листе бумаги если знаешь этот самый способ.
   skunk
 
20 - 31.01.04 - 22:19
Да короче см.(5) так 1С и преобразует, точнее не она а виндовс. в памяти компа дата с временем хранится что типа в виде ддддддддтттттттт.ччччччч

где ддддддд - это дата полученая см (5) (количество дней)
   ттттттт - это время часы * 3600 + минуты * 60 + секунд (количество секунд)
   ччччччч - чего я не знаю


и тогда
  получаем точка от счета или 0
  12 декабря 1899 года 6 часов до полудня
   skunk
 
21 - 31.01.04 - 22:23
опечатка 30 декабря 1899 12:00 ам
   WhiteCat
 
22 - 01.02.04 - 00:50
Короче, как она там высчитывается, точно не знаю, может и как в (5), но хранится она в виде целого числа (Integer из аналогии с Дельфином). Поэтому при умножении из памяти вынимается именно это число
   skunk
 
23 - 01.02.04 - 01:29
(22)Позволь не согласиться, насчет целого

TDateTime is the C++ analog for the Object Pascal TDateTime data type.

Header

systdate.h

Description

TDateTime implements the Object Pascal TDateTime data type and the date/time runtime library routines that use the TDateTime data type.

The TDateTime class inherits a val data member declared as a double that holds the date-time value. The integral part of a TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of a TDateTime value is the time of day.

Following are some examples of TDateTime values and their corresponding dates and times:

0     12/30/1899 12:00 am
2.75     1/1/1900 6:00 pm
-1.25     12/29/1899 6:00 am
35065     1/1/1996 12:00 am

правда это из buildera взято но что подобное есть sdk, только его у меня щас нет.
   skunk
 
24 - 01.02.04 - 01:57
Наврал, с bilder'ом куски sdk идут, к примеру

Time format used by many applications, it is a 64-bit floating point number representing days since December 31, 1899
   fellow
 
25 - 01.02.04 - 06:37
Ничуть не наврал, ни в первом, ни во втором, ни даже в самом первом, ныне покойном, случае. Каждая тварь в компьютере вольна хранить дату/время в каком заблагорассудится формате: целом ли, дробном ли, строковом ли. В дельфинарии, что паскальном, что приплюснутом, это действительно TDataTime, что равносильно числу дробному. В чистом С - это целое число, равное количеству секунд, прошедших с  00:00:00 GMT 1 января 1970 (готовьтесь, насильники: в 2039, кажется, году снова будет проблема-2000, потому что ёмкости типа time_t не хватит). В этом же формате время живёт и в MFC, только оно обёрнуто в класс CTime. Если вспомнить недавное прошлое, то у того же борланда в библиотеке OWL были классы TDate и TTime, тогда время измерялось в количестве секунд с 1900 года (могу и ошибаться). У винды - свои резоны, поэтому в ней имеется несколько способов представления времени, например, время, взятое из "железного" таймера как есть (структура SYSTEMTIME) и препарированное время в виде количества 100-наносекундных интервалов с 00:00:00 1 января 1601 г (64-битное целое FILETIME). И вдобавок "короткое" время, почти на 50 дней - количество миллисекунд с момента загрузки системы.
   skunk
 
26 - 01.02.04 - 06:38
То есть говоря по русский
формат дата+время для использования в приложениях - это 64-битное число с плавающей точкой, показывающее количество дней и секунд прошедших с 12/30/1899 12:00 am


в пятом не преобразование, а подсчет дней количества дней прощедших с 01/01/1900
   skunk
 
27 - 01.02.04 - 06:50
(25) говоря, в (24) наврал я имел ввиду свой сабж (23), что у менят не установлено sdk. а вообще чухаю опять надо его заруливать на комп. на сколько поню в sdk про systemtime говориться не сколько иначе, хотя могу и ошибаться. днем на рынок схожу если найду sdk то посмотрим.
   fellow
 
28 - 01.02.04 - 07:08
Тот хелп, что идёт с пятым билдером, мне не нравится очень, чаще пользуюсь MSDN.
   skunk
 
29 - 01.02.04 - 07:30
Да пока задач таких не было что бы юзать msdn, их бин в одинСи от него толку мало. Хотя сейчас чуствую, что надо опять покуплять, ибо знаний в эту сторну уже дефицит, чего-то не допонимаю.
   skunk
 
30 - 01.02.04 - 11:20
The SYSTEMTIME structure represents a date and time using individual members for the month, day, year, weekday, hour, minute, second, and millisecond.
 typedef struct _SYSTEMTIME {
    WORD wYear;
    WORD wMonth;
    WORD wDayOfWeek;
    WORD wDay;
    WORD wHour;
    WORD wMinute;
    WORD wSecond;
    WORD wMilliseconds;
  } SYSTEMTIME, *PSYSTEMTIME;

Members
 wYear Current year. The year must be greater than 1601. Windows Server 2003, Windows XP:  The year cannot be greater than 30827.
wMonth Current month; January = 1, February = 2, and so on.
wDayOfWeek Current day of the week; Sunday = 0, Monday = 1, and so on.
wDay Current day of the month.
wHour Current hour.
wMinute Current minute.
wSecond Current second.
wMilliseconds Current millisecond.

По материалам
Microsoft Platform SDK February 2003
Platform SDK: Windows System Information
   skunk
 
31 - 01.02.04 - 11:39
fellow пардон, млин, тысячу извинений, чето я прогнал. Думал ты systemtime за variant протолкнуть пытаешься.
   skunk
 
33 - 01.02.04 - 11:44
"и препарированное" буковку "и" вначале не увидал
 
  Рекламное место пустует
   fellow
 
34 - 01.02.04 - 12:12
Заработался, понимаю, ха-ха! Отдохни, чаю попей.
   В рубахе парень
 
35 - 01.02.04 - 12:14
Да, ексель-моксель,такая информация меня прям таки в транс вгоняет, я уж подумал  может мне все таки домохозяином остаться, а то размечтался, что и мне может можно зведу,или хоть полоску какую,наверно и впрямь лишнее это такие выкрутасы с типами. Продолжаю дальнейшее изучение напишу ка что нибудь реальное и без заморочек
   Львенок
 
36 - 01.02.04 - 12:18
Много флэйма из ничего...
___
Искренне Ваш, Львенок.
   skunk
 
37 - 01.02.04 - 12:27
(34) чай не пиво много не выпьешь
   WhiteCat
 
38 - 01.02.04 - 13:42
Вот смотри:
The integral part of a TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of a TDateTime value is the time of day

Там написано, что integral part (целая часть) - это дата, а fractional (то что после запятой) - время. То есть дата как раз целой частью и представлена. Ты правильно сделал, что уточнил этот момент, но если тут дополнительные вопросы даже по integer возникли (7), то подобное объяснение - это еще большая нагрузка на мозг обучаемого, ну, короче ты понял. Поэтому я немного упростил



Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует