Как изменить реквизит формы и колонки таблиц в расширении 1С

Программист 1С:Управление нашей фирмой IT и автоматизация бизнеса
← На главную

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

Проблема заблокированных реквизитов: визуальный метод

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

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

Чтобы изменить реквизит визуально, выполните следующие шаги:

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

Программное изменение состава реквизитов формы

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

Рассмотрим пример, когда нам нужно изменить составной тип реквизита формы, добавив в него новый тип документа. Мы будем использовать обработчик ПриСозданииНаСервере в расширении формы с типом вызова &После.


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

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

Работа с колонками таблиц значений в расширении

Если таблица на форме является не «Табличной частью» объекта, а «Таблицей значений» (самостоятельным реквизитом формы), добавление колонок через конфигуратор может вызвать затруднения. Выясним причину: часто колонки такой таблицы жестко привязаны к метаданным, которые не заимствованы полностью.

Для добавления колонки в такую таблицу мы также можем воспользоваться методом ИзменитьРеквизиты(). Путь к новой колонке указывается через точку от имени таблицы.

Проанализируем пошаговый процесс добавления колонки:

  1. Создаем массив реквизитов.
  2. Добавляем в массив объект РеквизитФормы, где первым параметром указываем "ИмяВашейТаблицы.ИмяНовойКолонки".
  3. Вызываем ИзменитьРеквизиты().
  4. После создания реквизита (данных), нам необходимо создать элемент формы (визуальное отображение), чтобы пользователь увидел новую колонку.

Посмотрим на пример кода:


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

Нюансы и возможные ошибки

При работе с расширениями 1С следует учитывать несколько критических моментов, которые могут блокировать работу:

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

Кэш конфигуратора: Иногда команда Добавить в расширение пропадает из-за ошибок кэширования интерфейса. В таких случаях попробуйте закрыть все окна редакторов форм, обновить конфигурацию базы данных (F7) и заново открыть форму. Также эффективным методом является Drag-and-Drop: попробуйте просто перетащить реквизит из дерева основной конфигурации в дерево расширения.

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

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

← На главную