Как исправить ошибку «Поле объекта не обнаружено (НеАктуален)» в обычных формах 1С

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

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

{ОбщийМодуль.РаботаСДиалогами.Модуль(404)}: Поле объекта не обнаружено (НеАктуален)

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

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

---

Выясняем причину: почему платформа теряет реквизит «НеАктуален»?

Для начала проанализируем код общего модуля, на который ссылается система во время сбоя:


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

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

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

Если пользователь случайно или намеренно воспользовался механизмом настройки интерфейса и убрал флажок видимости с колонки «НеАктуален» (или «Договор закрыт»):

  1. Колонка исчезает с формы списка.
  2. Платформа исключает этот реквизит из состава структуры ДанныеСтроки при обработке события вывода строк.
  3. При вызове общего модуля код пытается обратиться к свойству ДанныеСтроки[ИмяРеквизитаАктуальности].
  4. Поскольку свойства в структуре больше нет, система аварийно завершает работу с ошибкой «Поле объекта не обнаружено».

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

---

Способ 1. Быстрое решение силами пользователя (без программирования)

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

Вариант А. Через интерфейс настройки списка:

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

Вариант Б. Через управление сохраненными настройками:

  1. Перейдите в меню Сервис -> Сохраненные настройки.
  2. В списке настроек найдите записи, относящиеся к форме списка нужного справочника у данного пользователя.
  3. Удалите эти настройки. При следующем открытии справочника платформа автоматически сформирует стандартный вид формы, и ошибка исчезнет.

---

Способ 2. Надежное исправление кода в Конфигураторе (Рекомендуется)

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

Мы применим безопасный метод проверки наличия свойства в структуре данных с помощью метода Свойство(). Проанализируем и обновим код процедуры:


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

Что изменилось? Мы добавили условие ИначеЕсли НЕ ТекОформлениеСтроки.ДанныеСтроки.Свойство(ИмяРеквизитаАктуальности) Тогда Продолжить;. Теперь, если пользователь скроет колонку из видимости, система просто пропустит шаг оформления этой строки, не вызывая критического завершения работы программы. Это наиболее правильный с точки зрения стандартов разработки «1С» подход.

---

Способ 3. Изменение свойств метаданных формы списка

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

Рассмотрим порядок действий:

  1. Откройте Конфигуратор и найдите форму списка проблемного справочника (например, Справочники.Подразделения.Формы.ФормаСписка).
  2. Выделите табличное поле списка на форме и откройте его свойства (клавиша F4).
  3. Найдите свойство «Использовать всегда» (для управляемых или полууправляемых списков) или перейдите в свойства конкретной колонки НеАктуален и снимите флаг «Изменять видимость».

Установка запрета на изменение видимости колонки гарантирует, что колонка всегда будет присутствовать на экране и в структуре данных, а пользователи физически не смогут её отключить через контекстное меню настройки списка.

---

Резюме

Мы проанализировали специфику работы платформы «1С:Предприятие» с оформлением строк на обычных формах. Подобные ошибки — классический пример конфликта между оптимизацией передачи данных и универсальным кодом конфигурации. Применение безопасного метода Свойство() в общем модуле РаботаСДиалогами позволит вам навсегда застраховать систему от подобных сбоев интерфейса.

← На главную