В процессе работы с программными продуктами на платформе 1С:Предприятие 8.3 (в частности, с конфигурацией 1С:Бухгалтерия предприятия 3.0) пользователи и администраторы нередко сталкиваются с досадными сбоями после очередного обновления платформы или релиза конфигурации. Одним из ярких примеров такой проблемы является внезапный аварийный останов системы при попытке открыть журнал документов «Операции, введенные вручную».
Система задумывается на несколько секунд, после чего выводит на экран критическое окно с сообщением об ошибке следующего содержания:
{ОбщийМодуль.ОбщегоНазначенияБП.Модуль(1047)}: Значение не является значением объектного типа (Элементы) Для каждого ЭлементНастроек Из Настройки.Элементы Цикл
В этой статье мы подробно разберем, почему возникает данная ошибка, в каких еще объектах системы она может себя проявлять, а также детально рассмотрим четыре эффективных метода ее устранения — от простого сброса настроек в режиме пользователя до написания отказоустойчивого кода в конфигураторе.
Для того чтобы понять природу сбоя, обратимся к конфигуратору и проанализируем процедуру ВосстановитьОтборСписка, расположенную в общем модуле ОбщегоНазначенияБП. Именно сюда ведут системные логи и стек вызова ошибки.
Данная процедура предназначена для того, чтобы заменить отбор, установленный пользователем в его сохраненной настройке динамического списка, на тот отбор, который устанавливается программно на сервере в момент инициализации формы. Процедура вызывается автоматически в обработчике события ПередЗагрузкойПользовательскихНастроекНаСервере.
Давайте посмотрим на стандартный исходный код этой процедуры:
Процедура ВосстановитьОтборСписка(Список, Настройки, ИмяОтбора) Экспорт
Отборы = ОбщегоНазначенияКлиентСервер.НайтиЭлементыИГруппыОтбора(
Список.КомпоновщикНастроек.Настройки.Отбор, ИмяОтбора);
Если Отборы.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ЭлементОтбора = Отборы[0];
ИдентификаторНастройки = ЭлементОтбора.ИдентификаторПользовательскойНастройки;
Для каждого ЭлементНастроек Из Настройки.Элементы Цикл
Если ТипЗнч(ЭлементНастроек) = Тип("ЭлементОтбораКомпоновкиДанных")
И ЭлементНастроек.ИдентификаторПользовательскойНастройки = ИдентификаторНастройки Тогда
ЭлементНастроек.ПравоеЗначение = ЭлементОтбора.ПравоеЗначение;
ЭлементНастроек.Использование = ЭлементОтбора.Использование;
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Проанализируем ситуацию, которая приводит к аварийному завершению. Ошибка возникает в строке Для каждого ЭлементНастроек Из Настройки.Элементы Цикл. Платформа сообщает, что у объекта, к которому мы обращаемся (в данном случае это переменная Настройки), отсутствует свойство Элементы.
Это происходит потому, что на стыке определенных версий платформы (особенно часто на релизах ветки 8.3.13, например 8.3.13.1513) и обновлений конфигурации нарушается обратная совместимость механизмов сериализации сохраненных настроек компоновки данных. При чтении старых настроек пользователя из системного хранилища платформа не может корректно преобразовать сохраненный XML-пакет в объект ПользовательскиеНастройкиКомпоновкиДанных. В результате в параметр Настройки вместо ожидаемой структуры передается значение Неопределено.
Поскольку у значения Неопределено нет и не может быть свойства Элементы, встроенный язык 1С закономерно прерывает выполнение программы с генерацией исключения.
Описанный сбой в работе общего модуля ОбщегоНазначенияБП не является уникальной проблемой исключительно журнала ручных операций. Так как процедура ВосстановитьОтборСписка является универсальной и используется для обслуживания множества динамических списков по всей конфигурации, аналогичная ошибка может заблокировать работу пользователей при открытии следующих форм:
Теперь, когда мы детально изучили происхождение ошибки и области ее проявления, перейдем к практическим методам ее исправления.
Самый быстрый способ вернуть работоспособность проблемной форме, который помог решить проблему пользователям на форуме, — это полная очистка сохраненных настроек пользователя средствами самой программы. Этот способ не требует использования конфигуратора или изменения программного кода.
Разберем этот процесс по шагам:
После выполнения этой операции кэш настроек данного пользователя будет полностью сброшен. При следующем открытии журнала «Операции, введенные вручную» система создаст настройки формы «с нуля», и список откроется без ошибок.
Важное предупреждение: этот метод имеет существенный недостаток. Вместе с поврежденной настройкой конкретного списка пользователь потеряет вообще все свои индивидуальные доработки интерфейса во всей базе. Будут сброшены размеры и порядок колонок во всех табличных частях, сохраненные варианты отчетов, история выбора элементов, настройки отборов в других документах и положение окон. Чтобы избежать таких неудобств, рассмотрим более аккуратный метод.
Для того чтобы решить проблему и при этом не заставлять пользователя заново настраивать под себя всю программу, мы можем применить точечное удаление поврежденного элемента. Это позволит очистить настройки только для вызывающего ошибку списка документов, оставив остальные элементы интерфейса нетронутыми.
Выполним следующие шаги:
Документ.ОперацияБух.ФормаСписка (или русскоязычное название формы «Операции, введенные вручную»).Delete.Этот способ является наиболее предпочтительным для системных администраторов и специалистов технической поддержки, так как он решает задачу максимально бережно по отношению к пользовательскому опыту.
Если вы хотите гарантировать, что данная ошибка больше никогда не побеспокоит пользователей вашей базы данных при последующих обновлениях платформы или конфигурации, оптимальным решением будет доработка программного кода общего модуля. Мы добавим в процедуру ВосстановитьОтборСписка защитное условие (валидацию входящего параметра).
Для сохранения конфигурации на поддержке настоятельно рекомендуется выполнять данную доработку через механизм расширений конфигурации. Разберем, как это реализовать:
ИсправлениеОшибокИнтерфейса), укажите назначение «Адаптация» и снимите флаг «Безопасный режим».ОбщегоНазначенияБП, нажмите на него правой кнопкой мыши и выберите команду Добавить в расширение.&Вместо. Нам нужно полностью заменить логику стандартной процедуры, внеся в нее проверку типа переменной Настройки.Посмотрим на пример программного кода, который необходимо поместить в модуль расширения:
&Вместо("ВосстановитьОтборСписка")
Процедура Расш_ВосстановитьОтборСписка(Список, Настройки, ИмяОтбора) Экспорт
// Защитный блок: проверяем корректность переданного объекта настроек.
// Если настройки не инициализированы платформой или имеют некорректный тип,
// прерываем выполнение процедуры во избежание аварийного останова.
Если Настройки = Неопределено
Или ТипЗнч(Настройки) <> Тип("ПользовательскиеНастройкиКомпоновкиДанных") Тогда
Возврат;
КонецЕсли;
// Ниже следует стандартный алгоритм типовой конфигурации
Отборы = ОбщегоНазначенияКлиентСервер.НайтиЭлементыИГруппыОтбора(
Список.КомпоновщикНастроек.Настройки.Отбор, ИмяОтбора);
Если Отборы.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ЭлементОтбора = Отборы[0];
ИдентификаторНастройки = ЭлементОтбора.ИдентификаторПользовательскойНастройки;
Для каждого ЭлементНастроек Из Настройки.Элементы Цикл
Если ТипЗнч(ЭлементНастроек) = Тип("ЭлементОтбораКомпоновкиДанных")
И ЭлементНастроек.ИдентификаторПользовательскойНастройки = ИдентификаторНастройки Тогда
ЭлементНастроек.ПравоеЗначение = ЭлементОтбора.ПравоеЗначение;
ЭлементНастроек.Использование = ЭлементОтбора.Использование;
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Что дает этот код? Если платформа при чтении поврежденных настроек снова вернет пустое значение Неопределено, наша проверка перехватит этот момент и корректно завершит выполнение процедуры с помощью оператора Возврат. Список документов успешно откроется со стандартными настройками по умолчанию, а пользователь даже не заметит, что в системе произошел какой-то внутренний сбой.
В редких случаях, когда ошибка блокирует вход в программу настолько жестко, что вы не можете зайти в режим «1С:Предприятие» даже под администратором для сброса настроек, проблема может крыться в глубоком повреждении локального кэша платформы на рабочем компьютере пользователя или в индексах базы данных. В такой ситуации необходимо произвести техническую профилактику.
Рассмотрим порядок действий для очистки локального кэша:
%userprofile%\AppData\Local\1C\1Cv8.Если очистка кэша не дала результата, необходимо выполнить исправление ошибок на уровне СУБД (таблицы системных настроек) через Конфигуратор:
Реструктуризация полностью перестроит физические таблицы хранения настроек пользователей в базе данных, что гарантированно устранит любые внутренние логические несоответствия.
Мы подробно разобрали природу системной ошибки Значение не является значением объектного типа (Элементы) в общем модуле ОбщегоНазначенияБП. Выяснили, что в основе проблемы лежит некорректная интерпретация платформой старых кэшированных настроек динамических списков при переходе на новые релизы.
Для оперативного устранения неисправности на рабочем месте пользователя лучше всего использовать точечное удаление настроек формы через административную панель программы (Метод 2). Это позволит быстро вернуть форму к рабочему состоянию, не затронув другие персональные настройки. Если же вы хотите навсегда застраховать вашу систему от подобных инцидентов в будущем, рекомендуется внедрить программное расширение с валидацией входных параметров (Метод 3).