Алхимический подход работы с системными перечислениями 1С: систематизированные рецепты для всех версий и типов платформы 8.x

16.12.25

Разработка - Механизмы платформы 1С

В статье рассматривается комплексный подход к работе с системными перечислениями, отдельно уделено обходу ограничений на оператор выполнить и сериализацию данных.

При программировании собственной консоли запросов, особенно для экранов смартфонов, и поддержки платформы 1С 8.0 столкнулся со следующими неприятными особенностями старых мобильных платформ:

Баг был выявлен на версии мобильной платформы: 

Главная проблема работы с системными перечислениями то, что работа с ними ведется через ИмяПеречисления.Значение, что затрудняет разработку, если ИмяПеречисления в одной из версий 1С есть, а в другой нет.

Все способы обхода такой ситуации, можно разделить на следующие категории большие категории:

  1. Классические способы хранения промежуточного результата. Операторы Выполнить/Вычислить  и функции для хранения данных XML и Внутреннего формата.
  2. ОписаниеТипов как универсальный конструктор значения по умолчанию.
  3. Использование функции ПредопределенноеЗначение . Позволяет для 1С 8.3 получить их 
  4. Использование клиентских переменных. Нужен дополнительный код для сохранения значений.

В детализированной форме, категории представлены в сводной таблице.

Сводная таблица способов и ограничений для обычных и управляемых форм

Способ Режим запуска Достоинства Недостатки
Внутренний формат Управляемые формы (сервер и Толстый клиент)/Обычные формы. Простой способ хранения для компьютерных платформ Нет стандартных функций поддержки на мобильных устройствах (требует костылей), пригоден только для строго указанных в документации типов данных.
Выполнить/Вычислить Ограничений нет Работает на компьютерах и мобильных устройствах с ограничениями. IOS не поддерживает операторы Выполнить/Вычислить. А WEB клиент до 1с 8.2.12 только выполнить, а после - только вычислить. Обход для WEB только через костыли.
ОписаниеТипов Ограничений нет Работает на компьютерах и мобильных устройствах Допускает возврат только значения по умолчанию.
XML функции Ограничений нет Работает на компьютерах и мобильных устройствах Пригоден только для строго указанных в документации типов данных.
Предопределенное значение Платформа 1с 8.3.3 для системных перечислений Работает на компьютерах и мобильных устройствах Можно использовать только для серверных системных перечислений.
Внутренние переменные формы или модуля Ограничений нет Работает на компьютерах и мобильных устройствах Для сервера имеется одна проблема - значения всегда сохраняются только на один вызов сервера, после очищаются.

 

Примеры кода рассмотренных способов

 1. Через внутренней формат классическими функциями: 

//Имеет смысл обернуть в попытку.
Пер=ЗначениеИзСтрокиВнутр(Значение); 
Если Пер = Неопределено Тогда // перечисления нет
иначе
//Перечисление есть
КонецЕсли;

 2. ОписаниеТипов как конструктор значения по умолчанию.

//ОбходРезультатаЗапроса - генерация прямой выборки для древней 
// 1С мобильной платформы.
Попытка
 Массив = новый Массив;
 Массив.Добавить(Тип("ОбходРезультатаЗапроса"));
 ОписаниеТипов1 = новый ОписаниеТипов(Массив);
 Значение =  ОписаниеТипов1.ПривестиЗначение(Неопределено); 
исключение
  Значение = Неопределено;
КонецПопытки;
Сообщить(Значение);

3. Вычистить/Выполнить и Предопределенное значение на стороне Сервера управляемых форм или в обычном приложении:

 //Вызов осуществляется на стороне Сервера для Управляемых форм.  
 Попытка				
		#Если МобильноеПриложениеСервер ИЛИ МобильныйАвтономныйСервер Тогда		
			Значение_тест = ПредопределенноеЗначение(НаименованиеПараметра); // Для смартфонов!!!
		#иначе				
			Значение_тест = Вычислить(НаименованиеПараметра); //Для компьютерных платформ!!!			
		#КонецЕсли   			
	Исключение
		Значение_тест = Неопределено;
	КонецПопытки;

4. XMlЗначение пример для восстановления ХранилищаЗначения из строки: 

Значение=XMLЗначение(Тип("ХранилищеЗначения"),СтрокаXML);

5. Использование клиентских переменных  на примере работы с диалогом выбора файлов.

&НаКлиенте

перем ВыборФайлаОткрытие, ВыборФайлаСохранение; //Переменные кэша

&НаКлиенте

Процедура ПриОткрытии(Отказ)

               //Вставить содержимое обработчика  
               // Определяем связанный тип или же исповедуем по версии 
               Попытка
                     Стр=Тип("ДиалогВыбораФайла");
               Исключение     
                     Стр = Неопределено;
               КонецПопытки;

               //Ставим заглушку на обращение к перечислениям
               Если Стр = Неопределено Тогда
                    РежимДиалогаВыбораФайла = Неопределено;
               КонецЕсли;
               //
               Если РежимДиалогаВыбораФайла = Неопределено Тогда  
                   // Установка произвольного нужного значения, когда нет типа!!!
                   ВыборФайлаОткрытие = Неопределено;
                   ВыборФайлаСохранение = Неопределено;                           
               иначе                            
                   //Кэшируем системные перечисления
                   ВыборФайлаОткрытие = РежимДиалогаВыбораФайла.Открытие; 
                   ВыборФайлаСохранение = РежимДиалогаВыбораФайла.Сохранение;
               КонецЕсли;

КонецПроцедуры

Код теста для синхронного режима работы.

