Почему не редактируются колонки таблицы значений в расширении 1С и как это исправить

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с расширениями конфигурации в системе 1С:Предприятие 8.3 разработчики часто сталкиваются с неприятной особенностью: при добавлении новой таблицы значений (ТЗ) или её колонок в заимствованную форму, поля свойств (например, Тип значения) становятся недоступными для редактирования. Платформа принудительно устанавливает тип Строка и блокирует любые изменения, как будто объект открыт только для чтения.

В этой статье мы подробно разберем, почему возникает эта ситуация, проанализируем причины поведения платформы и изучим несколько эффективных способов обхода этой проблемы, включая "хитрости" визуального редактора и программные методы создания метаданных.

Причина возникновения ошибки

Прежде всего, выясним причину. Данное поведение является зарегистрированной ошибкой технологической платформы (например, Bug ID 10214488). Она проявлялась наиболее остро в версиях 8.3.15.1489, 8.3.15.1700 и 8.3.16.1063. Суть проблемы заключается в некорректной работе механизма десериализации метаданных. Когда расширение "накладывается" на основную конфигурацию, визуальный редактор ошибочно наследует признак неизменяемости для новых объектов, которые фактически не принадлежат основной базе, а созданы только в расширении.

Также проанализируем влияние режима совместимости. Если режим совместимости расширения отличается от режима совместимости основной конфигурации, механизмы проверки прав правки метаданных могут работать нестабильно. Рассмотрим пошагово, как можно обойти это ограничение.

Способ 1. Метод «Внешней обработки» (Копипаст)

Это самый популярный и быстрый способ, упомянутый опытными разработчиками. Если редактор внутри расширения блокирует ввод данных, мы можем подготовить объект в "стерильных" условиях, где платформа не будет накладывать ограничения.

  1. Создадим новую внешнюю обработку (через меню Файл — Новый).
  2. Перейдем на вкладку Формы и создадим новую произвольную форму.
  3. В разделе Реквизиты создадим новую таблицу значений, назовем ее нужным именем.
  4. Добавим в эту таблицу все необходимые колонки и сразу укажем для них нужные типы данных (например, СправочникСсылка.Номенклатура, Число и т.д.). Поскольку обработка не является частью расширения, здесь редактирование будет работать в штатном режиме.
  5. Выделим созданную таблицу значений в списке реквизитов и нажмем Ctrl+C (Копировать).
  6. Вернемся в нашу заимствованную форму в расширении. Если там уже была создана пустая нередактируемая ТЗ — удалим ее.
  7. Нажмем Ctrl+V (Вставить) в списке реквизитов формы расширения.

Проанализируем результат: вставленная таблица значений сохранит все настройки типов, которые мы задали во внешней обработке. Это позволяет обойти блокировку интерфейса Палитры свойств.

Способ 2. Метод «Второго реквизита»

Иногда платформа "просыпается" при последовательном добавлении элементов. Разберем этот любопытный механизм:

  1. Добавим в таблицу значений первую колонку. Скорее всего, она будет заблокирована.
  2. Не удаляя первую, добавим вторую колонку.
  3. В некоторых случаях вторая колонка становится доступной для редактирования сразу после добавления.
  4. Если это сработало, настроим вторую колонку как нужно, а первую просто удалим.

Этот метод менее надежен, чем копипаст, но в ряде релизов платформы 8.3.15 он позволял быстро "оживить" редактор без создания внешних файлов.

Способ 3. Программное создание колонок (Best Practice)

Рассмотрим наиболее профессиональный подход. Чтобы не зависеть от капризов визуального редактора и багов платформы, создание структуры таблицы значений можно вынести в код. Это гарантирует, что при обновлении основной конфигурации ваше расширение будет более устойчивым.

Для этого нам понадобится обработчик события ПриСозданииНаСервере. Посмотрим на пример кода, который добавляет колонки в таблицу значений динамически:


&НаСервере
Процедура ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Допустим, ТаблицаДанных уже добавлена в расширение, но без колонок
    // Опишем массив добавляемых реквизитов
    НовыеРеквизиты = Новый Массив;
    ТипНоменклатура = Новый ОписаниеТипов("СправочникСсылка.Номенклатура");
    ТипКоличество = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3));
    
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("Номенклатура", ТипНоменклатура, "ТаблицаДанных"));
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("Количество", ТипКоличество, "ТаблицаДанных"));
    
    // Изменяем структуру формы
    ИзменитьРеквизиты(НовыеРеквизиты);
    
    // Добавляем элементы управления на форму, если они не были добавлены в дизайнере
    ЭлементТаблица = Элементы.ТаблицаДанных;
    
    НоваяКолонка = Элементы.Добавить("ТаблицаДанныхНоменклатура", Тип("ПолеФормы"), ЭлементТаблица);
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    НоваяКолонка.ПутьКДанным = "Объект.ТаблицаДанных.Номенклатура";
    
КонецПроцедуры

Использование метода ИзменитьРеквизиты позволяет нам полностью контролировать типы данных, обходя любые ограничения визуального конфигуратора.

Способ 4. Редактирование через выгрузку в файлы (XML)

Если нам принципиально нужно использовать визуальный редактор, но он бессилен, мы можем прибегнуть к низкоуровневому редактированию метаданных. Выясним, как это сделать:

  1. Выгрузим расширение в файлы (меню Конфигурация — Выгрузить конфигурацию в файлы).
  2. Найдем в выгруженном каталоге XML-файл нужной формы. Обычно он находится по пути Ext/Forms/ИмяФормы/Ext/Form.xml.
  3. Откроем XML в текстовом редакторе (например, Notepad++) и найдем узел, описывающий нашу таблицу значений и её колонки <Attributes>.
  4. Вручную пропишем необходимые типы в тегах <Type>.
  5. Сохраним файл и выполним Конфигурация — Загрузить конфигурацию из файлов.

Этот метод является самым надежным, так как мы работаем напрямую с данными, которые платформа считывает при открытии объекта, минуя ошибки отрисовки интерфейса самого Конфигуратора.

Рекомендации по версиям платформы

Проанализировав опыт сообщества, можно сделать вывод, что наиболее стабильным решением будет обновление платформы. Хотя первые исправления в ветке 8.3.15 не всегда помогали, в более поздних релизах ситуация стабилизировалась.

Подводя итог, можно сказать, что несмотря на досадную ошибку платформы, у разработчика есть широкий арсенал средств: от простого копирования (которое помогает в 90% случаев) до программного управления реквизитами, что является наиболее правильным подходом при разработке сложных расширений.

← На главную