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

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

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

Способ 1. Использование метода ПоказатьВыборИзСписка

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

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

Разберем правильный алгоритм реализации (подготовить код поможет консоль кода с ИИ-помощником):


&НаКлиенте
Процедура СписокДокументовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    // Получаем данные с сервера
    СписокДляВыбора = ПолучитьСписокДокументовНаСервере(Элемент.ТекущиеДанные.Товар);
    
    // Настраиваем оповещение о завершении выбора
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораИзСписка", ЭтотОбъект);
    
    // Показываем компактное окно выбора
    ПоказатьВыборИзСписка(Оповещение, СписокДляВыбора);
КонецПроцедуры

&НаСервере
Функция ПолучитьСписокДокументовНаСервере(ТоварСсылка)
    Список = Новый СписокЗначений;
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   РеализацияТоваровУслуг.Ссылка КАК Ссылка,
        |   РеализацияТоваровУслуг.Представление КАК Представление
        |ИЗ
        |   Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        |ГДЕ
        |   РеализацияТоваровУслуг.Товары.Номенклатура = &Товар";
    
    Запрос.УстановитьПараметр("Товар", ТоварСсылка);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        Список.Добавить(Выборка.Ссылка, Выборка.Представление);
    КонецЦикла;
    
    Возврат Список;
КонецФункции

&НаКлиенте
Процедура ПослеВыбораИзСписка(ВыбранныйЭлемент, Параметры) Экспорт
    Если ВыбранныйЭлемент <> Неопределено Тогда
        // Открываем выбранный документ
        ПоказатьЗначение(, ВыбранныйЭлемент.Значение);
    КонецЕсли;
КонецПроцедуры

Способ 2. Создание вспомогательной формы со списком

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

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

  1. Создание формы: Создадим новую форму и добавим на нее реквизит СписокДокументов с типом ТаблицаЗначений (или ДинамическийСписок).
  2. Передача параметров: При открытии формы передадим в нее массив ссылок или параметры запроса.
  3. Отображение: В процедуре ПриСозданииНаСервере заполним таблицу данными.

Посмотрим на пример вызова такой формы из основного документа:


&НаКлиенте
Процедура ОткрытьОкноВыбораСписка()
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("МассивСсылок", СформироватьМассивНаСервере());
    
    ОткрытьФорму("Обработка.МояОбработка.Форма.ФормаВыбора", ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры

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

Способ 3. Использование Динамического списка (оптимально для больших данных)

Проанализируем ситуацию: если документов в результате запроса могут быть тысячи, передача их через массив замедлит работу системы. Выясним причину: при использовании динамического списка данные считываются порциями, что значительно экономит ресурсы.

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Устанавливаем отбор в динамическом списке
    ЭлементОтбора = Список.КомпоновкаДанных.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
    ЭлементОтбора.ПравоеЗначение = Параметры.МассивСсылок;
    ЭлементОтбора.Использование = Истина;
КонецПроцедуры

Способ 4. Вывод в поле табличного документа на форме

Иногда разработчики используют ТабличныйДокумент, но жалуются, что он «закрывает весь экран». Чтобы избежать этого, не нужно использовать метод Показать(). Вместо этого разместим на самой управляемой форме декорацию или поле вида Поле табличного документа.

Рассмотрим преимущества такого подхода:

Подведение итогов

Выбор конкретного метода зависит от ваших целей:

  1. Если нужно просто и быстро выбрать один документ из 5-10 найденных — используйте ПоказатьВыборИзСписка.
  2. Если требуется полноценный интерфейс с поиском и сортировкой — выбирайте Динамический список в отдельном окне или используйте универсальный журнал документов.
  3. Если результат запроса требует сложного оформления (группировки, итоги) — используйте Поле табличного документа прямо на форме.

Помните о правилах клиент-серверного взаимодействия: всегда выгружайте результаты запроса в коллекции, доступные для передачи на клиент, если не используете динамические списки.

← На главную