&НаКлиенте
Процедура Тест(Команда)
   Если ВыборФайлаОткрытие = НЕОПРЕДЕЛЕНО Тогда
        Сообщить("Не поддерживается - нужен другой способ реализации диалога");
   иначе
        // Все ок - открываем файл  
        МассивАргументов = новый Массив;
        МассивАргументов.Добавить(ВыборФайлаОткрытие);
        Диалог = новый("ДиалогВыбораФайла",МассивАргументов);
        // В реальных системах использовать метод Показать() или другой асинхронный метод
        Если Диалог.Выбрать()=Ложь Тогда
             Сообщить("Не выбран файл");
        КонецЕсли;
   КонецЕсли;
КонецПроцедуры

Изюминка последнего способа в следующем: сохранять таким способом можно даже системные перечисления, которые нельзя передать на сервер, и их достаточно объявить один раз - в момент открытия формы, и потом использовать постоянно.

Вступайте в нашу телеграмм-группу Инфостарт

мобильная платформа Системные перечисления 1с 8.0 1с 8.1 1с 8.2 1с 8.3 1с 8.5

См. также

Механизмы платформы 1С Программист Бесплатно (free)

Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?

16.07.2025    25647    TitanLuchs    106    

145

Механизмы платформы 1С Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    14267    bayselonarrend    127    

68

Механизмы платформы 1С Программист 1С:Предприятие 8 Бесплатно (free)

В этой статье подробно рассматривается работа с JSON в XDTO в 1С:Предприятие. Вы узнаете, как сериализовать и десериализовать объекты XDTO в JSON, интегрировать 1С с веб-сервисами и API, а также корректно обрабатывать данные при обмене. Разбираются особенности работы с коллекциями, использование функций восстановления и частые ошибки при работе с JSON и XDTO.

30.01.2025    15512    user2122906    9    

60

Механизмы платформы 1С WEB-интеграция Программист 1С:Предприятие 8 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    25961    dsdred    77    

142

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    23940    bayselonarrend    22    

174

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    13265    dsdred    22    

85
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. AlexeyChernyev 6 07.03.25 06:31 Сейчас в теме
Интересно. Только поправь пожалуйста опечатку.
Прикрепленные файлы:
2. SerVer1C 997 07.03.25 08:44 Сейчас в теме
3. Dima1205 146 07.03.25 09:10 Сейчас в теме
4. SlavaKron 07.03.25 09:39 Сейчас в теме
Вы решаете ошибку при инициализации модуля? А если просто добавить такую конструкцию перед использованием сомнительного перечисления:
Если Ложь Тогда
ОбходРезультатаЗапроса = Неопределено;
КонецЕсли;
5. Dima1205 146 07.03.25 10:38 Сейчас в теме
(4) Нет - это когда нужно вызвать именно системное перечисление. Для них нет классического метода Менеджер.ИмяПеречисления.Значение как для обычных перечислений - там сразу идет ИмяПеречисления.Значение. И здесь представлены решения, которые удалось экспериментально определить.

Мне это нужно было для случаев:
- На платформах ПК и смартфонов (мобильные платформы), если есть возможность настроить выборку - обойти через группировки.
- Если такого типа нет - тогда организовать простую выборку без учета группировок.
Пришлось экспериментировать для такого решения, поскольку на скрине видите сами значения по умолчанию.
Прикрепленные файлы:
11. Dima1205 146 27.11.25 16:59 Сейчас в теме
(4) Привел итоговый верный пример - руки сразу не дошли до этого...
6. qwinter 684 07.03.25 23:09 Сейчас в теме
Называть багом нежелание автора читать описание изменений платформы это мощно)))
7. Dima1205 146 08.03.25 02:47 Сейчас в теме
(6) Конкретно здесь - да, это баг этой версии:
Скрин с нормальной версии 8.3.5 (8.3.5.1570) во вложении - там эти типы на мобильной платформе есть. Про более новые тоже молчу.
Если такое было бы в 8.3.4 (там вообще объекта Запрос нет в коде мобильной платформы), а в 8.3.5 на всех платформах - я бы про слово баг не писал.
Я здесь привел просто обзор всех способов получения системных перечислений с целью систематизировать процесс с учетом использования смартфонов. Если бы на IOS нормальный сделали Выполнить и Вычислить, то и статью можно было бы не писать.
А про недостаток документации - это то, что такие вещи не описаны в явном виде. Например,если в MSDN мне надо искать сведения про нужные свойства js - то для событий там описано как для старых версий IE, для Edge. Описываются все методы вызова.
А в 1С такого увы...
Пример этого УВЫ - в скрине с сравнением описаний функции НачатьПомещениеФайла на 2-х версиях платформы 8.3.
Прикрепленные файлы:
8. comptr 57 09.03.25 10:07 Сейчас в теме
А разве инструкции препроцессора Клиент и Сервер только для компьютерных платформ?
Если нужно отдельно выделить мобильные платформы, то нужно использовать конкретные значения:
МобильныйКлиент, МобильныйАвтономныйСервер, МобильноеПриложениеКлиент, МобильноеПриложениеСервер.
Прикрепленные файлы:
9. Dima1205 146 09.03.25 13:25 Сейчас в теме
(8) Про препроцессор я в курсе, но как это поможет - если на мобильной платформе 8.3.6 доступны группировки, а на некоторых мобильных платформах 8.3.5 не доступны? У них будет одинаковый препроцессор...
10. Dima1205 146 14.05.25 22:30 Сейчас в теме
(8) #Если МобильноеПриложениеСервер ИЛИ МобильныйАвтономныйСервер Тогда - дополнил препроцессор в статье.
12. Dima1205 146 28.11.25 12:32 Сейчас в теме
В статью добавил заглушки для работы с системными перечислениями на клиенте без оператора Выполнить, когда перечисления не являются серверными.
Для отправки сообщения требуется регистрация/авторизация