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