Разработка в расширениях — это мощный инструмент, который позволяет вносить изменения в типовые конфигурации, сохраняя их на поддержке. Однако иногда разработчики сталкиваются с аномальным поведением системы, которое ставит в тупик даже опытных специалистов. Одной из таких проблем является ситуация, когда при создании нового документа непосредственно в расширении, на его форме основной реквизит Объект отказывается «раскрываться». В правой части редактора формы мы видим только надпись Объект без привычного символа «плюс», а все реквизиты, перенесенные на форму, подсвечиваются красным с пометкой «Нет связанного реквизита».
В этой статье мы подробно разберем, почему это происходит, проанализируем технические причины данного явления, рассмотрим связь с конкретными версиями платформы и выясним, как обойти эту проблему или исправить её.
Представим типичный процесс разработки: мы создали расширение, добавили в него новый объект (например, Документ), определили для него несколько реквизитов и табличных частей. После этого мы создаем основную форму документа. На первый взгляд, всё сделано верно:
Объект создан автоматически.ДокументОбъект.НазваниеВашегоДокумента.Однако в редакторе формы дерево реквизитов справа остается «схлопнутым». Мы не можем увидеть составные части объекта, хотя в дереве метаданных слева все реквизиты отображаются корректно. Если попытаться вручную перетащить элементы, Конфигуратор не может сопоставить их с данными. Это классический признак того, что визуальный редактор потерял связь с метаданными расширения.
Проанализируем техническую сторону вопроса. Данная проблема наиболее остро проявилась в ветках платформы 8.3.26 и 8.3.27 (в частности, в релизе 8.3.27.1859). Это признанная ошибка отображения в Конфигураторе. Суть заключается в том, что механизм отрисовки интерфейса разработки в этих версиях некорректно обрабатывает метаданные, созданные «с нуля» внутри расширения.
Интересно, что если в качестве типа реквизита Объект выбрать документ из основной конфигурации, дерево раскрывается мгновенно. Это подтверждает, что проблема локализована именно в обработке объектов, владельцем которых является само расширение. Важно понимать, что это ошибка именно визуального интерфейса Конфигуратора. В режиме «1С:Предприятие» такая форма, скорее всего, будет работать штатно, так как серверная часть платформы правильно интерпретирует структуру данных.
Рассмотрим несколько вариантов действий, которые помогут восстановить работоспособность среды разработки.
Поскольку проблема носит платформенный характер, самым надежным решением будет установка более стабильного релиза. Рассмотрим варианты:
Иногда Конфигуратор «запоминает» ошибочное состояние метаданных. Попробуем выполнить очистку локального кэша:
%LocalAppData%\1C\1cv8 и %AppData%\1C\1cv8.Проанализируем еще один метод, который заставляет систему заново проиндексировать связи в расширении:
.cfe.Разберем важный архитектурный аспект. Хотя платформа позволяет создавать новые документы и справочники в расширениях, сообщество разработчиков и эксперты фирмы «1С» (через статьи на ИТС) часто предостерегают от этого. Давайте выясним, почему:
Риск потери данных при манипуляциях с расширением. В отличие от основной конфигурации, расширение гораздо проще случайно удалить или деактивировать. Как сказано в документации, отключенное расширение эквивалентно удаленному с точки зрения логики, но структуры данных сохраняются. Однако при полном удалении расширения все данные, накопленные в его таблицах (которые имеют в СУБД префикс _ExtX), будут безвозвратно удалены вместе с таблицами.
Сложность миграции. Если со временем вы поймете, что документ должен быть частью основной конфигурации, простого способа «перенести» его не существует. Вам придется создавать аналогичный объект в основной конфигурации и писать обработку по переносу данных на уровне записей таблиц.
Проблемы с программным доступом. Посмотрим на пример кода, который часто используется для проверки влияния расширения на структуру данных:
// Пример проверки расширения на изменение структуры данных
Для Каждого Расширение Из РасширенияКонфигурации.Получить() Цикл
Если Расширение.ИзменяетСтруктуруДанных() Тогда
Сообщить("Расширение " + Расширение.Имя + " влияет на таблицы СУБД");
КонецЕсли;
КонецЦикла;
Работа с такими расширениями требует повышенного внимания при обновлении платформы и выполнении регламентных операций в СУБД.
Проанализировав ситуацию, мы можем составить следующий алгоритм действий для разработчика:
Подводя итог, можно сказать, что проблема «схлопнутого» объекта — это досадная ошибка инструментов разработки, которая лечится либо обновлением платформы, либо аккуратным пересозданием связей. Всегда помните о безопасности данных при работе с расширениями, которые изменяют структуру таблиц базы данных.