Имя: Пароль:
1C
1С v8
Одинаковые даты не равны
0 qq001
 
15.11.18
10:32
Уважаемые форумчане, помогите, пожалуйста, разобраться. Или я никак не проснусь, или вообще :)
Проблема в следующем, есть 2 одинаковых значения типа "Дата", одно получено из строки табличной части (одно из полей под названием "Период"), второе - запросом к той же самой табличной части. Отладка показывает, что эти даты не равны. У меня шок :)

Выражение                                                                        Значение                Тип
ЗанятостьРабочихЦентров[325].Период                                             17.12.2018  8:00:32     Дата
ПараметрыПоиска.Период                                                          17.12.2018  8:00:32     Дата
День(ЗанятостьРабочихЦентров[325].Период) = День(ПараметрыПоиска.Период)        Истина                Булево
Месяц(ЗанятостьРабочихЦентров[325].Период) = Месяц(ПараметрыПоиска.Период)      Истина                Булево
Год(ЗанятостьРабочихЦентров[325].Период) = Год(ПараметрыПоиска.Период)          Истина                Булево
Минута(ЗанятостьРабочихЦентров[325].Период) = Минута(ПараметрыПоиска.Период)    Истина                Булево
Секунда(ЗанятостьРабочихЦентров[325].Период) = Секунда(ПараметрыПоиска.Период)  Истина                Булево
Час(ЗанятостьРабочихЦентров[325].Период) = Час(ПараметрыПоиска.Период)          Истина                Булево
ЗанятостьРабочихЦентров[325].Период = ПараметрыПоиска.Период                    Ложь                  Булево
ЗанятостьРабочихЦентров[325].Период - ПараметрыПоиска.Период                    0,88                  Число
6 Bigbro
 
15.11.18
10:41
для точного позиционирования еще в 1с77 использовалась ПозицияДокумента а не дата, поскольку в последнюю секунду дня сваливали все подряд.
7 НЕА123
 
15.11.18
10:44
'0001-01-01' + цел('0001-01-01' - data)

может так...
а лучше точно вешать в граммах (с)
8 qq001
 
15.11.18
10:45
(3) А как же тогда мою дату ПараметрыПоиска.Период округлить? Чтобы НачалоМинуты было - это я знаю, а НачалоСекунды - без понятия :)
(4), (6) Это дата начала выполнения технологической операции, она живет в табличной части с типом Дата (состав даты: Дата и Время)
9 Bigbro
 
15.11.18
10:48
(8) ответ в вопросе содержится.
Даты не равны.
разность дат = 0,88
ЗанятостьРабочихЦентров[325].Период - ПараметрыПоиска.Период                    0,88                  Число
это в секундах.
поэтому отображается одинаково.
что еще нужно?
если надо чтобы были равны до секунд - отбрасывайте все, что после целых секунд.
10 exwill
 
15.11.18
10:50
(0) В 1С даты представлены с точностью до секунды, а в базе MS SQL, например, с точностью до 100 наносекунд.
11 Jackman
 
15.11.18
10:52
Пробуй при заполнении этого поля использовать преобразование дату в строку, а потом снова в дату и записывать в это поле


СтрокаДата = Формат(ТвояДата, "ггггММддЧЧммсс");
МоеПоле = Дата(СтрокаДата);
12 catena
 
15.11.18
10:53
(8)Ну пересобери тем же год, месяц, день. Если для сравнения, то можно не на равенство проверять, а на то, что разница меньше 1.
13 НЕА123
 
15.11.18
10:59
(11)(12) +
""+data1 = ""+data2

ужас нах...
14 ptiz
 
15.11.18
10:59
(0) Что за конфигурация? Какая платформа 1С и СУБД?
15 RomanYS
 
15.11.18
11:06
Офигеть, запустил табло на ОФ
('20180101'+0.111111111)-'20180101'
возращает 0,1111. Секунды с точностью 4 знака. Это баг или фича? База файловая
16 qq001
 
15.11.18
11:11
(9) Для меня это новость, что даты в 1с могут иметь точность сотые доли секунды. Я недавно программирую.
Шутка в том, что это одна и та же дата, только моя получена запросом, а вторая из ТЧ.
Получается, запрос "все портит". Находит ту же самую дату с более высокой точностью. Моя база файловая (она тестовая).
(14) 1С:Предприятие 8.3 (8.3.10.2561), конфа Управление производственным предприятием, редакция 1.3 (1.3.105.1)
17 1Сергей
 
