В практике разработчика 1С нередко встречается ситуация: созданное расширение успешно работает месяцами, но после очередного обновления платформы или конфигурации часть функционала «отваливается». Одной из самых загадочных проблем является исчезновение элементов формы, которые были добавлены программно для реквизитов расширения. При этом в конфигураторе всё выглядит корректно, а в режиме отладки данные могут отображаться со странным статусом «недоступно для чтения».
В данной статье мы подробно разберем, почему это происходит именно на современных версиях платформы (начиная с 8.3.22), и как правильно настроить расширение, чтобы интерфейс отображался стабильно. Проанализируем ситуацию на примере документа СписаниеТоваров в конфигурации 1С:Комплексная автоматизация 2.
Рассмотрим типичный сценарий. Разработчик добавляет новый реквизит в табличную часть документа через расширение. Поскольку типовая форма документа может быть сложной, часто используется программное добавление элемента формы в процедуре ПриСозданииНаСервереПосле. Код выглядит примерно так:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Добавление новой колонки в таблицу формы
ЭлементТаблицы = ЭтаФорма.Элементы.Товары;
НоваяКолонка = ЭтаФорма.Элементы.Вставить("ТоварыМойНовыйРеквизит", Тип("ПолеФормы"), ЭлементТаблицы);
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.ПутьКДанным = "Объект.Товары.МойНовыйРеквизит";
КонецПроцедуры
После обновления платформы до версии 8.3.22.1704 (и выше) этот механизм перестает работать. В момент выполнения процедуры ПриСозданииНаСервереПосле элемент на форму добавляется, и отладчик видит его в коллекции ЭтаФорма.Элементы. Однако на событии ПриОткрытии или уже в самом интерфейсе пользователя колонки нет. Если попытаться программно прочитать значение реквизита в расширенной табличной части, система может выдать ошибку или показать статус «недоступно для чтения» в окне вычисления выражений.
Разберем причину такого поведения. Платформа 8.3.22 привнесла значительные изменения в механизмы контроля метаданных. Ранее 1С «прощала» многие несоответствия в настройках расширений. Теперь же механизмы отрисовки управляемой формы стали более жестко привязаны к состоянию базы данных и правам доступа.
Проанализируем ситуацию: если платформа видит, что структура расширения конфликтует с какими-либо правилами (например, режимом совместимости), она может «отключить» видимость этих данных для интерфейса, хотя в памяти объекта они формально существуют. Именно поэтому в отладке мы видим реквизит, но его значение недоступно.
Выясним, какую роль играет Назначение расширения. В 1С существует три основных типа:
Хотя долгое время «Адаптация» позволяла добавлять реквизиты, в новых версиях платформы рекомендуется использовать «Дополнение», если вы расширяете состав данных. Если у вас расширение имеет тип «Адаптация» и оно уже изменило структуру таблиц (добавлены реквизиты), платформа 8.3.22 может игнорировать эти реквизиты при построении формы. Однако просто сменить тип «Адаптация» на «Дополнение» не всегда получится — система выдаст ошибку, так как структура БД уже изменена.
Как показывает практика и эксперименты разработчиков, ключевым фактором является Режим совместимости расширения. Рассмотрим, как это работает. При создании расширения в него автоматически прописывается режим совместимости, актуальный на тот момент (например, 8.3.12). Основная конфигурация (например, КА 2.5) после обновления может иметь режим 8.3.17 или выше.
Начиная с платформы 8.3.22, механизмы объединения (мерджа) форм стали крайне чувствительны к этому параметру. Если режим совместимости расширения ниже, чем у основной конфигурации, платформа использует устаревший алгоритм генерации формы, который «не видит» программно добавленные элементы расширения, если они связаны с новыми данными.
Решение: необходимо зайти в свойства расширения (в корневой узел) и установить параметр Режим совместимости точно таким же, какой установлен в основной конфигурации. После этого необходимо выполнить обновление конфигурации базы данных.
Если обновление режима совместимости не помогло, проанализируем влияние функциональных опций (ФО). Если ваш новый реквизит в расширении случайно был включен в состав какой-либо ФО, которая в базе выключена, то элемент формы будет автоматически скрыт платформой. Проверьте свойство Состав у функциональных опций в расширении и основной конфигурации.
Также важно убедиться, что права на новый реквизит добавлены в соответствующие Роли внутри расширения. В КА 2.5 права управляются через профили групп доступа. Даже если вы зашли под «Админом», убедитесь, что в расширении создана роль, дающая права на чтение и просмотр нового реквизита, и эта роль назначена пользователю или добавлена в профиль.
Платформа 8.3.22 активно кэширует структуру форм на стороне сервера. Иногда, даже после исправления всех настроек, форма продолжает отображаться некорректно. В этом случае поможет только радикальная мера — очистка серверного кэша. На сервере 1С:Предприятия необходимо:
snccntx в каталоге данных кластера.Подведем итог. Чтобы ваши реквизиты не исчезали с формы после перехода на 8.3.22, придерживайтесь следующих правил:
ПриСозданииНаСервереПосле не срабатывает, попробуйте добавить элемент интерактивно в расширенную форму (через редактор формы), если это возможно.Соблюдение этих правил позволит избежать «мистических» исчезновений элементов и обеспечит стабильную работу ваших доработок на самых современных версиях платформы 1С:Предприятие.