1c-edt-issues icon indicating copy to clipboard operation
1c-edt-issues copied to clipboard

Некорректно детектируется ошибка "Возвращается недекларируемый тип: Произвольный"

Open DmitryShvaika opened this issue 3 years ago • 7 comments

Описание ошибки

Некорректно детектируется ошибка "Возвращается недекларируемый тип: Произвольный"

image

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

image

Как будто edt считает что тип Число входит в тип Произвольный, Структура - нет

Как воспроизвести

  1. В модуле набрать текст
// Моя функция.
// 
// Возвращаемое значение:
//  Структура
//
Функция МояФункция() Экспорт
	
	б = Новый Структура;
	Ключ = "Мойключ";
	
	а = Новый Соответствие;
	а[Ключ] = б;
	
	б = а[Ключ]; // Структура
	
	Возврат б;
	
КонецФункции

  1. Наблюдать ошибку

Скриншоты

No response

Ожидаемое поведение

Думаю, проще всего сделать комментарий, которым можно указать Edt какой тип в данном случае возвращается.

Т.к. данная ситуация иллюстрирует множество проблем типизации в 1с: Тип Произвольный считается неопределенным, но фигурирует в типах аргументов процедур и функций в том числе и системных. В этом случае он должен быть строго определен. Вторая проблема - в разных местах тип Произвольный включает в себя разный набор типов. Например в соответствии можно указать Элемент управления формы, а в реквизите справочника - этого сделать нельзя, хотя оба значения описаны как "Произвольный". Тут возможно стоит менять и справочную систему и подсказки, вводить типы в сам язык и т.п. Как вариант, пока склоняюсь с определением типа через комментарий.

Лог рабочей области

не требуется

Версия 1С:EDT

2022.1

Операционная система

Windows

Установленные плагины

No response

Дополнительная информация

No response

DmitryShvaika avatar Jul 25 '22 07:07 DmitryShvaika

Это проверка из "строгой типизации", к ЕДТ не имеет отношения.

marmyshev avatar Jul 25 '22 14:07 marmyshev

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

Тут либо непонимание, либо нужно уточнить что имелось ввиду?

Произвольный - это один тип, а Неопределено - это другой тип. Два разных типа, с разным смыслом.

marmyshev avatar Jul 25 '22 14:07 marmyshev

Вторая проблема - в разных местах тип Произвольный включает в себя разный набор типов. Например в соответствии можно указать Элемент управления формы, а в реквизите справочника - этого сделать нельзя, хотя оба значения описаны как "Произвольный".

Просьба уточнить, в чем именно проблема? "везде всё разное" - это констатация факта, а не пояснение почему это является проблемой.

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

  • Понятно ведь что в реквизитах таблиц БД нельзя хранить объект "Элемент управления формы" - тут ясно почему ограничение на типы в реквизитах.
  • Реквизиты формы - это другой объект, не связанный с БД.
  • А в коде - вообще третий уровень типизации объектов

А где проблема - предлагаю прямо написать: "вот в этом случае не так как надо..."

marmyshev avatar Jul 25 '22 14:07 marmyshev

Предлагаю в параметрах проверки установить галку проверять "strict-types" по умолчанию просто. Тема очень сложная. Но сейчас в модуле нет строгой типизации и по умолчанию "из коробки" edt выдает эту ошибку.

Дальше можно добавить символ, например воскл. знак "!" (или другой символ) чтобы при определении типа через комментарий edt не добавляла свои вычисленные типы

например

б = а[Ключ]; // !Структура

чтобы б детектировалась как структура. Или это приведет к коллапсу и "переопределению" типа? Тогда можно разрешить выбрать "уточнение" из уже определенных, а на другие - пусть ругается

DmitryShvaika avatar Jul 27 '22 08:07 DmitryShvaika

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

Тут либо непонимание, либо нужно уточнить что имелось ввиду?

Произвольный - это один тип, а Неопределено - это другой тип. Два разных типа, с разным смыслом.

Если произвольный - это "тип" и он включает в себя число, строку и даже полеформы, то почему он не включает в себя структуру... Почему надо в типах писать Произвольный, Число, когда Произвольный и так включает в себя число. Т.е. Произвольный в понимании edt некий нетипизированный тип, неопределенный тип.

DmitryShvaika avatar Jul 27 '22 08:07 DmitryShvaika

 Просьба уточнить, в чем именно проблема? "везде всё разное" - это констатация факта, а не пояснение почему это является проблемой.

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

Понятно ведь что в реквизитах таблиц БД нельзя хранить объект "Элемент управления формы" - тут ясно почему ограничение на типы в реквизитах.
Реквизиты формы - это другой объект, не связанный с БД.
А в коде - вообще третий уровень типизации объектов
А где проблема - предлагаю прямо написать: "вот в этом случае не так как надо..."

Проблема, что для всех трех уровней в использовании типа Произвольный. И он будет разный по составу. Получается один Произвольный совсем не равен другому Произвольному. Возникает проблема с пониманием - входит ли в этом месте какой-то конкретный тип в указанный Произвольный или нет. Но это проблема платформы. Можно попробовать только обойти ее через уточнение типов.

DmitryShvaika avatar Jul 27 '22 08:07 DmitryShvaika

Ну вот как раз пример на "Пересечение типов":

image

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

DmitryShvaika avatar Jul 28 '22 06:07 DmitryShvaika