При программировании собственной консоли запросов, особенно для экранов смартфонов, и поддержки платформы 1С 8.0 столкнулся со следующими неприятными особенностями старых мобильных платформ:
Этот баг был выявлен на версии платформы:
Поэтому встал вопрос: как получить значение системного перечисления из строки? Для системных перечислений нет описания того, как определить наличие этого перечисления на нужной версии платформы в документации.
ПРИМЕЧАНИЕ: Статья написана в справочных целях как памятка, и также для того, чтобы закрыть этот не слишком приятный момент в документации.
По итогу разбора полетов (учитывая многострадальный IOS), получилась следующая таблица основных способов вызова системных перечислений:
Способ | Достоинства | Недостатки |
1. Использование внутреннего формата 1С (функции времен 1с 7.7). |
Универсально для всех компьютерных платформ | Не поддерживается в мобильном приложении |
2. Получение значения при помощи конструкции ОписаниеТипов. | Работает везде, включая мобильное приложение. | Допускает возврат только значения по умолчанию. |
3. Использование оператора Вычислить или Выполнить | Работает как на компьютерных платформах, так и на мобильных приложениях. | IOS не поддерживает операторы Вычислить или Выполнить |
4. Использование функции ПредопределенноеЗначение | Работает везде, включая мобильное приложение. | Требует платформы 1с 8.2.9 и выше. |
Примеры исходного кода первых двух способов:
//Для первого способа:
ЗначениеИзСтрокиВнутр(Значение));
//Для второго способа:
//ОбходРезультатаЗапроса - генерация прямой для древней 1С платформы (мобильная - в первых версиях не был определен).
Попытка
Массив = новый Массив;
Массив.Добавить(Тип("ОбходРезультатаЗапроса"));
ОписаниеТипов1 = новый ОписаниеТипов(Массив);
Значение = ОписаниеТипов1.ПривестиЗначение(Неопределено);
исключение
Значение = Неопределено;
КонецПопытки;
Сообщить(Значение);
Последние 2 способа удобно объединить в следующую конструкцию:
//Вызов осуществляется на стороне Сервера для Управляемых форм.
Попытка
#Если Клиент ИЛИ Сервер ИЛИ ВнешнееСоединение Тогда
Значение_тест = Вычислить(НаименованиеПараметра); //Для компьютерных платформ!!!
#иначе
Значение_тест = ПредопределенноеЗначение(НаименованиеПараметра); // Для мобильного телефона
#КонецЕсли
Исключение
Значение_тест = Неопределено;
КонецПопытки;
Заключение: Некоторые системные перечисления можно получить при помощи сериализации или функции XMLСтрока, однако приведенные методы позволяют это сделать и с несериализуемыми типами данных.