15.11.18
11:12
(15) не баг и не фича. оно так работает, и это "правель"
18 qq001
 
15.11.18
11:13
(17) Как жить дальше... пойду домой.
19 1Сергей
 
15.11.18
11:15
не хватает функции НачалоСекунды()
20 1Сергей
 
15.11.18
11:16
но, её написать - дело шести секунд
21 Eiffil123
 
15.11.18
11:17
(17) как это не баг. В документации такого нет. А теперь получается, что в поле с типом дата можно хранить наносекунды, просто их пользователь не увидит. Жуть какая.
22 catena
 
15.11.18
11:17
(16)Ну, то, что секунда внутри еще делится на интервалы очевидно же. Хотя бы из существования границ :) С таким наглядным эффектом первый раз тоже сталкиваюсь, но что ж так шокироваться?
23 1Сергей
 
15.11.18
11:18
(19) +
Функция НачалоСекунды(Дат)
    Возврат НачалоМинуты(Дат) + Секунда(Дат);
КонецФункции
24 RomanYS
 
15.11.18
11:19
(17) Не баг, в СП написано
"Дата (Date)
Описание:
Значения данного типа содержат дату григорианского календаря (с 01 января 0001 года) и время с точностью до 0,1 миллисекунды."

Но блин ни одного метода чтобы с этими миллисекундами работать. Для меня это новость года, на 17-м году работы с 1С узнать такую фичу.
Почему мы ни разу не столкнулись с такой хренью как (0)? Сериализация кстати миллисекунды игнорит, это по сути баг.
25 olegves
 
15.11.18
11:19
(0) сравнивай так:
ЗанятостьРабочихЦентров[325].Период - ПараметрыПоиска.Период < 1
26 RomanYS
 
15.11.18
11:20
(25) -100000 тоже < 1
27 ptiz
 
15.11.18
11:21
В 8.2.19 еще было "до секунды".
Но фокус из (15) работает.
Дата (Date)
Описание:
Значения данного типа содержит дату григорианского календаря (с 01 января 0001 года) и время с точностью до секунды.
28 catena
 
15.11.18
11:23
(24)Ну вот я не могу с ходу придумать задачу, где необходимо проверять на равенство дат. Обычно на больше-меньше, на заполненность и пр. На крайний случай - на вхождение в один период(месяц, год). А вот на равенство, по-моему, ни разу не проверяла.
29 catena
 
15.11.18
11:24
(27)На 8.2.18 тоже воспроизводится)))
30 Jackman
 
15.11.18
11:26
(13) ИМХО, лучше, чтобы в это поле в документе уже записывалась "округленная" дата, т.к. он выборку делает запросом и т.д., чтобы потом не заморачиваться. Но как сравнение - да, самый простой способ в (13)
31 qq001
 
15.11.18
11:28
(25) Если бы это было сравнение, то без проблем, а мне нужно использовать метод ЗанятостьРабочихЦентров.НайтиСтроки(ПараметрыПоиска) и среди параметров поиска РабочийЦентр (на котором выполняется техоперация) и этот Период тупой. Я ж не знаю заранее разницу между датой из табличной части и датой, полученной запросом...
32 RomanYS
 
15.11.18
11:29
При сохранении в базу дата документа округляется до секунд
    Док = Документы.АвансовыйОтчет.СоздатьДокумент();
    ТД = ТекущаяДата();
    сообщить(ТД - Дата(""+ТД));//0
    
    Док.Дата = ТД + 0.5;
    сообщить(Док.Дата - Дата(""+ТД));//0.5
    
    Док.Записать();
    
    ДатаИзБазы = Док.Ссылка.Дата;
    
    сообщить(ДатаИзБазы - Дата(""+ДатаИзБазы));//0
33 RomanYS
 
15.11.18
11:30
(32) возможно влияет режим совместимости, запускалось на упп
34 Малыш Джон
 
15.11.18
11:32
(31) приводи все данные(и ТЗ, и ПараметровПоиска) к секундной точности и будет тебе щасте
35 Bigbro
 
15.11.18
11:35
я на равенство дат наступал на 7ке, уяснил что такое позиция документа, больше проблем не было.
36 Eiffil123
 
15.11.18
11:36
(28) бывает таблицы нужно по датам соединять в запросах.

Заметил, что в регистре бухгалтерии добавили поле "длина уточнения периода". Может из-за этого теперь в дате миллисекунды завелись.
37 qq001
 
