При работе с расширениями конфигурации в системе 1С:Предприятие 8.3 разработчики часто сталкиваются с неприятной особенностью: при добавлении новой таблицы значений (ТЗ) или её колонок в заимствованную форму, поля свойств (например, Тип значения) становятся недоступными для редактирования. Платформа принудительно устанавливает тип Строка и блокирует любые изменения, как будто объект открыт только для чтения.
В этой статье мы подробно разберем, почему возникает эта ситуация, проанализируем причины поведения платформы и изучим несколько эффективных способов обхода этой проблемы, включая "хитрости" визуального редактора и программные методы создания метаданных.
Прежде всего, выясним причину. Данное поведение является зарегистрированной ошибкой технологической платформы (например, Bug ID 10214488). Она проявлялась наиболее остро в версиях 8.3.15.1489, 8.3.15.1700 и 8.3.16.1063. Суть проблемы заключается в некорректной работе механизма десериализации метаданных. Когда расширение "накладывается" на основную конфигурацию, визуальный редактор ошибочно наследует признак неизменяемости для новых объектов, которые фактически не принадлежат основной базе, а созданы только в расширении.
Также проанализируем влияние режима совместимости. Если режим совместимости расширения отличается от режима совместимости основной конфигурации, механизмы проверки прав правки метаданных могут работать нестабильно. Рассмотрим пошагово, как можно обойти это ограничение.
Это самый популярный и быстрый способ, упомянутый опытными разработчиками. Если редактор внутри расширения блокирует ввод данных, мы можем подготовить объект в "стерильных" условиях, где платформа не будет накладывать ограничения.
СправочникСсылка.Номенклатура, Число и т.д.). Поскольку обработка не является частью расширения, здесь редактирование будет работать в штатном режиме.Ctrl+C (Копировать).Ctrl+V (Вставить) в списке реквизитов формы расширения.Проанализируем результат: вставленная таблица значений сохранит все настройки типов, которые мы задали во внешней обработке. Это позволяет обойти блокировку интерфейса Палитры свойств.
Иногда платформа "просыпается" при последовательном добавлении элементов. Разберем этот любопытный механизм:
Этот метод менее надежен, чем копипаст, но в ряде релизов платформы 8.3.15 он позволял быстро "оживить" редактор без создания внешних файлов.
Рассмотрим наиболее профессиональный подход. Чтобы не зависеть от капризов визуального редактора и багов платформы, создание структуры таблицы значений можно вынести в код. Это гарантирует, что при обновлении основной конфигурации ваше расширение будет более устойчивым.
Для этого нам понадобится обработчик события ПриСозданииНаСервере. Посмотрим на пример кода, который добавляет колонки в таблицу значений динамически:
&НаСервере
Процедура ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Допустим, ТаблицаДанных уже добавлена в расширение, но без колонок
// Опишем массив добавляемых реквизитов
НовыеРеквизиты = Новый Массив;
ТипНоменклатура = Новый ОписаниеТипов("СправочникСсылка.Номенклатура");
ТипКоличество = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3));
НовыеРеквизиты.Добавить(Новый РеквизитФормы("Номенклатура", ТипНоменклатура, "ТаблицаДанных"));
НовыеРеквизиты.Добавить(Новый РеквизитФормы("Количество", ТипКоличество, "ТаблицаДанных"));
// Изменяем структуру формы
ИзменитьРеквизиты(НовыеРеквизиты);
// Добавляем элементы управления на форму, если они не были добавлены в дизайнере
ЭлементТаблица = Элементы.ТаблицаДанных;
НоваяКолонка = Элементы.Добавить("ТаблицаДанныхНоменклатура", Тип("ПолеФормы"), ЭлементТаблица);
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.ПутьКДанным = "Объект.ТаблицаДанных.Номенклатура";
КонецПроцедуры
Использование метода ИзменитьРеквизиты позволяет нам полностью контролировать типы данных, обходя любые ограничения визуального конфигуратора.
Если нам принципиально нужно использовать визуальный редактор, но он бессилен, мы можем прибегнуть к низкоуровневому редактированию метаданных. Выясним, как это сделать:
Ext/Forms/ИмяФормы/Ext/Form.xml.<Attributes>.<Type>.Этот метод является самым надежным, так как мы работаем напрямую с данными, которые платформа считывает при открытии объекта, минуя ошибки отрисовки интерфейса самого Конфигуратора.
Проанализировав опыт сообщества, можно сделать вывод, что наиболее стабильным решением будет обновление платформы. Хотя первые исправления в ветке 8.3.15 не всегда помогали, в более поздних релизах ситуация стабилизировалась.
Подводя итог, можно сказать, что несмотря на досадную ошибку платформы, у разработчика есть широкий арсенал средств: от простого копирования (которое помогает в 90% случаев) до программного управления реквизитами, что является наиболее правильным подходом при разработке сложных расширений.