Как на управляемой форме 1С сделать выбор из справочника без изменения типовой конфигурации?

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

В процессе сопровождения типовых конфигураций «1С:Предприятие 8.3» программисты часто сталкиваются с требованиями бизнеса добавить новые поля ввода на стандартные формы. При этом крайне важно сохранить конфигурацию на полной поддержке поставщика, чтобы не усложнять процесс последующих обновлений. Типичный пример такой задачи — необходимость добавить выбор элемента из справочника (например, «Объекты строительства») в документ «Заявка на расходование денежных средств».

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

---

Метод 1. Программное изменение формы через расширение конфигурации (Рекомендуемый способ)

Многие разработчики совершают ошибку, когда заимствуют форму документа в расширение и визуально редактируют её (перетаскивают новые реквизиты в редакторе формы). При обновлении конфигурации поставщика структура оригинальной формы может измениться, что приведет к конфликтам и ошибкам при совмещении форм расширения и основной конфигурации.

Наиболее надежный и современный стандарт разработки — это программное создание элементов формы в модуле расширения. При таком подходе вероятность конфликтов при обновлении сводится к минимуму.

Рассмотрим по шагам, как реализовать этот метод:

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

Ниже представлен пример кода, который динамически создает поле ввода на форме при её открытии:


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

Преимущество данного метода заключается в том, что даже если фирма «1С» в очередном обновлении полностью перерисует форму документа (изменит положение кнопок, переименует другие группы), наше расширение продолжит стабильно работать, так как поле позиционируется программно.

---

Метод 2. Расширение типов Плана видов характеристик для дополнительных реквизитов

Стандартный механизм Библиотеки стандартных подсистем (БСП) предоставляет пользователям возможность создавать «Дополнительные реквизиты и сведения» без участия программиста. Однако по умолчанию в списке доступных типов данных для доп. реквизитов может не оказаться справочника «Объекты строительства».

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

Выясним, как использовать эту возможность по шагам:

  1. Заимствуем в созданное расширение План видов характеристик ДополнительныеРеквизитыИСведения.
  2. Заимствуем справочник ОбъектыСтроительства.
  3. В расширении открываем свойства ПВХ ДополнительныеРеквизитыИСведения, переходим к свойству Тип значения характеристик и добавляем туда тип СправочникСсылка.ОбъектыСтроительства.
  4. Запускаем сеанс в режиме «1С:Предприятие». Теперь при создании нового дополнительного реквизита для документа «Заявка на расходование денежных средств» в списке доступных типов появится справочник «Объекты строительства».

Этот метод идеален тем, что вывод элемента на форму и сохранение данных полностью берет на себя стандартный механизм БСП. Никакого программного кода писать не требуется, а конфигурация по-прежнему остается на полной поддержке.

---

Метод 3. Программный «маппинг» через строковый доп. реквизит (Альтернативный способ)

Если по каким-то причинам использование полноценных расширений с добавлением реквизитов в СУБД ограничено политикой безопасности компании, можно применить комбинированный подход с использованием штатных доп. реквизитов БСП и программного перехвата.

Суть метода заключается в следующем:

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

Такой способ позволяет избежать раздувания справочника «Значения дополнительных реквизитов» тысячами дублирующих записей (что происходит при попытке скопировать иерархию элементов вручную), однако он требует написания сложного кода парсинга данных и является наименее производительным.

---

Важные аспекты безопасности и обновления при использовании расширений

При использовании расширений важно понимать внутренние механизмы платформы 1С, чтобы избежать потери данных:

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

← На главную