Пост

Неопределено - это тип или его отсутствие?

И то и другое. Одновременно...


Действительно, есть такой тип “Неопределено”.

1
2
//Этот код сообщит "Да"
Сообщить( ТипЗнч(Неопределено) = Тип("Неопределено") );

И вроде бы вопрос решен, НО. Попробуйте создать таблицу значений с колонкой, у которой тип - Неопределено:

1
2
3
4
5
6
7
8
9
10
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Колонка", Новый ОписаниеТипов("Неопределено"));

Строка = ТЗ.Добавить();

Строка.Колонка = 1;
Сообщить(Строка.Колонка); //Сообщит: 1

Строка.Колонка = "Строка";
Сообщить(Строка.Колонка); //Сообщит: Строка

Именно, мы получили колонку с произвольным типом, ибо невозможно создать колонку с типом Неопределено.

Кто-то может сказать: “А как же создать колонку с типом, у которого только одно значение?” А вы попробуйте выполнить тот же самый код, но укажите в качестве типа колонки Null ;)

И так. Неопределено - это тип. Но этот тип при этом означает отсутствие типа. И невозможно создать ОписаниеТипов с типом Неопределено:

1
2
ОписаниеТипов = Новый ОписаниеТипов("Null,Неопределено");
Сообщить(ОписаниеТипов.Типы().Количество()); //1

1С проигнорировала Неопределено при создании ОписанияТипов. Вместо этого он появится автоматически, если описание будет составным.

И, в контексте заметки про выгрузки запроса, прекрасно видно, как сама 1С не знает, что же ей делать.

В запросе ниже просто колонка с Неопределено. И эту выгрузку запроса мы не сможем поместить в другой запрос! Попробуйте сами и убедитесь, что получите ошибку: Тип не может быть выбран в запросе

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Получили ТЗ с колонкой Неопределено
Запрос = Новый Запрос("ВЫБРАТЬ Неопределено КАК Поле");
ТЗ = Запрос.Выполнить().Выгрузить();

//Попытались выбрать её в другом запросе
Запрос.Текст = "ВЫБРАТЬ 
|    ТЗ.Поле 
|ПОМЕСТИТЬ ВТ
|ИЗ
|     &ТЗ КАК ТЗ;
|ВЫБРАТЬ 
|    *
|ИЗ 
|    ВТ КАК ВТ";

Запрос.УстановитьПараметр("ТЗ", ТЗ);
Результат = Запрос.Выполнить();

Почему так?

Мы получаем выгрузку запроса. И 1С должна была автоматически добавить тип Null (как она делает всегда ). Но если платформа так сделает, то получит колонку с типом Null, а Неопределено потеряет. Ведь кодом раньше мы доказали себе, что невозможно создать описание типов с этими двумя типами вместе. И тогда 1С идет по другому пути - она создает колонку просто с типом Неопределено. Но по законам платформы такая колонка превращается в тип Произвольный. И становится недоступной для передачи в запрос. Вот незадача 🤷‍♂️

Это не совсем очевидный нюанс платформы. И вы можете с ним столкнуться, если вдруг ваш запрос строится динамически, и в какой-то момент одна из колонок текста запроса содержит только Неопределено. Выгрузку такого запроса невозможно будет поместить в другой запрос. И придется либо намеренно расширять тип до составного (выложил шаблон кода), либо переписывать текущую реализацию.

Авторский пост защищен лицензией CC BY 4.0 .