Как исправить ошибку с блокировкой изменения и удаления колонок табличной части в расширении 1С?

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

При активной разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются со специфическим поведением платформы при работе с расширениями конфигурации. Одним из наиболее неприятных сюрпризов является ситуация, когда добавленная в расширение колонка табличной части (например, в таблице «Запасы» или «Товары») внезапно «замораживается». Кнопки редактирования свойств становятся неактивными, а сама попытка удалить ошибочно добавленный элемент ни к чему не приводит. Разработчик оказывается в тупике: интерфейс заблокирован, изменения внести невозможно, а конфигурация отказывается работать корректно.

В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем её причины и рассмотрим несколько надежных практических способов её решения — от простых «костылей» в конфигураторе до профессионального программного добавления элементов.

Выясняем причину: баг платформы 10208027

Данное поведение платформы не связано с ошибками в коде вашей конфигурации. Это официально зарегистрированная ошибка технологической платформы 1С с номером 10208027. Описание ошибки гласит: «В расширении конфигурации, в форме, свойства добавленных колонок табличной части объекта не доступны для редактирования».

Этот баг проявляет себя крайне нестабильно. Впервые он массово проявился в релизах ветки 8.3.14 (например, 8.3.14.1779) и перекочевал в первые релизы 8.3.15. Хотя разработчики 1С заявили об исправлении ошибки в версии 8.3.15.1489, на практике в последующих сборках (таких как 8.3.15.1700 и 8.3.15.1778) проблема снова давала о себе знать. Окончательно стабильная работа с реквизитами в расширениях вернулась только начиная с релизов ветки 8.3.16 (в частности, в 8.3.16.1063 и выше).

Кроме того, на стабильность проявления этой ошибки сильно влияет режим поддержки конфигурации. На «тяжелых» типовых решениях (таких как ERP Управление предприятием, Комплексная автоматизация или Управление торговлей), которые находятся на поддержке, эти «зависания» метаданных происходят гораздо чаще из-за внутренних конфликтов сопоставления правил поддержки платформой.


Способ 1. Соблюдение правильной последовательности заимствования

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

Рассмотрим правильный алгоритм добавления колонок:

  1. Сначала необходимо заимствовать саму форму объекта (документа или справочника) в ваше расширение.
  2. Перейдите в дерево метаданных расширения, найдите нужную табличную часть объекта и добавьте в нее новый реквизит.
  3. Откройте заимствованную форму в редакторе расширения.
  4. Перейдите в список реквизитов формы (правая верхняя панель редактора), найдите ваш новый реквизит внутри структуры Объект.ИмяТабличнойЧасти.
  5. Нажмите на него правой кнопкой мыши и выберите команду «Добавить в расширение».
  6. Только после этого перетаскивайте элемент на саму форму в дерево элементов.

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


Способ 2. Выгрузка и редактирование расширения в XML (Самый быстрый обходной путь)

Если колонка уже добавлена некорректно, заблокирована, и стандартными средствами конфигуратора удалить её невозможно, мы можем обойти ограничения интерфейса напрямую через файлы выгрузки. Для этого выполним следующие шаги:

  1. В конфигураторе откройте список расширений (меню Конфигурация — Расширения конфигурации).
  2. Выделите ваше проблемное расширение, нажмите кнопку «Действия» и выберите пункт «Выгрузить конфигурацию в файлы...». Укажите пустую локальную папку на диске.
  3. Откройте выгруженную папку. Нам понадобятся XML-файлы, описывающие заимствованную форму. Обычно они находятся по пути, соответствующему типу объекта (например, Documents\ИмяДокумента\Forms\ИмяФормы.xml).
  4. Откройте нужный XML-файл с помощью любого текстового редактора (например, Notepad++).
  5. Найдите узел, описывающий вашу проблемную колонку табличной части. Вы можете сделать поиск по имени реквизита. Удалите описание этого элемента формы (весь соответствующий XML-блок) или измените его свойства вручную.
  6. Сохраните изменения в файле.
  7. Вернитесь в Конфигуратор 1С, выделите то же расширение и выберите «Загрузить конфигурацию из файлов...», указав измененную папку.

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


Способ 3. Использование временной базы на новой платформе

Если у вас нет возможности прямо сейчас обновить серверную платформу на рабочей базе, но у вас установлена более свежая локальная версия платформы 1С (например, ветки 8.3.16 или выше), вы можете использовать файловый «костыль» через хранилище или файлы конфигурации:

  1. Создайте пустую файловую базу на своем компьютере, используя самую последнюю версию платформы 1С.
  2. Выгрузите файл конфигурации расширения (расширение в формате .cfe) из вашей рабочей базы через меню Конфигурация — Расширения конфигурации — Сохранить конфигурацию в файл....
  3. Запустите конфигуратор новой пустой базы и загрузите туда ваше расширение.
  4. Поскольку новая платформа не страдает багом 10208027, внесите все необходимые изменения: удалите «зависшие» колонки, отредактируйте свойства или добавьте новые реквизиты. Свойства элементов будут полностью доступны.
  5. Сохраните расширение обратно в файл .cfe.
  6. В рабочей базе загрузите измененный файл обратно в расширение.

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


Способ 4. Пересоздание таблицы на форме (Визуальный трюк)

Иногда разработчикам удается «оживить» заблокированные элементы формы без выгрузки файлов, используя особенности генерации элементов самой платформой. Проанализируем этот метод:

  1. Откройте проблемную форму в редакторе расширения.
  2. В дереве элементов формы добавьте совершенно новый элемент управления с помощью клавиши Insert.
  3. Задайте новому элементу тип Таблица.
  4. В свойствах новой таблицы найдите поле ПутьКДанным и укажите ту же самую табличную часть (например, Объект.Запасы).
  5. Платформа выдаст стандартный системный запрос: «Создать колонки таблицы автоматически?». Нажмите «Да».

При автоматической генерации элементов платформа заново перестраивает связи метаданных в форме расширения. Очень часто после этой процедуры у ранее добавленных и «зависших» колонок чудесным образом восстанавливается возможность изменения свойств и удаления. Старую проблемную таблицу после этого можно удалить с формы.


Способ 5. Программное добавление элементов формы (Самый надежный метод)

Многие опытные специалисты в принципе отказываются от интерактивного (визуального) добавления новых колонок табличных частей на формы расширений. Платформа 1С регулярно обновляется, и визуальные привязки элементов в расширениях могут «поплыть» или сломаться при очередном обновлении вендора.

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

Во-первых, сам реквизит табличной части мы добавляем в расширение исключительно на уровне метаданных объекта (например, документа «ПоступлениеТоваровУслуг»), чтобы платформа создала под него физическое поле в базе данных. На форму визуально мы его не перетаскиваем.

Во-вторых, заимствуем в расширение обработчик события формы ПриСозданииНаСервере с аннотацией &После и пишем код динамического создания колонки:


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

Используя метод ИзменитьРеквизиты(), мы динамически расширяем структуру данных формы на сервере, а с помощью коллекции Элементы.Добавить() создаем поле ввода непосредственно в таблице. Этот подход полностью защищает конфигурацию от интерфейсных блокировок конфигуратора.

Важный нюанс при работе с динамическими списками

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

Поэтому, если вы добавите колонку в форму списка интерактивно, в режиме «1С:Предприятие» она все равно может остаться пустой или не отобразиться. В таком случае вам потребуется найти общий модуль, отвечающий за формирование запроса этого списка, заимствовать его в расширение и программно внедрить ваше новое поле в текст SQL-запроса динамического списка.

← На главную