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