При разработке внешних обработок в 1С часто возникает задача: отобразить на форме список документов, тип которого должен меняться в зависимости от выбора пользователя (например, при выборе вида документа "Реализация товаров и услуг" выводится список реализаций, а при выборе "Поступление товаров и услуг" — список поступлений). Рассмотрим, можно ли меняться тип реквизита обработки программно и какими способами решается эта задача.
Проанализируем поведение платформы при работе с реквизитами. Реквизиты объекта внешней обработки, созданные в конфигураторе, жестко привязаны к типам данных из метаданных. Программно изменить тип реквизита объекта обработки в режиме исполняемого сеанса невозможно.
Кроме того, важно учитывать особенности работы типов данных в разных видах форм:
ДокументСписок.<ИмяДокумента> используется в обычных формах и жестко связывается с конкретной таблицей метаданных на этапе разработки. Изменить его состав типов или перенаправить на другой документ во время работы пользователя нельзя.ДокументСписок вообще не применяется. На смену ему пришел реквизит формы с типом ДинамическийСписок.Разберем наиболее эффективный способ решения задачи в управляемом приложении. Для динамической смены отображаемых документов используется ДинамическийСписок.
Пошагово проанализируем порядок реализации:
ДинамическийСписок и устанавливаем флаг «Произвольный запрос».Посмотрим на пример процедуры, выполняемой на сервере при смене типа документа:
&НаСервере
Процедура ОбновитьСписокДокументовНаСервере(ИмяВыбранногоДокумента)
// Указываем новую основную таблицу и запрос
СписокДокументов.ОсновнаяТаблица = "Документ." + ИмяВыбранногоДокумента;
СписокДокументов.ТекстЗапроса = "ВЫБРАТЬ * ИЗ Документ." + ИмяВыбранногоДокумента + " КАК Док";
// Очищаем предыдущие отборы
СписокДокументов.Отбор.Элементы.Очистить();
КонецПроцедуры
Если требуется полностью переделать состав колонок на форме, применяют метод ИзменитьРеквизиты(), который позволяет программно удалять старые и добавлять новые реквизиты формы, а также пересоздавать элементы таблицы.
Выясним, как реализовать подобную логику в обычном приложении, где используются обычные формы и реквизиты типа ДокументСписок.
Вариант 1. Переключение видимости табличных полей. В конфигураторе обработки создаются несколько реквизитов типа ДокументСписок под каждый необходимый тип документа и соответствующее количество табличных полей на форме. При выборе вида документа программно меняется свойство Видимость элементов формы (нужный список показывается, остальные скрываются). Это позволяет сохранить стандартный функционал отборов, поиска и проведения.
Вариант 2. Использование ПостроителяОтчета. Если данные выгружаются в ТаблицаЗначений, стандартный механизм отборов списков документов недоступен. Для реализации пользовательских фильтров применяется объект ПостроительОтчета. Текст запроса передается в построитель, а элемент формы связывается с его коллекцией Отбор.
Вариант 3. Вызов штатных форм списков. Вместо динамического изменения формы обработки можно вызывать стандартную форму списка нужного документа с помощью функции ОткрытьФорму(), передавая необходимые параметры отбора.
Таким образом, несмотря на то что изменить тип реквизита обработки напрямую нельзя, архитектура 1С предоставляет удобные альтернативные инструменты для решения этой задачи как в управляемом, так и в обычном приложении.