При обновлении конфигурации «Управление производственным предприятием» (УПП) до релиза 1.3.126.1 многие специалисты столкнулись с критической ошибкой. При попытке заполнить документ ОтражениеЗарплатыВРеглУчете система выдает сообщение о невозможности передачи мутабельного значения. Эта проблема блокирует работу бухгалтерии по отражению фонда оплаты труда и требует немедленного вмешательства технического специалиста.
В этой статье мы подробно разберем, почему возникает данная ошибка, какие способы решения существуют и почему некоторые «быстрые» советы из интернета могут только навредить вашей базе данных.
Рассмотрим текст ошибки, который видит пользователь:
{Документ.ОтражениеЗарплатыВРеглУчете.МодульОбъекта(19331)}: Ошибка при вызове метода контекста (ПоказатьВременнуюТаблицу) ... Попытка передачи с клиента на сервер мутабельного значения 2-го параметра метода ПоказатьВременнуюТаблицу ().
Выясним причину такого поведения системы. В платформе 1С:Предприятие 8 под мутабельностью понимается способность объекта изменяться. К таким объектам относятся таблицы значений, менеджеры временных таблиц, прикладные объекты (документы, справочники) и другие. В клиент-серверном варианте работы передача таких объектов между клиентом и сервером запрещена, так как это нарушает целостность данных и архитектурные принципы платформы.
В данном конкретном случае в релизе 1.3.126.1 разработчики 1С допустили досадную оплошность: они оставили в коде вызов отладочного метода РасширеннаяАналитикаУчета.ПоказатьВременнуюТаблицу. Этот метод предназначен исключительно для нужд разработки, чтобы визуально просматривать содержимое временных таблиц в памяти. В качестве параметра в этот метод передается Запрос.МенеджерВременныхТаблиц, который и является тем самым «мутабельным значением».
Проанализируем ситуацию: почему ошибка проявляется не у всех? Чаще всего она «выстреливает» в клиент-серверных базах (на SQL). В файловых версиях границы между клиентом и сервером менее выражены, и платформа иногда позволяет подобные операции, что, скорее всего, и привело к пропуску ошибки на этапе внутреннего тестирования в 1С.
Самый правильный и безопасный способ — это обновление на исправленный релиз. Разработчики оперативно отреагировали на проблему и выпустили внеплановое обновление.
ПоказатьВременнуюТаблицу, которые приводили к сбою.Если ваша конфигурация сильно кастомизирована и оперативное обновление затруднено, мы можем применить «костыль», который полностью устранит проблему без потери функциональности. Разберем по шагам, что нужно сделать в конфигураторе:
ОтражениеЗарплатыВРеглУчете.
РасширеннаяАналитикаУчета.ПоказатьВременнуюТаблицу(Новый Структура("ОтладочныйРежим", Истина), Запрос.МенеджерВременныхТаблиц, "ВТСписокРаботников");
// в начале. Код должен выглядеть следующим образом:
// РасширеннаяАналитикаУчета.ПоказатьВременнуюТаблицу(Новый Структура("ОтладочныйРежим", Истина), Запрос.МенеджерВременныхТаблиц, "ВТСписокРаботников");
Важное замечание: Этот код не несет никакой полезной нагрузки для конечного пользователя. Это «забытый инструмент» программиста, поэтому его отключение никак не повлияет на правильность расчета проводок или заполнение данных.
Рассмотрим еще один совет, который часто встречается на форумах: включить галочку «Клиент (обычное приложение)» в свойствах общего модуля РасширеннаяАналитикаУчета.
Внимание! Мы настоятельно не рекомендуем этого делать. Проанализируем последствия такого изменения:
РасширеннаяАналитикаУчета по умолчанию является привилегированным. Это позволяет ему выполнять сложные запросы и движения по регистрам без проверки прав доступа текущего пользователя. Как только вы включаете флаг «Клиент», признак «Привилегированный» для клиентских вызовов перестает работать.РеализацияТоваровУслуг или РасчетСебестоимостиВыпуска) система начнет выдавать ошибки прав доступа или ошибки передачи данных обратно на клиент (как описано в сообщении 4 форума).Посмотрим на ситуацию в целом: мы столкнулись с классической регрессионной ошибкой. Чтобы её исправить, нам не нужно переписывать сложные алгоритмы. Достаточно либо обновиться до 1.3.126.2, либо просто закомментировать отладочные строки, которые по ошибке попали в релиз. Главное — избегать правок свойств модулей, чтобы не создать лавинообразный эффект новых ошибок в других подсистемах УПП.