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