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

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

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

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

Понимание основы: Динамический список и его запрос

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

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

Метод 1: Добавление дополнительных полей через модификацию запроса основного объекта

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

  1. Создание расширения или изменение конфигурации:

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

    Для начала, добавьте в расширение объект, на котором основан ваш динамический список, например, справочник или документ. Затем добавьте в расширение форму, на которой расположен динамический список.

  2. Модификация запроса списка:

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

    Предположим, у нас есть динамический список, основанны на справочнике Номенклатура, и мы хотим добавить поле Артикул из этого же справочника или, например, Себестоимость из регистра сведений.

    В случае, если динамический список основан на основной таблице, мы можем добавить связи и выбрать поля из этих связей. Для этого необходимо зайти в конструктор запроса динамического списка (кнопка с лупой рядом со свойством Запрос или ОсновнаяТаблица, если список имеет режим Основная таблица). Здесь мы сможем добавить нужные таблицы и связать их.

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

  3. Пример кода для программного изменения запроса (через расширение или в типовой конфигурации, если она позволяет):

    В расширении мы можем создать обработчик события ПриСозданииНаСервере для формы списка и изменить текст запроса динамического списка. Рассмотрим пример, где мы добавляем поле Подразделение из связанной таблицы: — поможет вывод ИНН контрагента в список партнеров.

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // Предположим, что имя динамического списка на форме - Список
        ЗапросСписка = Список.ПолучитьЗапрос();
    
        // Если список основан на Объекте. например, Справочник.Сотрудники
        // и нам нужно добавить поле из Справочник.Подразделения
        ТекстЗапроса = "ВЫБРАТЬ
                       |    ТЧ.Ссылка КАК Ссылка,
                       |    ТЧ.Код КАК Код,
                       |    ТЧ.Наименование КАК Наименование,
                       |    ТЧ.Подразделение КАК Подразделение,
                       |    Подразделения.Наименование КАК НаименованиеПодразделения
                       |ИЗ
                       |    Справочник.Сотрудники КАК ТЧ
                       |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Подразделения КАК Подразделения
                       |        ПО ТЧ.Подразделение = Подразделения.Ссылка";
    
        Список.ТекстЗапроса = ТекстЗапроса;
    
        // Важно также добавить новое поле в состав полей динамического списка
        // для его отображения в пользовательских настройках и на форме.
        ЭлементФормыКолонка = Элементы.Список.Колонки.Добавить("НаименованиеПодразделения");
        ЭлементФормыКолонка.Данные = "НаименованиеПодразделения";
        ЭлементФормыКолонка.Заголовок = "Подразделение";
        ЭлементФормыКолонка.ВидДоступа = РежимДоступаЭлементаУправляемойФормы.Чтение; // Если нужно только чтение
    КонецПроцедуры
    

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

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

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

  1. Переключение режима динамического списка:

    В свойствах элемента формы "Динамический список" установите для свойства Тип источника значение Запрос. После этого станет доступно свойство ТекстЗапроса.

  2. Формирование произвольного запроса:

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

    Рассмотрим пример, где мы выводим список документов ПоступлениеТоваровУслуг и хотим добавить информацию о складе, а также общую сумму документа:

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

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

  3. Добавление колонок на форму:

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

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

  4. Важный нюанс: Произвольный запрос и расширения:

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

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

Метод 3: Добавление полей в динамический список через настройки формы (Пользовательский режим)

Этот метод не требует изменения конфигурации и позволяет пользователям самостоятельно настроить отображение полей.

  1. Открытие формы и вызов настроек списка:

    Запустите 1С:Предприятие в пользовательском режиме. Откройте форму со списком. Найдите кнопку "Еще" и выберите пункт "Изменить форму...".

  2. Добавление колонок:

    В открывшемся окне "Настройка формы" найдите раздел "Элементы списка" или "Колонки". Вы увидите список доступных полей. Отметьте галочками те поля, которые вы хотите видеть. Если нужных полей нет в списке, это означает, что они не были включены в основной запрос (см. методы 1 и 2).

  3. Сохранение настроек:

    После выбора нужных полей нажмите "ОК" или "Применить". Теперь выбранные вами поля будут отображаться в динамическом списке.

Метод 4: Использование виртуальных таблиц и их полей в запросах

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

  1. Пример с виртуальной таблицей СрезПоследних:

    Предположим, мы хотим отобразить последний курс валюты на дату документа:

    
    ВЫБРАТЬ
        Документ.Ссылка,
        Документ.Дата,
        Документ.Номер,
        СрезПоследнихКурсыВалют.Курс КАК КурсВалюты
    ИЗ
        Документ.ПриходныйКассовыйОрдер КАК Документ
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(
                    &Период,
                    Валюта = &Валюта) КАК СрезПоследнихКурсыВалют
            ПО Документ.ВалютаДокумента = СрезПоследнихКурсыВалют.Валюта
    
  2. Пример с параметрами виртуальной таблицы:

    В расширении для формы списка, в событии ПриСозданииНаСервере можно динамически добавить поле остатка:

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

Важные аспекты и советы

  1. Производительность:

    Будьте внимательны при добавлении сложных запросов и большого количества соединений. Это может снизить производительность динамического списка.

  2. Использование ОбщегоНазначения:

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

  3. Автоматическое обновление полей:

    Убедитесь, что список настроен на автоматическое обновление, если данные часто меняются.

  4. Отображение сложных данных:

    Для вывода иконок или форматированного текста иногда требуется программное заполнение колонок в событиях формы.

  5. Отладка запросов:

    Чтобы убедиться в корректности данных, всегда используйте профессиональные инструменты, такие как консоль запросов для управляемых форм. Это сэкономит время при поиске ошибок в сложных соединениях — для этого подойдёт профессиональная консоль запросов для управляемых форм.

Заключение

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

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

← На главную