При активной разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются со специфическим поведением платформы при работе с расширениями конфигурации. Одним из наиболее неприятных сюрпризов является ситуация, когда добавленная в расширение колонка табличной части (например, в таблице «Запасы» или «Товары») внезапно «замораживается». Кнопки редактирования свойств становятся неактивными, а сама попытка удалить ошибочно добавленный элемент ни к чему не приводит. Разработчик оказывается в тупике: интерфейс заблокирован, изменения внести невозможно, а конфигурация отказывается работать корректно.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем её причины и рассмотрим несколько надежных практических способов её решения — от простых «костылей» в конфигураторе до профессионального программного добавления элементов.
Данное поведение платформы не связано с ошибками в коде вашей конфигурации. Это официально зарегистрированная ошибка технологической платформы 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С указывает на то, что части блокировок можно избежать, если строго следовать внутренней логике платформы по заимствованию объектов. Если нарушить последовательность действий, платформа теряет связь между элементом формы и реквизитом объекта в расширении.
Рассмотрим правильный алгоритм добавления колонок:
Объект.ИмяТабличнойЧасти.Важно: Попытка перетащить или добавить колонку напрямую в визуальный элемент формы без предварительного расширения структуры метаданных табличной части в дереве конфигурации гарантированно приведет к блокировке свойств элемента.
Если колонка уже добавлена некорректно, заблокирована, и стандартными средствами конфигуратора удалить её невозможно, мы можем обойти ограничения интерфейса напрямую через файлы выгрузки. Для этого выполним следующие шаги:
Documents\ИмяДокумента\Forms\ИмяФормы.xml).После успешной загрузки конфигуратор обновит структуру формы, и заблокированная колонка исчезнет или примет новые, заданные вами свойства.
Если у вас нет возможности прямо сейчас обновить серверную платформу на рабочей базе, но у вас установлена более свежая локальная версия платформы 1С (например, ветки 8.3.16 или выше), вы можете использовать файловый «костыль» через хранилище или файлы конфигурации:
.cfe) из вашей рабочей базы через меню Конфигурация — Расширения конфигурации — Сохранить конфигурацию в файл.....cfe.Если разработка ведется с использованием хранилища конфигурации, принцип остается тем же: вы можете подключиться к хранилищу из пустой локальной базы, запущенной на новой платформе, внести исправления в расширение, захватив объекты, и поместить изменения обратно в хранилище.
Иногда разработчикам удается «оживить» заблокированные элементы формы без выгрузки файлов, используя особенности генерации элементов самой платформой. Проанализируем этот метод:
Insert.ПутьКДанным и укажите ту же самую табличную часть (например, Объект.Запасы).При автоматической генерации элементов платформа заново перестраивает связи метаданных в форме расширения. Очень часто после этой процедуры у ранее добавленных и «зависших» колонок чудесным образом восстанавливается возможность изменения свойств и удаления. Старую проблемную таблицу после этого можно удалить с формы.
Многие опытные специалисты в принципе отказываются от интерактивного (визуального) добавления новых колонок табличных частей на формы расширений. Платформа 1С регулярно обновляется, и визуальные привязки элементов в расширениях могут «поплыть» или сломаться при очередном обновлении вендора.
Программный метод гарантирует, что свойства элементов всегда будут под вашим полным контролем, а сам код не зависит от визуальных багов конфигуратора. Разберем этот процесс по шагам.
Во-первых, сам реквизит табличной части мы добавляем в расширение исключительно на уровне метаданных объекта (например, документа «ПоступлениеТоваровУслуг»), чтобы платформа создала под него физическое поле в базе данных. На форму визуально мы его не перетаскиваем.
Во-вторых, заимствуем в расширение обработчик события формы ПриСозданииНаСервере с аннотацией &После и пишем код динамического создания колонки:
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Определяем уникальное имя для нашего нового элемента формы
ИмяРеквизита = "Расш1_ДополнительноеСвойство";
ПутьКТаблице = "Объект.Запасы";
// Описываем новый реквизит формы, который будет связан с реквизитом ТЧ объекта
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(
ИмяРеквизита,
Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(150)),
ПутьКТаблице,
"Доп. Свойство",
Истина
));
// Добавляем реквизит на форму программно
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
// Теперь создаем сам визуальный элемент управления (колонку внутри таблицы формы)
ТаблицаФормы = Элементы.Запасы;
НоваяКолонка = Элементы.Добавить(
"Запасы" + ИмяРеквизита,
Тип("ПолеФормы"),
ТаблицаФормы
);
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.ПутьКДанным = ПутьКТаблице + "." + ИмяРеквизита;
НоваяКолонка.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
КонецПроцедуры
Используя метод ИзменитьРеквизиты(), мы динамически расширяем структуру данных формы на сервере, а с помощью коллекции Элементы.Добавить() создаем поле ввода непосредственно в таблице. Этот подход полностью защищает конфигурацию от интерфейсных блокировок конфигуратора.
Если аналогичная проблема с блокировкой или неотображением добавленной колонки возникла у вас в форме списка (где используется динамический список), помните: в современных типовых конфигурациях текст запроса для динамического списка большинства документов формируется не в самой форме. Он перезаписывается программно в общих модулях при вызове стандартных функций настройки списков.
Поэтому, если вы добавите колонку в форму списка интерактивно, в режиме «1С:Предприятие» она все равно может остаться пустой или не отобразиться. В таком случае вам потребуется найти общий модуль, отвечающий за формирование запроса этого списка, заимствовать его в расширение и программно внедрить ваше новое поле в текст SQL-запроса динамического списка.