В процессе разработки расширений для системы 1С:Предприятие 8.3 программисты нередко сталкиваются с необъяснимым поведением конфигуратора. Одна из наиболее досадных ситуаций — когда вы успешно создаете новый справочник внутри расширения, добавляете в него необходимые реквизиты, создаете форму, но при попытке разместить эти реквизиты на форме обнаруживаете, что их просто нет в дереве данных. В этой статье мы подробно разберем, почему возникает эта проблема, какие версии платформы подвержены данному багу и как вернуть реквизиты на форму.
Давайте разберем ситуацию: объект (справочник) и его данные (реквизиты) физически существуют в дереве объектов расширения. Однако в редакторе управляемой формы, в правой панели (вкладка "Данные"), эти реквизиты отсутствуют. Проанализируем механизмы платформы, которые приводят к такому результату.
Данная проблема является следствием критической ошибки в механизме синхронизации метаданных между основной конфигурацией и расширением. Конфигуратор на определенных версиях платформы «теряет» связь между структурой объекта в расширении и его представлением в конструкторе форм. В результате визуальный редактор не может подтянуть актуальный состав реквизитов, хотя в программном коде к ним иногда можно обратиться (но без контекстной подсказки).
Наиболее часто этот баг проявляется в ветках:
8.3.26.1540.8.3.27.18xx (например, 8.3.27.1859).Рассмотрим основной способ исправления ситуации — переход на стабильную сборку. Как показывает практика и опыт участников сообщества, проблема чаще всего решается установкой корректирующего релиза, в котором исправлены ошибки работы с динамическими метаданными расширений.
Проанализируем рекомендации по версиям:
8.3.27.1936 или выше.8.3.27.1986, так как в ней были замечены регрессионные ошибки, которые могут вернуть старые баги в новых формах.8.3.26.1540.После установки новой версии платформы необходимо обязательно выполнить полное обновление конфигурации базы данных и перезагрузить конфигуратор.
Разберем ситуацию, когда немедленное обновление платформы на сервере и у всех пользователей невозможно по техническим или организационным причинам. В этом случае мы можем применить несколько обходных путей, чтобы заставить конфигуратор «увидеть» реквизиты.
Способ 1. Изменение режима совместимости расширения
Это один из самых эффективных способов заставить платформу полностью перестроить внутренний кэш метаданных для конкретного расширения. Выполним следующие шаги:
РежимСовместимости.8.3.24 на 8.3.23).После этих манипуляций платформа принудительно пересчитывает связи объектов, и реквизиты часто появляются в редакторе форм.
Способ 2. Очистка локального кэша конфигуратора
Иногда проблема кроется в повреждении локальных временных файлов. Выясним, как их правильно удалить:
%AppData%\1C\1cv8%LocalAppData%\1C\1cv8Важно: этот метод помогает, если проблема носит локальный характер и проявляется только у одного разработчика.
Способ 3. Пересоздание формы «с нуля»
Если реквизиты были созданы в расширении после того, как форма была инициализирована в конфигураторе, старая форма может их не подхватывать. Проанализируем алгоритм действий:
В момент первичной инициализации через конструктор платформа обращается к текущему срезу метаданных, что повышает шансы на корректное отображение состава объекта.
Проанализируем еще одну возможную причину — настройки самого расширения. Убедимся, что мы не ограничили состав используемых данных случайно. Проверим свойство Состав в окне свойств расширения. Хотя для объектов, полностью созданных внутри расширения, это редко является проблемой, для заимствованных объектов это критично: если объект заимствован, но его конкретные реквизиты не добавлены в расширение, на форме они не появятся.
Также стоит проверить свойство ИспользоватьОсновныеДанныеИнформационнойБазы. В некоторых случаях его изменение влияет на то, как конфигуратор интерпретирует структуру объектов в памяти.
Чтобы окончательно убедиться, что проблема именно в визуальном редакторе, а не в отсутствии данных в базе, попробуем написать небольшой фрагмент кода в модуле формы:
Процедура ПроверкаНаличияРеквизитов()
// Попробуем обратиться к реквизиту напрямую
Попытка
ЗначениеРеквизита = Объект.ИмяВашегоНовогоРеквизита;
Сообщить("Реквизит доступен программно");
Исключение
Сообщить("Ошибка: реквизит не найден даже в коде!");
КонецПопытки;
КонецПроцедуры
Если код компилируется и выполняется без ошибок, значит, данные в расширении присутствуют, и проблема на 100% заключается в баге отрисовки дерева данных конфигуратором. В этом случае поможет только один из вышеописанных методов (обновление или манипуляции с режимом совместимости).
Подводя итоги, отметим, что работа с расширениями на новых версиях платформы требует осторожности. Рассмотрим основные выводы:
Мы проанализировали специфический баг платформы 1С и разобрали пошагово все возможные пути его решения. Надеемся, эти рекомендации помогут вам сэкономить время при разработке расширений.