Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Конструктор ОписаниеТипов не воспринимает КвалификаторыДаты: ДатаВремя #1133

Closed
aleksandr-ermakov opened this issue Nov 6, 2021 · 11 comments

Comments

@aleksandr-ermakov
Copy link

Опишите ошибку
При создании класса ОписаниеТипов для Даты, полученный тип не содержит время, даже при явном указании в квалификаторе.

Воспроизведение ошибки

ОписаниеТипаДатаВремя = Новый ОписаниеТипов("Дата", ,,,, Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)); 
Сообщить(ОписаниеТипаДатаВремя.КвалификаторыДаты.ЧастиДаты);     // Дата

ОписаниеТипаДатаВремя = Новый ОписаниеТипов("Дата");
Сообщить(ОписаниеТипаДатаВремя.КвалификаторыДаты.ЧастиДаты);     // Дата

Ожидаемое поведение
В платформе в обоих случаях будет "Дата и время"

Окружение

  • ОС: Win 10 Версия 10.0.19042 Сборка 19042
  • Версия: 1.7.0
@dmpas
Copy link
Collaborator

dmpas commented Nov 6, 2021

ОписаниеТипаДатаВремя = Новый ОписаниеТипов("Дата", ,,,, Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)); 
Сообщить(ОписаниеТипаДатаВремя.КвалификаторыДаты.ЧастиДаты);     // Дата

Вот этот вариант в 1С тоже не должен работать. Он работает, но по факту видим недокументированное поведение: в 1С вызывается конструктор "На основании объекта ОписаниеТипов" (видимо исходя из количества параметров), который однако первым параметром требует ОписаниеТипов, а не строку.

Оскрипт первым параметром видит строку и идёт по пути второго конструктора, "На основании типов и квалификаторов". Так что я бы тут крепко подумал, а нужна ли нам тут такая совместимость.

А вторая часть кода - косяк однозначно. Значение по-умолчанию в ОСкрипте не равно 1С. Удивительно, что до сих пор не выплывало.

@Mr-Rm
Copy link
Collaborator

Mr-Rm commented Nov 7, 2021

В 1С ещё и не проверяется точное соответствие типов Квалификаторов позиции параметра.

ОписаниеТипаВремя = Новый ОписаниеТипов("Дата",Новый КвалификаторыДаты(ЧастиДаты.Время)); 

- работает, хотя правильно должно быть:

ОписаниеТипаВремя = Новый ОписаниеТипов("Дата",,,Новый КвалификаторыДаты(ЧастиДаты.Время)); 

@dmpas
Copy link
Collaborator

dmpas commented Nov 8, 2021

ещё вот так:

ОписаниеТипаВремя = Новый ОписаниеТипов("Дата",Новый КвалификаторыДаты(ЧастиДаты.Время), Новый КвалификаторыЧисла(10, 2), Новый КвалификаторыСтроки(10));

не работает, но и не ругается во время исполнения.

@EvilBeaver
Copy link
Owner

Окей, делаем-то что?

@dmpas
Copy link
Collaborator

dmpas commented Nov 8, 2021

@EvilBeaver Значение по-умолчанию однозначно фиксим.

А по поводу конструктора продолжаем бурлесрач: недокументированные возможности мы обычно отметаем оставляем на доработку страждущим

@Mr-Rm
Copy link
Collaborator

Mr-Rm commented Nov 8, 2021

ещё вот так:

ОписаниеТипаВремя = Новый ОписаниеТипов("Дата",Новый КвалификаторыДаты(ЧастиДаты.Время), Новый КвалификаторыЧисла(10, 2), Новый КвалификаторыСтроки(10));

не работает, но и не ругается во время исполнения.

Работает, Сообщить(ОписаниеТипаВремя.КвалификаторыДаты.ЧастиДаты); -> Время

Плохо, что работает вот так :

// Квалификатор 'Время' на своей позиции:
ОписаниеТипаВремя = Новый ОписаниеТипов("Дата",,,Новый КвалификаторыДаты(ЧастиДаты.Время), Новый КвалификаторыДаты(ЧастиДаты.Дата));
Сообщить(ОписаниеТипаВремя.КвалификаторыДаты.ЧастиДаты);

-> Дата , т.е. последний по порядку для данного типа.
Баг платформы, по 8.3.20.1590 включительно.

@EvilBeaver

Окей, делаем-то что?

Второй случай - исправлять.
С параметрами - приводить в соответствие либо с описанием (наверное, будет правильней; там и TODO в TypeDescription.cs висит), либо с поведением (или дожидаться исправления платформы или документации?)

@dmpas
Copy link
Collaborator

dmpas commented Nov 8, 2021

Работает

@Mr-Rm в части Даты да, в части Числа и Строки квалификаторы не учитываются

@Mr-Rm
Copy link
Collaborator

Mr-Rm commented Nov 8, 2021

Так нет же типов для Числа и Строки. А если так:

ОписаниеТипов = Новый ОписаниеТипов("Строка,Дата,Число",
   Новый КвалификаторыДаты(ЧастиДаты.Время), 
   ,,, // !
   Новый КвалификаторыЧисла(11, 2),
   Новый КвалификаторыСтроки(7));
Сообщить(ОписаниеТипов.КвалификаторыЧисла.Разрядность);
Сообщить(ОписаниеТипов.КвалификаторыСтроки.Длина);
Сообщить(ОписаниеТипов.КвалификаторыДаты.ЧастиДаты);

11
7
Время

Всё учитывается. И получается, что конструктор фактически один.
Но выяснять поведение проверками, когда есть документация - а где? или её нет? - как-то неправильно.

@EvilBeaver
Copy link
Owner

Поскольку у нас квалификаторы считай что не используются, предлагаю исправить то что явно неверно, а на недокументированные фичи платформы - забить

@dmpas
Copy link
Collaborator

dmpas commented Nov 8, 2021

@EvilBeaver Используюся в таблице значений и дереве. Но кто этим на самом деле пользуется, сложно сказать. Вот, первая досада за столь продолжительное время.

@dmpas
Copy link
Collaborator

dmpas commented Nov 8, 2021

@Mr-Rm всё забавнее и забавнее.

EvilBeaver added a commit that referenced this issue Nov 22, 2021
Fix #1133, поведение конструкторов ОписанияТипов сделано совместимо. Скорректированы тесты.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants