Как исправить ошибку «Значение не является значением объектного типа (Элементы)» при открытии операций вручную в 1С:Бухгалтерия?

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

В процессе работы с программными продуктами на платформе 1С:Предприятие 8.3 (в частности, с конфигурацией 1С:Бухгалтерия предприятия 3.0) пользователи и администраторы нередко сталкиваются с досадными сбоями после очередного обновления платформы или релиза конфигурации. Одним из ярких примеров такой проблемы является внезапный аварийный останов системы при попытке открыть журнал документов «Операции, введенные вручную».

Система задумывается на несколько секунд, после чего выводит на экран критическое окно с сообщением об ошибке следующего содержания:

{ОбщийМодуль.ОбщегоНазначенияБП.Модуль(1047)}: Значение не является значением объектного типа (Элементы) Для каждого ЭлементНастроек Из Настройки.Элементы Цикл

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

Выясним техническую причину возникновения ошибки

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

Данная процедура предназначена для того, чтобы заменить отбор, установленный пользователем в его сохраненной настройке динамического списка, на тот отбор, который устанавливается программно на сервере в момент инициализации формы. Процедура вызывается автоматически в обработчике события ПередЗагрузкойПользовательскихНастроекНаСервере.

Давайте посмотрим на стандартный исходный код этой процедуры:


Процедура ВосстановитьОтборСписка(Список, Настройки, ИмяОтбора) Экспорт
    Отборы = ОбщегоНазначенияКлиентСервер.НайтиЭлементыИГруппыОтбора(
        Список.КомпоновщикНастроек.Настройки.Отбор, ИмяОтбора);
    
    Если Отборы.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    ЭлементОтбора = Отборы[0];
    ИдентификаторНастройки = ЭлементОтбора.ИдентификаторПользовательскойНастройки;
    
    Для каждого ЭлементНастроек Из Настройки.Элементы Цикл
        Если ТипЗнч(ЭлементНастроек) = Тип("ЭлементОтбораКомпоновкиДанных") 
            И ЭлементНастроек.ИдентификаторПользовательскойНастройки = ИдентификаторНастройки Тогда
            ЭлементНастроек.ПравоеЗначение = ЭлементОтбора.ПравоеЗначение;
            ЭлементНастроек.Использование  = ЭлементОтбора.Использование;
            Прервать;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Проанализируем ситуацию, которая приводит к аварийному завершению. Ошибка возникает в строке Для каждого ЭлементНастроек Из Настройки.Элементы Цикл. Платформа сообщает, что у объекта, к которому мы обращаемся (в данном случае это переменная Настройки), отсутствует свойство Элементы.

Это происходит потому, что на стыке определенных версий платформы (особенно часто на релизах ветки 8.3.13, например 8.3.13.1513) и обновлений конфигурации нарушается обратная совместимость механизмов сериализации сохраненных настроек компоновки данных. При чтении старых настроек пользователя из системного хранилища платформа не может корректно преобразовать сохраненный XML-пакет в объект ПользовательскиеНастройкиКомпоновкиДанных. В результате в параметр Настройки вместо ожидаемой структуры передается значение Неопределено.

Поскольку у значения Неопределено нет и не может быть свойства Элементы, встроенный язык 1С закономерно прерывает выполнение программы с генерацией исключения.

Где еще может проявляться данная неполадка

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

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

Метод 1. Полная очистка настроек пользователя через стандартный интерфейс

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

Разберем этот процесс по шагам:

  1. Войдите в информационную базу под пользователем с правами Администратора.
  2. Перейдите в раздел меню Администрирование, далее выберите пункт Настройки пользователей и прав.
  3. В открывшемся окне найдите группу гиперссылок и перейдите по ссылке Персональные настройки пользователей (в некоторых релизах она может называться «Копирование и очистка настроек»).
  4. В списке пользователей выберите того сотрудника, у которого возникает ошибка при входе в журнал документов.
  5. Нажмите кнопку Очистить все настройки.
  6. Подтвердите действие во всплывающем системном запросе.

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

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

Метод 2. Выборочное (точечное) удаление настроек проблемной формы

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

Выполним следующие шаги:

  1. Перейдите в раздел Администрирование — Настройки пользователей и прав.
  2. Откройте форму Настройки пользователей.
  3. В появившемся окне выберите нужного пользователя из списка.
  4. Перейдите на вкладку Настройки отчетов и форм (или вкладку «Внешний вид» в зависимости от релиза конфигурации).
  5. В представленном дереве настроек найдите ветку, соответствующую проблемному журналу документов. Для ручных операций это будет путь, связанный с объектом Документ.ОперацияБух.ФормаСписка (или русскоязычное название формы «Операции, введенные вручную»).
  6. Выделите именно эту строку в дереве настроек кликом мыши.
  7. Нажмите кнопку Очистить на командной панели или воспользуйтесь клавишей Delete.
  8. Перезапустите сеанс проблемного пользователя и проверьте результат.

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

