Работа с расширениями в платформе 1С:Предприятие 8.3 значительно упрощает поддержку конфигураций, однако разработчики часто сталкиваются с ситуацией, когда стандартные инструменты заимствования объектов кажутся заблокированными. Одной из типичных задач является изменение типа реквизита формы или добавление новой колонки в таблицу, которая не связана с объектом базы данных, а является внутренним реквизитом формы. Рассмотрим подробнее, как обойти интерфейсные ограничения конфигуратора и решить эту задачу как визуальными, так и программными методами.
Разберем ситуацию, когда при добавлении формы в расширение вы обнаруживаете, что список реквизитов доступен только для чтения, а команда Добавить в расширение в контекстном меню неактивна. Прежде всего, проанализируем состояние самой формы. Для того чтобы изменять структуру реквизитов, форма должна быть не просто «видна» в дереве расширения, а полноценно заимствована.
Часто встречается нюанс, связанный с интерфейсом конфигуратора: при выполнении команды добавления может потребоваться повторный выбор целевого расширения в диалоговом окне. Если вы работаете с типом данных, который является составным (например, реквизит может принимать значения нескольких видов документов), убедитесь, что все типы, которые вы планируете включить в состав, также присутствуют в расширении. Если вы хотите добавить в составной тип новый документ, этот документ должен быть предварительно заимствован в расширение.
Чтобы изменить реквизит визуально, выполните следующие шаги:
Объект).Бывают случаи, когда визуальный редактор расширений накладывает жесткие ограничения, особенно это касается изменения типов уже существующих реквизитов. В такой ситуации наиболее надежным и гибким способом является использование метода ИзменитьРеквизиты(). Этот метод позволяет динамически управлять структурой формы в момент ее создания.
Рассмотрим пример, когда нам нужно изменить составной тип реквизита формы, добавив в него новый тип документа. Мы будем использовать обработчик ПриСозданииНаСервере в расширении формы с типом вызова &После.
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Определяем массив добавляемых реквизитов
МассивДобавляемыхРеквизитов = Новый Массив;
// Создаем описание типов, включая существующие и новый тип
// Например, добавим тип "ДокументСсылка.РеализацияТоваровУслуг"
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("ДокументСсылка.ЗаказПокупателя"));
МассивТипов.Добавить(Тип("ДокументСсылка.СчетНаОплату"));
МассивТипов.Добавить(Тип("ДокументСсылка.РеализацияТоваровУслуг")); // Новый тип
НовыйТипРеквизита = Новый ОписаниеТипов(МассивТипов);
// Добавляем реквизит в массив. Имя должно совпадать с именем существующего реквизита
// для его переопределения.
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ИмяВашегоРеквизита", НовыйТипРеквизита, , "ЗаголовокРеквизита"));
// Применяем изменения на форме
ЭтаФорма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
КонецПроцедуры
Важно понимать, что при программном переопределении реквизита его данные могут быть очищены, если платформа не сможет сопоставить старые типы с новыми. Поэтому данный метод лучше всего подходит для реквизитов, которые заполняются программно или интерактивно пользователем уже после открытия формы.
Если таблица на форме является не «Табличной частью» объекта, а «Таблицей значений» (самостоятельным реквизитом формы), добавление колонок через конфигуратор может вызвать затруднения. Выясним причину: часто колонки такой таблицы жестко привязаны к метаданным, которые не заимствованы полностью.
Для добавления колонки в такую таблицу мы также можем воспользоваться методом ИзменитьРеквизиты(). Путь к новой колонке указывается через точку от имени таблицы.
Проанализируем пошаговый процесс добавления колонки:
РеквизитФормы, где первым параметром указываем "ИмяВашейТаблицы.ИмяНовойКолонки".ИзменитьРеквизиты().Посмотрим на пример кода:
&После("ПриСозданииНаСервере")
Процедура Расш1_ДобавитьКолонкуПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// 1. Добавляем реквизит в структуру таблицы
МассивРеквизитов = Новый Массив;
ТипСтрока = Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(100));
МассивРеквизитов.Добавить(Новый РеквизитФормы("НоваяКолонка", ТипСтрока, "ИмяТаблицыФормы", "Инфо"));
ЭтаФорма.ИзменитьРеквизиты(МассивРеквизитов);
// 2. Создаем элемент формы для отображения колонки
ТаблицаЭлемент = Элементы.ИмяТаблицыФормы;
НовыйЭлемент = Элементы.Добавить("ИмяТаблицыФормыНоваяКолонка", Тип("ПолеФормы"), ТаблицаЭлемент);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "ИмяТаблицыФормы.НоваяКолонка";
КонецПроцедуры
При работе с расширениями 1С следует учитывать несколько критических моментов, которые могут блокировать работу:
Путь к данным: Если вы пытаетесь добавить колонку в таблицу, которая связана с данными объекта (например, табличная часть документа), убедитесь, что сама табличная часть заимствована в расширение. Если колонка недоступна для редактирования, проверьте свойство ПутьКДанным в основной конфигурации. Если данные колонки зависят от функциональных опций, которые не включены в расширении, она может вести себя непредсказуемо.
Кэш конфигуратора: Иногда команда Добавить в расширение пропадает из-за ошибок кэширования интерфейса. В таких случаях попробуйте закрыть все окна редакторов форм, обновить конфигурацию базы данных (F7) и заново открыть форму. Также эффективным методом является Drag-and-Drop: попробуйте просто перетащить реквизит из дерева основной конфигурации в дерево расширения.
Совместимость типов: При расширении состава типов реквизита помните, что стандартный код конфигурации может быть не готов к обработке новых типов. Если типовой модуль ожидает в этом реквизите только ДокументСсылка.ЗаказПокупателя, а вы передали ДокументСсылка.РеализацияТоваровУслуг, выполнение может завершиться ошибкой в серверном коде. Всегда проверяйте использование модифицированного реквизита в глобальном поиске по конфигурации.
Подводя итог, можно сказать, что наиболее надежный путь модификации сложных форм в расширениях — это комбинация заимствования самой формы и последующее программное управление ее элементами. Это гарантирует стабильность работы решения при обновлениях основной конфигурации и позволяет обходить большинство визуальных ограничений платформы.