1c-edt-issues
1c-edt-issues copied to clipboard
Некорректно детектируется ошибка "Возвращается недекларируемый тип: Произвольный"
Описание ошибки
Некорректно детектируется ошибка "Возвращается недекларируемый тип: Произвольный"

В то время, если указать что возвращается Число, то ошибки нет

Как будто edt считает что тип Число входит в тип Произвольный, Структура - нет
Как воспроизвести
- В модуле набрать текст
// Моя функция.
//
// Возвращаемое значение:
// Структура
//
Функция МояФункция() Экспорт
б = Новый Структура;
Ключ = "Мойключ";
а = Новый Соответствие;
а[Ключ] = б;
б = а[Ключ]; // Структура
Возврат б;
КонецФункции
- Наблюдать ошибку
Скриншоты
No response
Ожидаемое поведение
Думаю, проще всего сделать комментарий, которым можно указать Edt какой тип в данном случае возвращается.
Т.к. данная ситуация иллюстрирует множество проблем типизации в 1с: Тип Произвольный считается неопределенным, но фигурирует в типах аргументов процедур и функций в том числе и системных. В этом случае он должен быть строго определен. Вторая проблема - в разных местах тип Произвольный включает в себя разный набор типов. Например в соответствии можно указать Элемент управления формы, а в реквизите справочника - этого сделать нельзя, хотя оба значения описаны как "Произвольный". Тут возможно стоит менять и справочную систему и подсказки, вводить типы в сам язык и т.п. Как вариант, пока склоняюсь с определением типа через комментарий.
Лог рабочей области
не требуется
Версия 1С:EDT
2022.1
Операционная система
Windows
Установленные плагины
No response
Дополнительная информация
No response
Это проверка из "строгой типизации", к ЕДТ не имеет отношения.
Тип Произвольный считается неопределенным, но фигурирует в типах аргументов процедур и функций в том числе и системных. В этом случае он должен быть строго определен.
Тут либо непонимание, либо нужно уточнить что имелось ввиду?
Произвольный - это один тип, а Неопределено - это другой тип. Два разных типа, с разным смыслом.
Вторая проблема - в разных местах тип Произвольный включает в себя разный набор типов. Например в соответствии можно указать Элемент управления формы, а в реквизите справочника - этого сделать нельзя, хотя оба значения описаны как "Произвольный".
Просьба уточнить, в чем именно проблема? "везде всё разное" - это констатация факта, а не пояснение почему это является проблемой.
Да, в Платформе разные допустимые типы в разных местах - при чем есть прям очень понятный и строгий смысл почему так сделано.
- Понятно ведь что в реквизитах таблиц БД нельзя хранить объект "Элемент управления формы" - тут ясно почему ограничение на типы в реквизитах.
- Реквизиты формы - это другой объект, не связанный с БД.
- А в коде - вообще третий уровень типизации объектов
А где проблема - предлагаю прямо написать: "вот в этом случае не так как надо..."
Предлагаю в параметрах проверки установить галку проверять "strict-types" по умолчанию просто. Тема очень сложная. Но сейчас в модуле нет строгой типизации и по умолчанию "из коробки" edt выдает эту ошибку.
Дальше можно добавить символ, например воскл. знак "!" (или другой символ) чтобы при определении типа через комментарий edt не добавляла свои вычисленные типы
например
б = а[Ключ]; // !Структура
чтобы б детектировалась как структура. Или это приведет к коллапсу и "переопределению" типа? Тогда можно разрешить выбрать "уточнение" из уже определенных, а на другие - пусть ругается
Тип Произвольный считается неопределенным, но фигурирует в типах аргументов процедур и функций в том числе и системных. В этом случае он должен быть строго определен.
Тут либо непонимание, либо нужно уточнить что имелось ввиду?
Произвольный- это один тип, аНеопределено- это другой тип. Два разных типа, с разным смыслом.
Если произвольный - это "тип" и он включает в себя число, строку и даже полеформы, то почему он не включает в себя структуру... Почему надо в типах писать Произвольный, Число, когда Произвольный и так включает в себя число. Т.е. Произвольный в понимании edt некий нетипизированный тип, неопределенный тип.
Просьба уточнить, в чем именно проблема? "везде всё разное" - это констатация факта, а не пояснение почему это является проблемой.
Да, в Платформе разные допустимые типы в разных местах - при чем есть прям очень понятный и строгий смысл почему так сделано.
Понятно ведь что в реквизитах таблиц БД нельзя хранить объект "Элемент управления формы" - тут ясно почему ограничение на типы в реквизитах.
Реквизиты формы - это другой объект, не связанный с БД.
А в коде - вообще третий уровень типизации объектов
А где проблема - предлагаю прямо написать: "вот в этом случае не так как надо..."
Проблема, что для всех трех уровней в использовании типа Произвольный. И он будет разный по составу. Получается один Произвольный совсем не равен другому Произвольному. Возникает проблема с пониманием - входит ли в этом месте какой-то конкретный тип в указанный Произвольный или нет. Но это проблема платформы. Можно попробовать только обойти ее через уточнение типов.
Ну вот как раз пример на "Пересечение типов":

Параметр МояТаблица имеет тип произвольный, параметр функции - ТаблицаЗначений, Массив из Структура и они вуаля - не пересекаются. Хотя я передаю Массив из структура. В параметре формы типа Массив нет, хотя его легко можно задать - выбрал произвольный. Вопрос - как в строгих типах через параметр формы тогда передать массив структур чтобы не ругалось? test.zip проектик приложил с примером Мне кажется что Произвольный тип для edt это как Неопределено или Null для поля.