15.11.18
11:36
(34) Это не ТЗ, а ТЧ. И там период уже хранится "как есть" с милисекундной точностью. Мне нужно выбрать строки из ТЧ методом НайтиСтроки (один из параметров поиска мой период) и затем в найденных строках поменять кое-что.
38 RomanYS
 
15.11.18
11:36
(34) Ещё скажи, что все всегда так делают
(35) позиция и граница это другие типы
39 RomanYS
 
15.11.18
11:37
(37) А откуда данные попали в ТЧ?
40 catena
 
15.11.18
11:37
(36)Запрос приводит даты к секунде, я проверила) И тоже не могу вспомнить соединения по дате. По периоду было, а чтоб прям по дате?
41 qq001
 
15.11.18
11:38
(39) План производства по сменам сформировался. Операции из техкарт попали в него в результате планирования.
42 Малыш Джон
 
15.11.18
11:38
(38) "я сто раз так делал" (с)
(37) без разницы. Если ты хочешь искать данные в этой таблице, значит формат параметров поиска должен совпадать с форматом данных.
43 qq001
 
15.11.18
11:39
(42) Ха-ха, ну по-любому :) Это ясное дело.
44 Малыш Джон
 
15.11.18
11:40
(41) и ты хочешь сказать, что операции планируются с точностью до миллисекунд? Или их все таки можно округлять перед записью?
45 Eiffil123
 
15.11.18
11:41
(40) а, т.е. получается, что это проблемы только даты, которая вычислена в оперативной памяти компьютера (причем именно вычислена, т.к. пользователь в поле с датой миллисекунды выбрать не может). Тогда не понятно назначение такого функционала в платформе.
46 Малыш Джон
 
15.11.18
11:43
(45) я даже больше скажу: я не уверен, что эти доли секунд соответствуют действительности
47 youalex
 
15.11.18
11:45
Сообщить(ЗаписатьДатуJSON('20180101' + 0.111, ФорматДатыJSON.JavaScript, ВариантЗаписиДатыJSON.УниверсальнаяДата));

выдает:
new Date(1514754000111)
48 Eiffil123
 
15.11.18
11:45
(46) вот так работаешь более 10 лет с восьмеркой и узнаешь новое про примитивный тип Дата.
Хочется все сертификаты разорвать.
49 qq001
 
15.11.18
11:50
(44) Да, это типовая конфа. Получается, с точностью до миллисекунд.
50 Малыш Джон
 
15.11.18
11:55
(49) на поддержке?

просто я не вижу другого способа, кроме как переделать процесс записи с округлением всех нужных данных до секунды.
51 RomanYS
 
15.11.18
11:58
сделал аналогично (32) запись в реквизит документа и реквизит табличной части в пустой конфе (без режима совместимости): все даты округлились после записи в базу.
Как (0) удалось это обойти?
52 Eiffil123
 
15.11.18
11:58
(50) так если запрос при получении данных округляет до секунд, то зачем при записи их округлять?
53 ptiz
 
15.11.18
12:01
Да, тоже проверил на 8.3.13 - в справочнике при записи дата округлилась до секунды.
54 Bigbro
 
15.11.18
12:03
(51) может какая то загрузка данных была нештатная?
55 Bigbro
 
15.11.18
12:06
в (41) написано что план формировался автоматом. наверняка когда создавались документы бралось текущее время без всяких округлений и писалось с высокой точностью.
56 RomanYS
 
15.11.18
12:06
(54) сделал Док.ОбменДанными.Загрузка = Истина
, ничего не изменилось.
Или думаешь ТС в файловую базу что-то пишет минуя платформу?
57 RomanYS
 
15.11.18
12:07
(55) "бралось текущее время без всяких округлений" как это сделать? ТекущаяДата возвращает округленную
58 RomanYS
 
15.11.18
12:08
(55) "писалось с высокой точностью" - вопрос тот же, Как?
59 qq001
 
15.11.18
12:27
(55) Все планы производства так формируются, к сожалению, мне сложно найти место в конфе, где это описано, там вычисляется время исполнения технологической операции с конца, от даты окончания отнимается длительность операции и получается "Период" (то есть фактически дата начала исполнения).
60 RomanYS
 
15.11.18
12:30
(59) Расчет может объяснить откуда взялись такие даты, но как тебе их удалось записать в базу?
Или у тебя строки ТЧ незаписанного документа?
61 qq001
 
15.11.18
12:33
(60) ТЧ проведенного документа.
62 RomanYS
 
15.11.18
12:38
(61) ХЗ. Ни у кого здесь не получилось записать дату с миллисекундами в базу. А у тебя ещё и режим совместимости с 8.2.
63 qq001
 
