Тип «неизвестно»
В ряде случаев необходимо описать переменную, тип которой мы не знаем в момент написания приложения. При этом нам важно, чтобы это была конкретная переменная. От этой переменной можно вызывать какие-то методы, эта переменная может принимать участие в операциях и т. д. Но в случае языка с явной типизацией переменных, мы не можем просто описать переменную, не указывая ее типа.
В данной ситуации можно объявить переменную составного типа Объект?. Такой тип позволит присвоить нашей переменной абсолютно любое значение, т. к. тип Объект является базовым для любых других типов, кроме Неопределено. А суффикс ? позволяет присваивать в нашу переменную и значение Неопределено. Но при таком описании переменной нам доступен только метод ПолучитьТип() и вс е. Это произойдет потому, что компилятор «знает» только об этом методе.
Чтобы решить эту проблему, существует тип неизвестно. Фактически, данный тип существует исключительно во время компиляции исходного текста программы. Его назначение: отключить проверку типов компилятора. Все проверки будут выполняться во время исполнения, когда станет ясно, значение какого типа размещено в переменной, объявленной с типом неизвестно.
Сказанное выше иллюстрирует пример:
метод ТипНеизвестно()
    область
        пер Значение: Объект?
        Значение = "Строка"
        пер Результат = Значение.Длина()
    ;
    область
        пер Значение: неизвестно
        Значение = "Строка"
        пер Результат = Значение.Длина()
    ;
;
Попытка выполнить данный пример (в приведенном виде) приведет к ошибке компиляции Неизвестный метод "Объект.Длина" в строке пер Результат = Значение.Длина() первой области. Если эту строку закомментировать, то пример выполнится успешно.
Когда можно применять данный тип?
Допустим, у нас есть набор структур, который описывает файлы в файловой системе. Каждая структура содержит общий набор полей, например, имя файла и его тип. И для каждого типа файла есть специфический набор полей. При этом нам нужен метод, который будет принимать на вход любую из таких структур в качестве параметра и выполнять какие-то общие действия. В этом случае встает вопрос — каким образом типизировать параметр нашего метода? Можно рассмотреть вариант составного типа, но тогда при добавлении нового типа файла придется уточнить состав типов. Другой вариант — описать параметр метода с помощью типа неизвестно.