Как доработать обычную форму через расширение в 1С:Предприятие 8.3?

Программист 1С v8.3 (Обычные формы) Управленческий учет IT и автоматизация бизнеса
← На главную

Работа с обычными формами (ОФ) в современных версиях 1С часто вызывает вопросы, особенно когда конфигурация находится на поддержке и стоит задача внести изменения через механизм расширений. Ситуация осложняется, если используется старая версия платформы (например, 8.3.10) и специфическая конфигурация, такая как Альфа-Авто 5. В данной статье мы подробно разберем, как добавить реквизиты в табличную часть документа и отобразить их на обычной форме, не снимая основную конфигурацию с поддержки.

Особенности обычных форм в контексте расширений

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

Если нам нужно изменить визуальный состав обычной формы, у нас есть два пути: либо полное замещение формы в расширении, либо программное создание элементов при открытии оригинальной формы. Рассмотрим оба метода подробно.

Метод 1: Полное замещение формы в расширении

Этот способ считается наиболее надежным с точки зрения визуального проектирования, но он требует внимательности к зависимостям. Суть метода заключается в том, что мы создаем копию формы в расширении и заставляем систему использовать именно её вместо типовой.

Разберем процесс по шагам:

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

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

Метод 2: Программное добавление элементов управления

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

Проанализируем ситуацию: нам нужно добавить колонку в элемент управления ТабличноеПоле. Для этого мы будем использовать механизм перехвата событий (аннотации &После).

Шаги реализации:

  1. Добавьте документ и его новые реквизиты ТЧ в расширение.
  2. Найдите на форме процедуру ПриОткрытии или ПередОткрытием.
  3. В расширении создайте процедуру-перехватчик.

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


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

Данный подход позволяет сохранить гибкость. Оригинальная форма будет обновляться поставщиком, а ваша колонка будет «пристыковываться» к ней программно каждый раз при запуске.

Критически важные нюансы платформы 8.3.10 и «Альфа-Авто 5»

При работе с расширениями на платформе 8.3.10 в режиме совместимости следует учитывать несколько факторов, которые могут стать критическими:

  1. Режим совместимости: 1С рекомендует использовать режим не ниже 8.3.12 для стабильной работы расширений, изменяющих структуру данных. В версии 8.3.10 существует риск повреждения метаданных при сложной реструктуризации табличных частей через расширение. Всегда делайте резервную копию базы перед применением расширения.
  2. Контекст Альфа-Авто: В конфигурациях семейства «Альфа-Авто» логика работы с табличными частями (цены, скидки, налоги) часто вынесена в специализированные общие модули, которые вызываются из модулей форм. Если ваш новый реквизит должен участвовать в расчетах, вам придется также расширять эти модули через &Вместо или &После, чтобы бизнес-логика «увидела» ваши данные.
  3. Дополнительные свойства: Прежде чем добавлять реквизиты в код, убедитесь, что в «Альфа-Авто 5» действительно нет штатного механизма для ваших целей. Хотя штатные «Дополнительные свойства» в этой версии часто работают только для шапки документов, иногда их можно адаптировать под задачи учета без программирования метаданных.

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

← На главную