Метод 3. Программное исправление кода (защита от будущих сбоев)

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

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

  1. Откройте базу данных в режиме Конфигуратора.
  2. Перейдите в меню Конфигурация — Расширения конфигурации.
  3. Создайте новое расширение (например, с именем ИсправлениеОшибокИнтерфейса), укажите назначение «Адаптация» и снимите флаг «Безопасный режим».
  4. В дереве метаданных основной конфигурации найдите общий модуль ОбщегоНазначенияБП, нажмите на него правой кнопкой мыши и выберите команду Добавить в расширение.
  5. В расширении откройте модуль добавленного общего модуля.
  6. Добавьте процедуру-перехватчик с аннотацией &Вместо. Нам нужно полностью заменить логику стандартной процедуры, внеся в нее проверку типа переменной Настройки.

Посмотрим на пример программного кода, который необходимо поместить в модуль расширения:


&Вместо("ВосстановитьОтборСписка")
Процедура Расш_ВосстановитьОтборСписка(Список, Настройки, ИмяОтбора) Экспорт

    // Защитный блок: проверяем корректность переданного объекта настроек.
    // Если настройки не инициализированы платформой или имеют некорректный тип,
    // прерываем выполнение процедуры во избежание аварийного останова.
    Если Настройки = Неопределено 
       Или ТипЗнч(Настройки) <> Тип("ПользовательскиеНастройкиКомпоновкиДанных") Тогда
        Возврат;
    КонецЕсли;

    // Ниже следует стандартный алгоритм типовой конфигурации
    Отборы = ОбщегоНазначенияКлиентСервер.НайтиЭлементыИГруппыОтбора(
        Список.КомпоновщикНастроек.Настройки.Отбор, ИмяОтбора);
    
    Если Отборы.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    ЭлементОтбора = Отборы[0];
    ИдентификаторНастройки = ЭлементОтбора.ИдентификаторПользовательскойНастройки;
    
    Для каждого ЭлементНастроек Из Настройки.Элементы Цикл
        Если ТипЗнч(ЭлементНастроек) = Тип("ЭлементОтбораКомпоновкиДанных") 
            И ЭлементНастроек.ИдентификаторПользовательскойНастройки = ИдентификаторНастройки Тогда
            ЭлементНастроек.ПравоеЗначение = ЭлементОтбора.ПравоеЗначение;
            ЭлементНастроек.Использование  = ЭлементОтбора.Использование;
            Прервать;
        КонецЕсли;
    КонецЦикла;

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

Что дает этот код? Если платформа при чтении поврежденных настроек снова вернет пустое значение Неопределено, наша проверка перехватит этот момент и корректно завершит выполнение процедуры с помощью оператора Возврат. Список документов успешно откроется со стандартными настройками по умолчанию, а пользователь даже не заметит, что в системе произошел какой-то внутренний сбой.

Метод 4. Очистка локального кэша и тестирование информационной базы

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

Рассмотрим порядок действий для очистки локального кэша:

  1. Закройте все запущенные сеансы 1С на компьютере пользователя.
  2. Откройте окно запуска 1С:Предприятие.
  3. Выберите в списке вашу информационную базу и нажмите кнопку Удалить (запишите предварительно путь к базе или имя сервера).
  4. Перезагрузите компьютер, чтобы завершить все фоновые процессы платформы и освободить заблокированные файлы.
  5. Снова откройте окно запуска и добавьте базу в список заново. При этом физические файлы базы данных останутся на месте, но система создаст для нее совершенно новый уникальный идентификатор и чистые папки локального кэша на диске в каталоге %userprofile%\AppData\Local\1C\1Cv8.

Если очистка кэша не дала результата, необходимо выполнить исправление ошибок на уровне СУБД (таблицы системных настроек) через Конфигуратор:

  1. Запустите базу данных в режиме Конфигуратора.
  2. Обязательно сделайте резервную копию базы данных через меню Администрирование — Выгрузить информационную базу.
  3. Перейдите в меню Администрирование и выберите пункт Тестирование и исправление....
  4. В списке проверок установите флаги напротив пунктов Реиндексация таблиц информационной базы, Проверка логической целостности и обязательно Реструктуризация таблиц информационной базы.
  5. В группе переключателей при наличии неразрешенных ссылок выберите «Очищать объекты».
  6. Нажмите кнопку Выполнить и дождитесь окончания процесса (для больших баз это может занять продолжительное время).

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

Подведем итоги

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

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

← На главную