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