В практике разработчика 1С иногда возникает крайне странная и неприятная ситуация: в управляемой форме на стороне сервера Объект (основной реквизит формы) виден и полностью доступен, но как только исполнение переходит на сторону клиента, попытка обратиться к любому его свойству (например, Объект.Дата или Объект.ДисконтнаяКарта) вызывает ошибку «Недоступно для чтения». Это ставит в тупик, так как код кажется верным, а настройки формы не менялись. Разберем по шагам, почему это происходит и как найти «виновника» проблемы.
Для начала проанализируем фундаментальный механизм работы управляемого приложения. Важно понимать, что Объект на сервере и Объект на клиенте — это разные сущности, хотя они и синхронизируются платформой автоматически.
На сервере, в контексте модуля формы, реквизит Объект имеет тип, соответствующий объекту метаданных, например, ДокументОбъект.Продажа или СправочникОбъект.Контрагенты. В этом состоянии он обладает всеми методами и свойствами прикладного объекта.
На клиенте же Объект превращается в специальный тип данных — ДанныеФормыСтруктура. Это «облегченная» проекция данных, которая была сериализована на сервере и передана по сети. Если платформа по какой-то причине не может правильно собрать эту структуру или считает, что данные на клиенте не должны быть доступны, мы получаем ошибку чтения.
Как показывает практика и опыт многих разработчиков, наиболее частой причиной внезапного «окирпичивания» свойств объекта являются расширения. Рассмотрим механизм возникновения ошибки: вы добавляете новый объект (например, обработку или отчет) в расширение, и это косвенно влияет на общую модель метаданных системы.
Если расширение содержит объекты, которые конфликтуют с основной конфигурацией по именам или типам, или если само расширение было некорректно скомпилировано платформой после обновления основной базы, дескриптор формы может повредиться. В итоге на серверной стороне данные есть, но при попытке передать их на клиент (сериализовать в ДанныеФормыСтруктура), платформа блокирует доступ к полям из-за нарушения целостности модели данных.
Что нужно сделать: Проанализируем последние изменения в расширениях. Попробуйте поочередно отключать расширения и проверять работоспособность формы. Если после удаления конкретного объекта из расширения (как в случае с обработкой в РМК) всё заработало — значит, вы столкнулись с коллизией метаданных.
Выясним, не связаны ли реквизиты вашего объекта с функциональными опциями. После обновления конфигурации разработчики вендора часто добавляют новые ФО, которые управляют видимостью и доступностью полей.
Если реквизит объекта (например, ДисконтнаяКарта) входит в состав функциональной опции, и эта опция в текущем сеансе выключена, то на клиенте это свойство станет недоступным. Платформа просто «вырезает» его из структуры данных формы для экономии трафика и обеспечения логики интерфейса.
Проверить это можно следующим кодом на сервере:
// Проверим значение функциональной опции программно
ЗначениеОпции = ПолучитьФункциональнуюОпцию("ИмяВашейФункциональнойОпции");
Если Не ЗначениеОпции Тогда
Сообщить("Функциональная опция выключена, реквизиты могут быть недоступны!");
КонецЕсли;
Рассмотрим ситуацию, когда база работает в режиме тонкого клиента. В отличие от толстого клиента, где доступ к некоторым свойствам может быть более свободным, тонкий клиент жестко ограничен структурой, переданной с сервера. Если в процессе обновления изменился режим совместимости платформы или версия самой платформы, механизмы сериализации могут начать работать иначе.
Иногда помогает простая проверка основного реквизита формы. Убедитесь, что в редакторе формы реквизит Объект по-прежнему помечен жирным шрифтом (является основным) и его тип соответствует ожидаемому. Посмотрим на типичный пример ошибки типизации:
&НаКлиенте
Процедура ПроверитьДоступность()
// Если здесь возникает ошибка "Поле объекта недоступно для чтения"
// Значит структура ДанныеФормыСтруктура не была корректно заполнена
Попытка
Значение = Объект.ИмяРеквизита;
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Проанализируем влияние кэша. 1С активно кэширует структуру метаданных как на стороне сервера, так и на стороне клиента. При динамическом обновлении или установке расширений кэш может «протухнуть», и клиентское приложение будет пытаться обращаться к объекту, используя старое описание структуры, которое уже не соответствует серверному.
Рекомендуемые действия по очистке:
/ClearCache.%AppData%\1C\1cv8 и %LocalAppData%\1C\1cv8.Если вы столкнулись с этой проблемой, пройдите по следующим шагам:
Объект.Свойство происходит именно в модуле формы. Помните, что нельзя передавать Объект (как ДанныеФормыСтруктура) в общие модули без явного указания типа в параметрах, если они не скомпилированы для клиента.&НаСервереПриСозданииНаСервере принудительно проверьте тип реквизита Объект. Он должен быть ДанныеФормыСтруктура.Подводя итог, можно сказать, что недоступность свойств Объекта на клиенте — это почти всегда признак того, что «клиентская часть» формы не смогла синхронизироваться с «серверной». В современных конфигурациях вроде Розницы 2.2 или 3.0, где активно используются расширения и сложные механизмы РМК, это чаще всего лечится исправлением ошибок в метаданных расширений или полной очисткой кэша конфигурации.