Как вывести поля из связанных объектов в динамический список 1С 8.3 УФ?

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

При работе с динамическими списками в системе 1С 8.3 на управляемых формах мы часто сталкиваемся с необходимостью отобразить данные не только из основной таблицы, которая служит источником для списка, но и из связанных с ней объектов. Например, может возникнуть задача вывести наименование вида договора из реквизита "ДоговорКонтрагента" для документа "ЗаказПокупателя". Простая попытка прямого указания пути, например, ДоговорКонтрагента.ВидДоговора, может привести к сообщению об ошибке "Поле не найдено". Рассмотрим подробно, как правильно и эффективно реализовать вывод таких составных полей.

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

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

Метод 1: Добавление поля через "Путь к данным" в настройках динамического списка

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

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

  1. Откроем форму динамического списка в конфигураторе. Первым делом мы должны открыть конфигуратор, найти нашу форму, на которой расположен динамический список, и перейти к ее редактированию.
  2. Выделим динамический список на форме. На форме выберем элемент, который является динамическим списком. Обычно он имеет тип ТаблицаФормы и связан с источником данных типа ДинамическийСписок.
  3. Перейдем к настройкам динамического списка в его свойствах. В палитре свойств динамического списка найдем раздел "Настройки". Именно здесь мы управляем структурой и отображением данных списка.
  4. Добавим новое поле. В разделе "Настройки" динамического списка, как правило, есть закладка "Поля" (или аналогичный раздел, где перечислены отображаемые колонки). Нажмите кнопку "Добавить поле", чтобы создать новую колонку в списке.
  5. Укажем "Путь к данным". В появившейся строке для нового поля в колонке "Путь к данным" нам предстоит ввести полный путь до нужного реквизита, используя точечную нотацию. Например, если у нас есть реквизит ДоговорКонтрагента (который может иметь тип ДокументСсылка.ДоговорКонтрагента или СправочникСсылка.ДоговорыКонтрагентов), и мы хотим вывести его реквизит ВидДоговора, то правильный путь будет выглядеть так: ДоговорКонтрагента.ВидДоговора. Система 1С автоматически распознает этот путь и самостоятельно построит необходимое внутреннее соединение. Тип данных этого поля также будет автоматически определен.
  6. Настроим заголовок и видимость. После добавления поля мы можем изменить его "Заголовок" на более понятный для пользователей (например, "Вид договора") и настроить его "Видимость", если это требуется для конкретных ролей или групп пользователей.

Посмотрим на пример использования "Пути к данным":

Допустим, наш динамический список основан на документе Документ.ЗаказПокупателя. В этом документе имеется реквизит ДоговорКонтрагента, который ссылается на справочник Справочник.ДоговорыКонтрагентов. Наша задача — отобразить реквизит ВидДоговора из этого справочника в нашем динамическом списке. Мы выполняем следующие действия:

  1. Открываем форму, содержащую динамический список, в конфигураторе.
  2. Выбираем сам элемент формы, который представляет наш динамический список.
  3. В палитре свойств динамического списка находим вкладку "Настройки" и внутри нее — раздел "Поля".
  4. Нажимаем кнопку "Добавить поле" для создания новой колонки.
  5. В колонке "Путь к данным" для новой строки вводим: ДоговорКонтрагента.ВидДоговора.
  6. По желанию, меняем "Заголовок" на "Вид договора".

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

Метод 2: Изменение запроса динамического списка

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

Использование этого метода требует понимания языка запросов 1С и принципов работы системы компоновки данных (СКД), на которой базируются динамические списки. Давайте рассмотрим шаги, которые мы должны предпринять:

  1. Откроем форму динамического списка в конфигураторе. Как и в первом методе, начинаем с открытия формы в конфигураторе.
  2. Перейдем к свойствам динамического списка. В свойствах динамического списка найдем раздел "Данные". Здесь может быть свойство "Основная таблица" (если список основан на стандартном объекте) или "Произвольный запрос" (если мы уже используем собственный запрос).
  3. Откроем редактор запроса. Если используется "Основная таблица", мы можем нажать кнопку "Настройка списка" или "Запрос" рядом с этим свойством, чтобы открыть конструктор запроса или окно редактирования текста запроса. Если уже указан "Произвольный запрос", то мы просто переходим к его редактированию.
  4. Добавим необходимые соединения и поля. В тексте запроса мы используем оператор ЛЕВОЕ СОЕДИНЕНИЕ (или другой подходящий тип соединения, например, ВНУТРЕННЕЕ СОЕДИНЕНИЕ) для связи с нужным справочником, документом, регистром или другим объектом. После установления связи мы выбираем требуемое поле в секции ВЫБРАТЬ.

Пример изменения запроса с использованием "через точку":

Предположим, мы хотим вывести ВидДоговора из ДоговораКонтрагента, связанного с Документ.ЗаказПокупателя. Изначальный запрос нашего динамического списка мог бы выглядеть так:


ВЫБРАТЬ
    ЗаказПокупателя.Ссылка,
    ЗаказПокупателя.Номер,
    ЗаказПокупателя.Дата,
    ЗаказПокупателя.ДоговорКонтрагента
ИЗ
    Документ.ЗаказПокупателя КАК ЗаказПокупателя

Чтобы добавить поле ВидДоговора, мы модифицируем секцию ВЫБРАТЬ запроса, используя синтаксис "через точку". Это указывает платформе, что нужно получить реквизит из связанного объекта:


ВЫБРАТЬ
    ЗаказПокупателя.Ссылка,
    ЗаказПокупателя.Номер,
    ЗаказПокупателя.Дата,
    ЗаказПокупателя.ДоговорКонтрагента,
    ЗаказПокупателя.ДоговорКонтрагента.ВидДоговора КАК ВидДоговора
ИЗ
    Документ.ЗаказПокупателя КАК ЗаказПокупателя

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

Рассмотрим более сложный случай с явным соединением:

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


ВЫБРАТЬ
    ЗаказПокупателя.Ссылка,
    ЗаказПокупателя.Номер,
    ЗаказПокупателя.Дата,
    ЗаказПокупателя.ДоговорКонтрагента,
    ДоговорыКонтрагентов.ВидДоговора
ИЗ
    Документ.ЗаказПокупателя КАК ЗаказПокупателя
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
        ПО ЗаказПокупателя.ДоговорКонтрагента = ДоговорыКонтрагентов.Ссылка

В этом примере мы явно соединяем таблицу Документ.ЗаказПокупателя с таблицей Справочник.ДоговорыКонтрагентов, используя ЛЕВОЕ СОЕДИНЕНИЕ. Это позволяет нам получить все записи из Документ.ЗаказПокупателя и присоединенные данные из Справочник.ДоговорыКонтрагентов, если они существуют. Условие соединения ПО ЗаказПокупателя.ДоговорКонтрагента = ДоговорыКонтрагентов.Ссылка указывает, как связаны эти две таблицы. Затем мы выбираем нужное поле ДоговорыКонтрагентов.ВидДоговора. Этот подход является максимально гибким и позволяет строить сложные выборки с любыми условиями, фильтрами и связями, что делает его незаменимым для нетривиальных задач.

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

Какой метод выбрать?

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

"Путь к данным" в настройках динамического списка (Метод 1)

Изменение запроса динамического списка (Метод 2)

Мы должны всегда убеждаться, что выбранный метод соответствует архитектуре данных и требованиям к производительности. Перед внедрением изменений всегда тестируйте их в тестовой базе, чтобы удостовериться в корректности отображения данных и отсутствии негативного влияния на производительность системы. Особенно это актуально для динамических списков, работающих с большими объемами данных.

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

← На главную