При разработке и кастомизации прикладных решений на платформе «1С:Предприятие» (особенно при работе с обычными формами) программисты часто сталкиваются с рутинными задачами, которые могут преподнести неприятные сюрпризы. Типичный сценарий: вы скопировали существующий документ или его форму, хотите перенаправить её на новый тип объекта, но при изменении типа значения формы вся кропотливая работа по визуальному оформлению табличных частей полностью сбрасывается. Колонки перестраиваются по умолчанию, пропадает настроенная ширина, видимость, доступность, группировки и уникальные свойства.
В этой статье мы подробно разберем, почему конфигуратор ведет себя подобным образом, проанализируем внутренние механизмы платформы и рассмотрим три практических способа решения этой проблемы, которые помогут сэкономить часы ручной работы.
Когда мы меняем свойство Тип значения у обычной формы (например, с ДокументОбъект.СтарыйДокумент на ДокументОбъект.НовыйДокумент), конфигуратор запускает внутренний процесс валидации метаданных. Табличное поле на форме жестко связано с табличной частью конкретного документа через свойство Данные. Как только тип основного реквизита формы меняется, платформа обнаруживает несоответствие типов данных источника.
Для предотвращения критических ошибок выполнения конфигуратор автоматически очищает старую структуру колонок и генерирует её заново "с нуля", основываясь на структуре табличной части нового документа. Платформе неважно, что имена и типы реквизитов в новой табличной части могут полностью совпадать со старыми (например, стандартные Номенклатура, Количество, Сумма) — она выполняет полную инициализацию элемента управления. В результате теряется уникальное оформление: многострочные шапки, цвета, шрифты, доступность и формулы.
Рассмотрим подробнее три надежных способа обойти это поведение платформы.
Если нам нужно сохранить сложную форму в исходном виде, изменив только её тип значения, лучшим решением будет обход визуального редактора конфигуратора. Мы можем напрямую отредактировать метаданные формы в XML-представлении. Начиная с платформы 8.3, разработчикам доступна штатная возможность выгрузки конфигурации в файлы.
Разберем этот процесс по шагам:
ИмяПапкиВыгрузки\Documents\ИмяНовогоДокумента\Forms\ИмяФормы\Ext\Form.xml (или файл Form.xml в соответствующей поддиректории формы).Form.xml в любом удобном текстовом редакторе с подсветкой синтаксиса XML (например, Notepad++ или VS Code).<Type>cfg:DocumentObject.СтарыйДокумент</Type>.<Type>cfg:DocumentObject.НовыйДокумент</Type>.Form.xml и закроем редактор.После завершения загрузки откроем форму в конфигураторе. Мы увидим, что тип значения формы успешно изменился на новый документ, но структура, порядок колонок и все визуальные настройки табличного поля остались в исходном, нетронутом виде. Этот способ позволяет обойти интерактивные триггеры очистки колонок в визуальном редакторе.
Если по каким-то причинам выгрузка конфигурации в XML-файлы недоступна или у вас нет монопольного доступа к базе данных для загрузки изменений, мы можем прибегнуть к программному переносу настроек оформления. Для этого напишем простую временную обработку.
В обычных формах напрямую скопировать коллекцию колонок табличного поля методом простого присваивания нельзя, так как коллекция жестко завязана на конкретный элемент управления. Однако мы можем обойти это ограничение, перебрав свойства колонок в цикле и применив их к новому элементу.
Посмотрим на пример кода, который выполняет такое копирование:
Для Каждого КолонкаИсточника Из ЭлементыФормы.ТабличноеПолеИсточник.Колонки Цикл
// Ищем аналогичную колонку в новом табличном поле по имени
КолонкаПриемник = ЭлементыФормы.ТабличноеПолеПриемник.Колонки.Найти(КолонкаИсточника.Имя);
Если КолонкаПриемник <> Неопределено Тогда
// Копируем базовые оформительские свойства с помощью встроенной функции
ЗаполнитьЗначенияСвойств(КолонкаПриемник, КолонкаИсточника,
"Ширина, Видимость, Доступность, ИзменятьРазмер, Положение, ИзменятьПозицию, Шрифт, ЦветТекстаШапки, Выравнивание");
// Дополнительно переносим специфические свойства отображения
КолонкаПриемник.ОтображатьВШапке = КолонкаИсточника.ОтображатьВШапке;
КолонкаПриемник.Формат = КолонкаИсточника.Формат;
КолонкаПриемник.ВыделятьОтрицательные = КолонкаИсточника.ВыделятьОтрицательные;
КонецЕсли;
КонецЦикла;
Этот способ позволяет за секунды восстановить визуальный стиль табличного поля, перенеся свойства из старой формы (которую можно временно открыть или держать в конфигурации в качестве донора) в новую форму-приемник.
Если вы проектируете систему, в которой структура документов может часто меняться, или планируете тиражировать форму на множество различных документов, хорошей практикой будет изначальный отказ от жесткой связи табличного поля с метаданными конкретного документа.
Мы можем использовать промежуточный универсальный объект ТаблицаЗначений. В этом случае настройки колонок на форме никогда не сбросятся автоматически, так как источник данных для элемента управления останется неизменным.
Разберем по шагам, как реализовать этот подход:
ТаблицаЗначений.В обработчике события формы ПриОткрытии (или ПередОткрытием) настроим заполнение табличного поля из табличной части документа:
Процедура ПриОткрытии()
// Выгружаем данные из реальной табличной части документа в таблицу значений на форме
ЭлементыФормы.ТабличноеПоле1.Значение = ЭтотОбъект.Товары.Выгрузить();
КонецПроцедуры
А перед записью документа нам необходимо перенести измененные пользователем данные обратно в табличную часть объекта. Для этого пропишем следующий код в событии ПередЗаписью:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Очищаем табличную часть документа и загружаем в нее актуальные данные из формы
ЭтотОбъект.Товары.Загрузить(ЭлементыФормы.ТабличноеПоле1.Значение);
КонецПроцедуры
Этот подход гарантирует полную независимость интерфейсных настроек от метаданных конфигурации. Даже если вы решите кардинально изменить тип значения формы или заменить один документ-владелец на другой, оформление вашего табличного поля останется в целости и сохранности.
Выбор конкретного решения зависит от текущих задач. Если это разовая операция переноса — идеально подойдет Вариант 1 (редактирование XML). Если форм много и нужно автоматизировать процесс — используйте Вариант 2 (программное копирование свойств). Если вы хотите сделать интерфейс гибким и устойчивым к будущим доработкам метаданных — выбирайте Вариант 3 (промежуточная таблица значений).