Разработка расширений в среде 1С:Предприятие 8.3 — это мощный инструмент, позволяющий модифицировать типовые конфигурации без снятия их с поддержки. Однако программисты часто сталкиваются с ситуацией, когда визуально добавленные в расширение элементы формы или новые реквизиты табличных частей отказываются работать в режиме «Предприятие», выдавая критическую ошибку Поле объекта не обнаружено или Поле объекта недоступно для чтения. В данной статье мы подробно разберем, почему возникают такие «глюки», и как правильно настроить расширение, чтобы все объекты стали видимыми и доступными.
Рассмотрим типичную ситуацию, с которой столкнулся автор темы. В расширение была добавлена команда и соответствующий программный код в форму документа:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Управление доступностью нового элемента НЗИ
Элементы.НЗИ.Доступность = НЕ Объект.Выполнен;
КонецПроцедуры
Несмотря на то, что элемент НЗИ физически добавлен в форму внутри расширения, при запуске система выдает ошибку. Аналогичная проблема возникает при попытке обращения к новым реквизитам табличной части, например СтрЗЧ.Передано. Система сообщает, что поле недоступно для чтения, даже если код кажется абсолютно верным:
Для Каждого СтрЗЧ Из Объект.Материалы Цикл
Если СтрЗЧ.Количество > СтрЗЧ.Передано Тогда
// Логика обработки
КонецЕсли;
КонецЦикла;
Выясним причину этого поведения и проанализируем последовательность действий для исправления ситуации.
Главная и самая частая причина недоступности объектов расширения заключается в специфике работы механизма прав доступа. Проанализируем важный нюанс: права из основной конфигурации никогда не распространяются на объекты расширения автоматически. Даже если пользователь заходит под учетной записью с ролью ПолныеПрава из основной базы, для платформы он не имеет прав на новые объекты, созданные в расширении.
Разберем по шагам, как исправить ситуацию с правами:
ПолныеПраваРасширение).Важный момент: если в расширении уже есть роли, убедитесь, что они действительно включены у текущего пользователя. Часто после обновления расширения список ролей может измениться, и права «слетают».
Если права настроены верно, но объекты все равно не видны или «пропадают» (как в случае автора, когда документ исчез из списка объектов), велика вероятность проблем с серверным кэшем. Выясним, как это работает: кластер серверов 1С хранит кэш расширений в рабочих процессах rphost. При динамическом обновлении или нестабильной работе сети связь между основным объектом и его расширением в базе данных может «разорваться».
Проанализируем шаги для очистки кэша на сервере:
C:\Program Files\1cv8\srvinfo).snccntx и configsave внутри папки вашей базы данных и удалите их содержимое.Это заставит платформу заново пересобрать метаданные при первом обращении пользователя к базе.
Рассмотрим еще один важный параметр, который может блокировать работу кода расширения. В режиме «Предприятие» в списке расширений (Администрирование — Печатные формы, отчеты и обработки — Расширения) для каждого расширения есть флажки «Безопасный режим» и «Защита от опасных действий».
Если включен Безопасный режим, платформа может ограничивать доступ к чтению определенных данных или выполнению серверных вызовов, которые инициируются расширением. Для полноценной работы доработок, особенно связанных с изменением структуры данных, рекомендуется снять эти галочки. После снятия флажков обязательно перезапустите сеанс 1С.
Посмотрим на ситуацию с точки зрения стабильности кода. В сообщении 6 темы прозвучал дельный совет: создавать элементы визуального интерфейса программно. Почему это надежнее?
Когда мы добавляем элемент в расширение визуально в конструкторе формы, 1С сохраняет «снимок» (diff) формы. При обновлении основной конфигурации, если структура оригинальной формы изменится, «наложение» расширения может пройти с ошибкой. Программный метод в процедуре ПриСозданииНаСервере более гибок.
Разберем пример программного добавления элемента:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Проверим, нет ли уже такого элемента, чтобы избежать ошибок при повторном вызове
Если Элементы.Найти("НЗИ") = Неопределено Тогда
НовыйЭлемент = Элементы.Добавить("НЗИ", Тип("ДекорацияФормы"), Элементы.ГруппаКоманд);
НовыйЭлемент.Заголовок = "Дополнительная информация";
// Настройка программной связи с реквизитом
НовыйЭлемент.ПутьКДанным = "Объект.НЗИ";
КонецЕсли;
КонецПроцедуры
Такой подход позволяет избежать ошибки Поле объекта не обнаружено, так как мы можем программно проверить наличие родительских групп и самих данных перед обращением к ним.
Выясним, как проверить, работоспособно ли расширение в целом. Бывают случаи, когда расширение активно (стоит галочка), но оно находится в состоянии частичной применимости. Это происходит, если вы ссылаетесь на объект основной конфигурации, который был удален или переименован в результате обновления.
Как проанализировать применимость:
Подводя итог, если вы столкнулись с ошибкой Поле объекта не обнаружено для элементов расширения, воспользуйтесь следующим алгоритмом:
Соблюдение этих правил гарантирует стабильную работу ваших доработок и отсутствие конфликтов метаданных между основной конфигурацией и расширением.