Почему заимствованная форма не переносит реквизиты в расширение 1С и как это исправить?

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

При активной разработке в среде 1С:Предприятие 8.3 программисты регулярно используют механизм расширений для доработки типовых конфигураций без снятия их с поддержки. Однако, начиная с версии платформы 8.3.14, многие столкнулись с неприятной особенностью: при добавлении существующей формы в расширение конфигурации связанные с ней реквизиты (включая основной реквизит Объект) перестали переноситься автоматически. Из-за этого новые элементы формы «не видят» реквизитов, а ручной перенос основного реквизита часто приводит к тому, что у существующих элементов формы полностью «слетает» свойство ПутьКДанным (PathToData).

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

Выясняем причину: изменения в платформе 1С 8.3.14

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

Начиная с версии 8.3.14, правила игры изменились:

Проанализируем основные методы решения этой проблемы, от простых интерактивных действий до лучших практик программирования в 1С.

Метод 1. Ручное заимствование реквизита «Объект» и решение проблемы со сбросом путей

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

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

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

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

Метод 2. Программное добавление элементов на форму (Рекомендуемый подход)

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

Гораздо более безопасным и гибким решением является программное добавление элементов. Посмотрим на пример реализации этого метода по шагам:

  1. В расширение заимствуется только сам прикладной объект (например, справочник или документ), в который мы добавляем наш новый реквизит с уникальным префиксом (например, Префикс_НовыйРеквизит). Саму форму при этом заимствовать не нужно!
  2. Заимствуем модуль формы нужного объекта и перехватываем процедуру ПриСозданииНаСервере с помощью аннотации &После.
  3. Внутри обработчика пишем код программного создания элемента формы (например, поля ввода) и связываем его с реквизитом через путь к данным.

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


&После("ПриСозданииНаСервере")
Процедура Префикс_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверим, не был ли элемент уже создан ранее
    Если Элементы.Найти("Префикс_НовоеПолеВвода") = Неопределено Тогда
        
        // Находим группу на форме, куда хотим поместить элемент (например, в шапку)
        РодительскаяГруппа = Элементы.Найти("ГруппаШапка");
        
        Если РодительскаяГруппа <> Неопределено Тогда
            
            // Создаем новый элемент формы
            НовыйЭлемент = Элементы.Добавить("Префикс_НовоеПолеВвода", Тип("ПолеФормы"), РодительскаяГруппа);
            НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
            
            // Связываем программный элемент с реквизитом нашего объекта в расширении
            НовыйЭлемент.ПутьКДанным = "Объект.Префикс_НовыйРеквизит";
            НовыйЭлемент.Заголовок = "Дополнительная информация";
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Такой подход гарантирует, что при обновлении типовой конфигурации ваша доработка не «сломает» форму, а новые элементы аккуратно встроятся в существующий интерфейс динамически.

Важное различие: Реквизиты формы и Реквизиты объекта

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

Ограничение платформы: что делать с обычными формами?

В процессе обсуждения доработок часто возникает вопрос: применим ли механизм расширений для работы со старыми обычными формами (толстый клиент)?

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

Для модификации интерфейса старых конфигураций (таких как УПП 1.3 или БП 2.0) вам придется использовать стандартный способ — снимать объекты с поддержки и редактировать их непосредственно в основной конфигурации, либо постепенно переводить нужные рабочие места на управляемые формы.

← На главную