15.11.18
12:39
(62) Конечно, Версия 8.2.13
64 RomanYS
 
15.11.18
12:41
(63) может дата всё-таки не берется из записанного документа, а считается как в (59). Тогда всё объяснимо.
65 qq001
 
15.11.18
12:55
(64) Моя доработка запускается, когда план уже полностью сформирован и проведен. Так что данные в ТЧ уже хранятся. Как - не могу ответить, с трудом читаю чужой программный код такой сложный, как в посменном планировании.

ВСЕМ СПАСИБО ЗА ПОМОЩЬ. Тип Дата для меня открылся с совершенно другой стороны :)
66 Serg_1960
 
15.11.18
14:17
(62) Проверил на УПП в режиме совместимости 6.2.13. Чуда не произошло - при записи в базу миллисекунды отбрасываются.
(64) Предполагаю, что проблема автора кроется не в ТЧ документа, а в переменной "ПараметрыПоиска.Период".
67 Serg_1960
 
15.11.18
14:19
Тьфу, не "6.2.13" разумеется, а "8.2.13". Проверял и в SQL, и в файловом режиме.
68 RomanYS
 
15.11.18
14:21
(66) тоже думаю, что ТС как-то считает одну из дат. Но он не колется, говорит "из записанного документа"
69 qq001
 
16.11.18
10:08
(68) Поскольку ЗанятостьРабочихЦентров[325].Период - ПараметрыПоиска.Период = 0,88, то миллисекунды есть в ТЧ в строке 325 в дате "Период".
Я очень хочу разобраться ради установления истины :)
70 Bigbro
 
16.11.18
10:13
похоже там табличная часть пересчитывается в какой то момент, вопрос в какой?
71 qq001
 
16.11.18
10:38
(70) Попробую объяснить суть работы. Это перепланирование, из ТЧ удаляются все техоперации старой детали (узла) и техоперации всех подчиненных деталей (узлов), из которых она состоит. Затем на их место планируется выпуск новой похожей детали, которую выбрал пользователь. У нас изготовление одной и той же детали возможно 5 способами (применяются разные технологии литья и разное оборудование, соответственно, разные спецификации и техкарты, а деталь на выходе та же). Только время ее изготовления будет другое.
И вот дата начала 1-2 из десятков новых операций при перепланировании иногда совпадает с датой начала какой-нибудь старой операции из плана (относящейся не к перепланируемой детали, а к какой-то другой, деталей в каждой готовой продукции около 1000, в каждой от 1 до 15 операций). Вот я и ищу эту старую строку в плане и от ее Периода хочу отнять секунду. Понятно, что совпадение дат начала операции на одном и том же рабочем центре - это ошибка планирования, поскольку оборудование уже занято и что-то другое одновременно на нем изготавливаться не может. Но я хочу пока просто обойти эту проблему, устранив совпадение дат, чтобы перепланирование заработало в общем, а потом уже решать мелкие проблемы. Потому что из тысяч правильных операций таких с совпавшими датами или пересекающимися периодами занятости рабочего центра всего 1-3.
Единственное, могу предположить, что при удалении старых строк из ТЧ по перепланируемой детали пересчитываются все оставшиеся строки ТЧ, но я после удаления делаю проведение документа, чтобы сведения о занятости рабочих центров попали в регистры, а сведения о занятости по удаляемой детали, наоборот, вычистились.
72 НЕА123
 
16.11.18
10:44
(71)
объект перечитать
?
73 RomanYS
 
16.11.18
10:46
(71) "после удаления делаю проведение документа" документ же после этого не перечитывается? Возможно ДокументОбъект продолжает содержать дробные даты, хотя в базу уже записаны округленные
74 qq001
 
16.11.18
10:47
(73) Нет, после этого не перечитывается.
75 RomanYS
 
16.11.18
10:47
(71) на самом деле чтобы избежать этого головняка просто округляй вычитаемую длительность до секунд
76 qq001
 
16.11.18
10:48
(75) Уже сделано и все получилось :)
77 dezss
 
16.11.18
11:22
(74) так попробуй перечитать
78 RomanYS
 
16.11.18
11:24
(77) очевидно всё вылечится. Записать дату с миллисекундами (пока?) нельзя.
79 exwill
 
16.11.18
11:31
(78) Потом, когда станет можно, возникнут те же проблемы с долями миллисекунд )))
80 RomanYS
 
16.11.18
11:35
(79) там уже доли, точность - 0.1 мс
Непонятно зачем сейчас такой функционал, если толком его нельзя использовать. Но уже можно (при должном старании) поймать/создать баг как в (0)
81 exwill
 
