При работе в конфигурациях на обычных формах (например, в «Бухгалтерии государственного учреждения» редакции 1.0 или «Управлении производственным предприятием») пользователи могут столкнуться с неожиданным аварийным завершением работы программы. Ошибка возникает при попытке открыть справочник, выбрать значение в поле документа или просто при прокрутке списка. При этом система выдает сообщение следующего вида:
{ОбщийМодуль.РаботаСДиалогами.Модуль(404)}: Поле объекта не обнаружено (НеАктуален)
Особенно загадочным в этой ситуации выглядит то, что ошибка может воспроизводиться только у одного конкретного сотрудника, в то время как у остальных пользователей с абсолютно аналогичными правами доступа (включая полные права) всё работает корректно. Более того, очистка локального кэша на компьютере или запуск программы под этой учетной записью на другом рабочем месте не приносят результата.
В этой статье мы подробно разберем физику процесса — почему возникает данное поведение платформы «1С:Предприятие», и рассмотрим три эффективных способа решения проблемы: от быстрой пользовательской настройки до надежного изменения кода в конфигураторе.
---
Для начала проанализируем код общего модуля, на который ссылается система во время сбоя:
Процедура УстановитьЦветТекстаНеактуальныхЗначенийВСтроках(ОформленияСтрок, ИмяРеквизитаАктуальности, ЗначениеНеактуальности = Истина) Экспорт
Для каждого ТекОформлениеСтроки из ОформленияСтрок Цикл
Если ТекОформлениеСтроки.ДанныеСтроки = Неопределено Тогда
Продолжить;
ИначеЕсли ТекОформлениеСтроки.ДанныеСтроки[ИмяРеквизитаАктуальности] = NULL Тогда
Продолжить;
КонецЕсли;
ТекОформлениеСтроки.ЦветТекста = ?(ТекОформлениеСтроки.ДанныеСтроки[ИмяРеквизитаАктуальности] = ЗначениеНеактуальности, ЦветаСтиля.НедоступныеДанныеЦвет, Новый Цвет);
КонецЦикла;
КонецПроцедуры
Эта процедура отвечает за визуальное оформление строк табличного поля: она окрашивает элементы справочника (например, помеченные как неактуальные или закрытые договора) в серый цвет, сигнализируя пользователю, что данные элементы использовать нежелательно.
Ключевая проблема кроется во встроенном механизме оптимизации платформы «1С:Предприятие» при работе с обычными формами в событии ПриВыводеСтроки. Чтобы снизить нагрузку на сеть и оперативную память, платформа передает с сервера на клиент в структуру ДанныеСтроки только те поля, которые физически отображаются на экране пользователя в данный момент (то есть выведены в виде колонок в табличном поле).
Если пользователь случайно или намеренно воспользовался механизмом настройки интерфейса и убрал флажок видимости с колонки «НеАктуален» (или «Договор закрыт»):
ДанныеСтроки при обработке события вывода строк.ДанныеСтроки[ИмяРеквизитаАктуальности].Поскольку индивидуальные настройки формы (видимость колонок, их ширина, положение) сохраняются платформой непосредственно в базу данных в системные таблицы настроек пользователей, ошибка «путешествует» вместе с учетной записью пользователя на любые компьютеры и не лечится стандартной очисткой локального кэша файлов.
---
Если ошибку необходимо устранить оперативно «здесь и сейчас», достаточно сбросить пользовательские настройки формы списка проблемного справочника (например, «Подразделения» или «Договоры контрагентов»). Сделать это можно двумя путями.
Вариант А. Через интерфейс настройки списка:
Вариант Б. Через управление сохраненными настройками:
---
Пользовательский метод хорош, но он не гарантирует, что завтра другой сотрудник снова не решит скрыть «ненужную» колонку и не спровоцирует аналогичный сбой. Для окончательного решения проблемы на уровне кода конфигурации нам необходимо внести изменения в общий модуль РаботаСДиалогами.
Мы применим безопасный метод проверки наличия свойства в структуре данных с помощью метода Свойство(). Проанализируем и обновим код процедуры:
Процедура УстановитьЦветТекстаНеактуальныхЗначенийВСтроках(ОформленияСтрок, ИмяРеквизитаАктуальности, ЗначениеНеактуальности = Истина) Экспорт
Для каждого ТекОформлениеСтроки из ОформленияСтрок Цикл
Если ТекОформлениеСтроки.ДанныеСтроки = Неопределено Тогда
Продолжить;
// Новая безопасная проверка: проверяем, существует ли вообще колонка в структуре данных строки
ИначеЕсли НЕ ТекОформлениеСтроки.ДанныеСтроки.Свойство(ИмяРеквизитаАктуальности) Тогда
Продолжить;
ИначеЕсли ТекОформлениеСтроки.ДанныеСтроки[ИмяРеквизитаАктуальности] = NULL Тогда
Продолжить;
КонецЕсли;
ТекОформлениеСтроки.ЦветТекста = ?(ТекОформлениеСтроки.ДанныеСтроки[ИмяРеквизитаАктуальности] = ЗначениеНеактуальности, ЦветаСтиля.НедоступныеДанныеЦвет, Новый Цвет);
КонецЦикла;
КонецПроцедуры
Что изменилось? Мы добавили условие ИначеЕсли НЕ ТекОформлениеСтроки.ДанныеСтроки.Свойство(ИмяРеквизитаАктуальности) Тогда Продолжить;. Теперь, если пользователь скроет колонку из видимости, система просто пропустит шаг оформления этой строки, не вызывая критического завершения работы программы. Это наиболее правильный с точки зрения стандартов разработки «1С» подход.
---
Если вы не хотите менять общий код конфигурации, можно решить задачу локально для конкретного справочника. Для этого настроим свойства табличного поля в Конфигураторе.
Рассмотрим порядок действий:
Справочники.Подразделения.Формы.ФормаСписка).НеАктуален и снимите флаг «Изменять видимость».Установка запрета на изменение видимости колонки гарантирует, что колонка всегда будет присутствовать на экране и в структуре данных, а пользователи физически не смогут её отключить через контекстное меню настройки списка.
---
Мы проанализировали специфику работы платформы «1С:Предприятие» с оформлением строк на обычных формах. Подобные ошибки — классический пример конфликта между оптимизацией передачи данных и универсальным кодом конфигурации. Применение безопасного метода Свойство() в общем модуле РаботаСДиалогами позволит вам навсегда застраховать систему от подобных сбоев интерфейса.