При доработке типовых конфигураций (например, 1С:ERP Управление предприятием, 1С:Комплексная автоматизация или 1С:Управление торговлей) разработчики часто сталкиваются с необходимостью добавить новые операции в заимствованные перечисления через расширение конфигурации. Типичный сценарий — добавление нового шага в механизм закрытия месяца через расширение перечисления ОперацииЗакрытияМесяца.
Нередко возникает ситуация: на стороне сервера добавленное значение успешно считывается и обрабатывается, однако на тонком клиенте функция ПредопределенноеЗначение возвращает ошибку или пустое значение, а в пользовательских интерфейсах новый элемент не отображается. Разберем по шагам причины такого поведения платформы 1С:Предприятие 8.3 и рассмотрим способы решения проблемы.
Проанализируем механику работы клиентского приложения. Тонкий клиент 1С кэширует структуру метаданных конфигурации и расширений локально на компьютере пользователя для ускорения запуска и снижения нагрузки на сервер. Функция ПредопределенноеЗначение делает обращение к серверу только при первом вызове, после чего сохраняет соответствие во внутреннем кэше сеанса.
Если расширение конфигурации было обновлено или подключено динамически (без перезапуска клиентского сеанса или без сброса локальных временных файлов), тонкий клиент продолжает использовать устаревшую структуру метаданных. В результате добавленный элемент перечисления на клиенте оказывается недоступен.
Для устранения этой проблемы выполним следующие действия:
1Cv8 в каталогах AppData\Local\1C\1Cv8 и AppData\Roaming\1C\1Cv8).Посмотрим на пример программного обращения к добавленному значению перечисления. На сервере прямое обращение через точку вида Перечисления.ОперацииЗакрытияМесяца.МойВидОперации может приводить к ошибке синтаксического контроля конфигуратора, если основная конфигурация не содержит этого свойства на этапе статического анализа.
Чтобы избежать ошибок синтаксического анализа и проблем времени выполнения, обращение к новым элементам необходимо выполнять через оператор индексирования по имени или через методы работы с предопределенными значениями.
Рассмотрим рабочий пример вызова на клиенте и на сервере:
&НаКлиенте
Процедура ПроверитьЗначениеПеречисления(Команда)
// Получение значения на клиенте через ПредопределенноеЗначение
ЗначениеНаКлиенте = ПредопределенноеЗначение("Перечисление.ОперацииЗакрытияМесяца.Расш1_МойВидОперации");
Сообщить("Клиент: " + Строка(ЗначениеНаКлиенте));
// Получение значения с сервера
ЗначениеССервера = ПолучитьЗначениеПеречисленияНаСервере();
Сообщить("Сервер: " + Строка(ЗначениеССервера));
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЗначениеПеречисленияНаСервере()
// Обращение через точку к элементу из расширения может вызывать синтаксическую ошибку
// Безопасное обращение выполняется через квадратные скобки по имени значения:
Возврат Перечисления.ОперацииЗакрытияМесяца["Расш1_МойВидОперации"];
КонецФункции
Выясним причину устойчивости такой конструкции: обращение Перечисления.ИмяПеречисления["ИмяЭлемента"] разрешается динамически в рантайме менеджером перечисления и не блокируется парсером модуля при сохранении расширения.
Проверим свойства самого расширения в дереве метаданных. Возможность расширять состав элементов существующих перечислений регулируется платформой со следующими ограничениями:
БезопасныйРежим = Ложь), если его алгоритмы используют привилегированные операции или фоновые процессы.Разберем архитектурный нюанс конфигураций на базе ERP и КА: простого добавления элемента в перечисление ОперацииЗакрытияМесяца недостаточно, чтобы регламентная операция появилась в дереве рабочего места «Закрытие месяца».
Форма закрытия месяца формирует состав дерева этапов программно на стороне сервера. Чтобы форма на тонком клиенте отобразила добавленный этап, необходимо переопределить методы общего модуля ЗакрытиеМесяцаСервер:
ЗаполнитьОписаниеЭтаповЗакрытияМесяца (используя аннотацию &После).ЗаполнитьОписаниеГруппЭтаповЗакрытияМесяца привяжем новый этап к нужной группе закрытия месяца.Таким образом, для успешного использования нового значения перечисления из расширения на клиенте необходимо соблюдать корректный синтаксис получения ссылки, вовремя выполнять сброс клиентского кэша и регистрировать добавленную операцию в алгоритмах типовой подсистемы.