16.11.18
11:37
(80) MS SQL хранит даты с точностью до 100 наносекунд.
82 RomanYS
 
16.11.18
11:39
(81) 1С ограничилась 100 мкс, но пока не хранит ;)
83 exwill
 
16.11.18
11:45
(82) A PostgreSQL с точностью до 1 мкс.
84 dezss
 
16.11.18
12:50
(79) не возникнет...когда они будут писаться, данные будут такие же, как и в тз
85 dezss
 
16.11.18
12:50
(79) + тьфу...не понял тебя сразу...да, с долями милисекунд будут проблемы)
86 Serg_1960
 
16.11.18
14:22
(80) Точность нужна, чтобы ошибки округления не набегали. В УПП, при расчете занятости тех.центров, те-же самые общие проблемы, что и (например) в бухгалтерии и в торговле. У одних копейки по строкам и сумме документа скачут, у других - цена в периоде :)
87 Жан Пердежон
 
16.11.18
15:47
СП:
Дата (Date)
Описание:
Значения данного типа содержат дату григорианского календаря (с 01 января 0001 года) и время с точностью до 0,1 миллисекунды.
88 dmitn
 
16.11.18
18:16
(47) выдает:
new Date(1514736000111)
89 Serg_1960
 
16.11.18
22:11
(88) ТекущаяУниверсальнаяДатаВМиллисекундах()
90 RomanYS
 
16.11.18
22:21
(89) это число причём целое, а здесь про  (24) и (87)
91 youalex
 
16.11.18
23:34
(90) это, как я понял,  про возможное смещение относительно UTC.
А я написал про то, что во первых - это все же фича, раз оно реально может использоваться. Во вторых, возможно(сильно не факт) - эта фича появилась вместе с json.
92 exwill
 
17.11.18
07:56
(91) Пляшут от количества байт выделяемых для этого типа данных. Далее определяются с тем, какие границы дат нужны. В результате получается точность. В 1С могли бы определить точность в 1 мс. Но тогда границы дат были бы не 4000 лет, а 40000 лет. Просто подумали - ну зачем нам это, давайте лучше точности добавим.
93 Serg_1960
 
17.11.18
23:10
(90) Это про то, что универсальная дата изначально имела миллисекунды и это даже не секрет Полишинеля, а (47)  - "Первооткрывателям Америки посвящается" :)
94 RedEchidna
 
19.11.18
04:43
(25) А если в сравнение попадут, скажем, даты '20130724132506.9' и '20130724132507.1' (запись условная)? Разница в 0.2 секунды, но при отбрасывании десятых долей разница уже одна секунда.
95 craxx
 
19.11.18
05:05
(0) в запросе сделай НАЧАЛОПЕРИОДА(ТвоеВыражение,Секунда)
96 craxx
 
19.11.18
05:22
(11) извращение, сродни тем, которые применял ныне покойный Андрей Романович Чикатило.
97 catena
 
19.11.18
05:29
(95)Запрос и так приводит время к секундам.
98 craxx
 
19.11.18
05:36
(97) есть куча других способов к секундам привести
Например:
Функция ДатаВремяДоСекунд(ДатаВремя)
   Возврат Дата(Год(ДатаВремя),Месяц(ДатаВремя),День(ДатаВремя),Час(ДатаВремя),Минута(ДатаВремя),Секунда(ДатаВремя));
КонецФункции
99 catena
 
19.11.18
05:38
(98)Чем это лучше (11)?
100 Serg_1960
 
19.11.18
12:48
(98) Можно проще. Подсказка: любая функция работы со значением типа "Дата" отрезает лишнее :) "НачалоМинуты(ДатаВремя) + Секунда(ДатаВремя)", "ДобавитьМесяц(ДатаВремя, 0)" и т.д.
101 RomanYS
 
19.11.18
13:05
(97) приводит скорее всего не запрос, а запись в базу.
Сейчас нет возможности (или есть?) записать значение с типом дата с точностью выше секунды.
102 catena
 
19.11.18
13:13
(101)Ну, пока ни у кого в теме, кроме ТС(по его словам) не получилось.
103 RomanYS
 
19.11.18
13:14
(102) у него тоже не получилось
104 RomanYS
 
19.11.18
13:16
+(103) смотри (71) и (74)
105 catena
 
19.11.18
13:23
(104)А, ну тогда вообще никаких проблем)
Ошибка? Это не ошибка, это системная функция.