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