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