TGViewer
Жёлтый чайник 1С (Черненко Виталий) Жёлтый чайник 1С (Черненко Виталий) @juniorones · 5.3K subscribers
Post #138 4.85K
Жёлтый чайник 1С (Черненко Виталий) Колонки результата запроса У результата запроса есть одна особенность. Какой бы вы ни выбирали тип значений, платформа добавит к колонке результата тип Null. Число, Строка, Булево, Ссылка. Неважно. Даже если по тексту запроса очевидно, что в результате невозможен…
Неопределено - это тип или его отсутствие?

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

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

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

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

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Колонка", Новый ОписаниеТипов("Неопределено"));

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

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

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

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

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

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

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

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

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


//Получили ТЗ с колонкой Неопределено
Запрос = Новый Запрос("ВЫБРАТЬ Неопределено КАК Поле");
ТЗ = Запрос.Выполнить().Выгрузить();

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

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

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

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

————————————
@JuniorOneS | #Нюансы
  • 🔥 1
More from @juniorones
  1. Sep 7, 2026🤖 1С-разработка с ИИ По советам прошел обучение на курсе Владимира Харина. Могу сказать,…
  2. Jul 15, 2026Post #768
  3. Jun 11, 2026🚀 Записался на вахту 18 июня стартует уже третий поток у Владимира Харина на курсе «1С-ра…
  4. Jun 5, 2026Нашел себе новое задротское хобби (а планировал пойти в спортзал) - ардуино. Давно погляды…
  5. Jun 1, 2026📈 Оптимизация настроек СКД 🧲😺 Внутри Магнита огромный лес легаси кода. И иногда мы им д…
  6. Apr 27, 2026⚫️️️️️️️️️️️️️️️️️️️️️️ 1С DAY от MAGNIT TECH: погружение в практику и технологии! ️️️️Вст…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →