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

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

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

Ограничения платформы 1С при работе с типами реквизитов

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

Кроме того, важно учитывать особенности работы типов данных в разных видах форм:

  1. Тип данных ДокументСписок.<ИмяДокумента> используется в обычных формах и жестко связывается с конкретной таблицей метаданных на этапе разработки. Изменить его состав типов или перенаправить на другой документ во время работы пользователя нельзя.
  2. В управляемых формах тип ДокументСписок вообще не применяется. На смену ему пришел реквизит формы с типом ДинамическийСписок.

Решение для управляемых форм: динамический список

Разберем наиболее эффективный способ решения задачи в управляемом приложении. Для динамической смены отображаемых документов используется ДинамическийСписок.

Пошагово проанализируем порядок реализации:

  1. В конфигураторе добавляем на форму реквизит с типом ДинамическийСписок и устанавливаем флаг «Произвольный запрос».
  2. Создаем на форме элемент управления типа «Таблица» и связываем его с реквизитом динамического списка.
  3. При изменении пользователем типа документа на сервере меняем параметры динамического списка.

Посмотрим на пример процедуры, выполняемой на сервере при смене типа документа:


&НаСервере
Процедура ОбновитьСписокДокументовНаСервере(ИмяВыбранногоДокумента)
    
    // Указываем новую основную таблицу и запрос
    СписокДокументов.ОсновнаяТаблица = "Документ." + ИмяВыбранногоДокумента;
    СписокДокументов.ТекстЗапроса = "ВЫБРАТЬ * ИЗ Документ." + ИмяВыбранногоДокумента + " КАК Док";
    
    // Очищаем предыдущие отборы
    СписокДокументов.Отбор.Элементы.Очистить();
    
КонецПроцедуры

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

Решение для обычных форм

Выясним, как реализовать подобную логику в обычном приложении, где используются обычные формы и реквизиты типа ДокументСписок.

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

Вариант 2. Использование ПостроителяОтчета. Если данные выгружаются в ТаблицаЗначений, стандартный механизм отборов списков документов недоступен. Для реализации пользовательских фильтров применяется объект ПостроительОтчета. Текст запроса передается в построитель, а элемент формы связывается с его коллекцией Отбор.

Вариант 3. Вызов штатных форм списков. Вместо динамического изменения формы обработки можно вызывать стандартную форму списка нужного документа с помощью функции ОткрытьФорму(), передавая необходимые параметры отбора.

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

← На главную