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