Почему не виден элемент перечисления из расширения на клиенте и как это исправить

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет IT и автоматизация бизнеса
← На главную

При доработке типовых конфигураций (например, 1С:ERP Управление предприятием, 1С:Комплексная автоматизация или 1С:Управление торговлей) разработчики часто сталкиваются с необходимостью добавить новые операции в заимствованные перечисления через расширение конфигурации. Типичный сценарий — добавление нового шага в механизм закрытия месяца через расширение перечисления ОперацииЗакрытияМесяца.

Нередко возникает ситуация: на стороне сервера добавленное значение успешно считывается и обрабатывается, однако на тонком клиенте функция ПредопределенноеЗначение возвращает ошибку или пустое значение, а в пользовательских интерфейсах новый элемент не отображается. Разберем по шагам причины такого поведения платформы 1С:Предприятие 8.3 и рассмотрим способы решения проблемы.

Причина 1: Кэширование метаданных на тонком клиенте

Проанализируем механику работы клиентского приложения. Тонкий клиент 1С кэширует структуру метаданных конфигурации и расширений локально на компьютере пользователя для ускорения запуска и снижения нагрузки на сервер. Функция ПредопределенноеЗначение делает обращение к серверу только при первом вызове, после чего сохраняет соответствие во внутреннем кэше сеанса.

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

Для устранения этой проблемы выполним следующие действия:

  1. Завершим все активные сеансы работы тонкого клиента под текущим пользователем.
  2. Запустим информационную базу с ключом очистки кэша командной строки /ClearCache.
  3. При сохранении проблемы вручную очистим локальные каталоги кэша 1С (папки 1Cv8 в каталогах AppData\Local\1C\1Cv8 и AppData\Roaming\1C\1Cv8).

Причина 2: Особенности синтаксиса обращения к заимствованным перечислениям

Посмотрим на пример программного обращения к добавленному значению перечисления. На сервере прямое обращение через точку вида Перечисления.ОперацииЗакрытияМесяца.МойВидОперации может приводить к ошибке синтаксического контроля конфигуратора, если основная конфигурация не содержит этого свойства на этапе статического анализа.

Чтобы избежать ошибок синтаксического анализа и проблем времени выполнения, обращение к новым элементам необходимо выполнять через оператор индексирования по имени или через методы работы с предопределенными значениями.

Рассмотрим рабочий пример вызова на клиенте и на сервере:


&НаКлиенте
Процедура ПроверитьЗначениеПеречисления(Команда)

	// Получение значения на клиенте через ПредопределенноеЗначение
	ЗначениеНаКлиенте = ПредопределенноеЗначение("Перечисление.ОперацииЗакрытияМесяца.Расш1_МойВидОперации");
	Сообщить("Клиент: " + Строка(ЗначениеНаКлиенте));
	
	// Получение значения с сервера
	ЗначениеССервера = ПолучитьЗначениеПеречисленияНаСервере();
	Сообщить("Сервер: " + Строка(ЗначениеССервера));

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

&НаСервереБезКонтекста
Функция ПолучитьЗначениеПеречисленияНаСервере()

	// Обращение через точку к элементу из расширения может вызывать синтаксическую ошибку
	// Безопасное обращение выполняется через квадратные скобки по имени значения:
	Возврат Перечисления.ОперацииЗакрытияМесяца["Расш1_МойВидОперации"];

КонецФункции

Выясним причину устойчивости такой конструкции: обращение Перечисления.ИмяПеречисления["ИмяЭлемента"] разрешается динамически в рантайме менеджером перечисления и не блокируется парсером модуля при сохранении расширения.

Причина 3: Настройки и назначение расширения конфигурации

Проверим свойства самого расширения в дереве метаданных. Возможность расширять состав элементов существующих перечислений регулируется платформой со следующими ограничениями:

  1. Режим совместимости: Режим совместимости конфигурации и расширения должен быть установлен не ниже версии 8.3.14. В более ранних версиях расширение состава значений заимствованных перечислений платформенно заблокировано.
  2. Назначение расширения: Свойство расширения «Назначение» должно иметь значение Адаптация или Дополнение. Расширения с назначением «Исправление» (патч) не могут модифицировать структуру типов и добавлять новые элементы данных.
  3. Безопасный режим: Убедимся, что для расширения отключен безопасный режим (БезопасныйРежим = Ложь), если его алгоритмы используют привилегированные операции или фоновые процессы.

Особенности интеграции в подсистему «Закрытие месяца»

Разберем архитектурный нюанс конфигураций на базе ERP и КА: простого добавления элемента в перечисление ОперацииЗакрытияМесяца недостаточно, чтобы регламентная операция появилась в дереве рабочего места «Закрытие месяца».

Форма закрытия месяца формирует состав дерева этапов программно на стороне сервера. Чтобы форма на тонком клиенте отобразила добавленный этап, необходимо переопределить методы общего модуля ЗакрытиеМесяцаСервер:

  1. В модуле расширения подключимся к процедуре ЗаполнитьОписаниеЭтаповЗакрытияМесяца (используя аннотацию &После).
  2. Зарегистрируем новый этап, сопоставив ему добавленное значение перечисления, наименование, признак активности и алгоритм проверки актуальности.
  3. В процедуре ЗаполнитьОписаниеГруппЭтаповЗакрытияМесяца привяжем новый этап к нужной группе закрытия месяца.
  4. Убедимся, что фоновые задания регламентных операций закрытия месяца выполняются в контексте базы с примененным расширением.

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

← На главную