Как отображаются и как программно получить доступ к дополнительным полям в динамическом списке 1С:Документооборот 3?

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

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

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

Основные причины появления дополнительных полей в динамическом списке

Существует несколько основных причин, по которым дополнительные поля могут отображаться в динамическом списке, даже если они не были явно добавлены в конфигурации:

  1. Пользовательские настройки формы. Это наиболее частая причина. Платформа 1С позволяет пользователям самостоятельно настраивать состав и порядок колонок в динамических списках через стандартный механизм "Изменить форму".
  2. Программное добавление колонок. Колонки могут быть добавлены в динамический список программно на сервере.
  3. Дополнительные реквизиты и сведения. В некоторых случаях, если в конфигурации используются механизмы дополнительных реквизитов и сведений, они могут быть настроены для автоматического вывода.
  4. Механизмы БСП (Библиотеки стандартных подсистем). Типовые конфигурации, такие как "Документооборот", активно используют БСП, которые могут добавлять или изменять поля в динамических списках для обеспечения своей функциональности.

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

1. Пользовательские настройки формы: Наиболее распространенная причина

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

Как пользователи добавляют поля?

  1. В режиме 1С:Предприятия пользователь открывает форму со списком.
  2. Нажимает кнопку "Еще" (или аналогичную, например, "Все действия" в старых версиях).
  3. Выбирает пункт "Изменить форму...".
  4. В открывшемся окне "Настройка формы" пользователь может развернуть ветку "Список" и найти там доступные поля. Если список основан на объекте (например, на документе), то в ветке "Список" обычно есть поле "Ссылка". Развернув "Ссылка", пользователь может получить доступ ко всем реквизитам ссылочного объекта (например, Ссылка.Номер, Ссылка.Дата, Ссылка.Состояние, Ссылка.ДатаСчета, Ссылка.НомерСчета).
  5. Перетаскивая эти поля из левой части в правую ("Элементы формы"), пользователь добавляет их в список.
  6. Эти настройки сохраняются в хранилище пользовательских настроек и применяются при каждом открытии формы для данного пользователя.

Важный момент: Даже если вы сбрасываете стандартные настройки формы через "Изменить форму" -> "Еще" -> "Установить стандартные настройки", это не всегда приводит к полному удалению таких полей, если они были добавлены в пользовательских настройках, которые могли быть сохранены глубоко. Иногда требуется очистка персональных настроек пользователя.

Почему поля не видны в ЭтаФорма.Элементы?

Когда пользователь добавляет поле через "Изменить форму", платформа не создает новый элемент управления на форме в конфигурации. Вместо этого она динамически изменяет компоновщик настроек динамического списка в рантайме, добавляя соответствующее поле для вывода данных. Таким образом, эти поля существуют как элементы в компоновщике настроек списка, но не как явные элементы формы в дереве элементов, которое вы видите в конфигураторе или через коллекцию ЭтаФорма.Элементы. Коллекция ЭтаФорма.Элементы содержит элементы, описанные в конфигурации, или элементы, добавленные программно разработчиком в модуль формы.

Как программно получить доступ к данным таких полей?

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

Рассмотрим пример:


// Предположим, у нас есть элемент формы с именем "Список", который является ДинамическимСписком
Если Элементы.Список.ТекущиеДанные <> Неопределено Тогда
    // Получаем текущую строку динамического списка
    ТекущаяСтрока = Элементы.Список.ТекущиеДанные;

    // Теперь мы можем обратиться к полям, даже если они не выведены явно в конфигураторе,
    // но доступны в запросе списка или добавлены пользователем.
    // Например, если поле "Ссылка.НомерСчета" выведено пользователем:
    Если ТекущаяСтрока.Свойство("НомерСчета") Тогда // Проверяем наличие свойства, чтобы избежать ошибки
        НомерСчета = ТекущаяСтрока.НомерСчета;
        Сообщить("Номер счета: " + НомерСчета);
    Иначе
        Сообщить("Поле НомерСчета отсутствует в текущих данных.");
    КонецЕсли;

    // Если поле "Ссылка.ДатаСчета" выведено пользователем:
    Если ТекущаяСтрока.Свойство("ДатаСчета") Тогда
        ДатаСчета = ТекущаяСтрока.ДатаСчета;
        Сообщить("Дата счета: " + ДатаСчета);
    Иначе
        Сообщить("Поле ДатаСчета отсутствует в текущих данных.");
    КонецЕсли;

    // К полям, которые являются реквизитами ссылки, мы также можем обратиться.
    // Если в запросе списка есть поле "Ссылка", то мы можем получить объект ссылки
    // и далее обратиться к его реквизитам, если они доступны:
    Если ТекущаяСтрока.Свойство("Ссылка") Тогда
        ОбъектСсылка = ТекущаяСтрока.Ссылка;
        Если ТипЗнч(ОбъектСсылка) = Тип("ДокументСсылка.СчетНаОплату") Тогда // Пример для определенного типа ссылки
            // Обращение к реквизиту объекта по ссылке
            // (это не то же самое, что поля вида "Ссылка.Реквизит", которые уже извлечены запросом)
            // Чтобы получить реквизит объекта по ссылке, возможно придется получить сам объект,
            // или использовать запрос для извлечения его реквизитов.
            // Однако, если мы говорим о полях, добавленных пользователем как "Ссылка.НомерСчета",
            // они уже доступны напрямую через ТекущаяСтрока.
        КонецЕсли;
    КонецЕсли;

КонецЕсли;

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

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

В случае, если необходимо ограничить возможность отбора или использования определенных полей, мы можем использовать метод УстановитьОграниченияИспользованияВОтборе(), который позволяет динамически управлять доступностью полей в компоновщике настроек для пользователей.

2. Программное добавление колонок или модификация запроса

Иногда дополнительные колонки могут быть добавлены не пользователем, а программным кодом в модуле формы или в общих модулях. Это может происходить несколькими способами:

  1. Модификация текста запроса динамического списка. В обработчиках событий, таких как ПриСозданииНаСервере или ПриПолученииДанныхНаСервере, разработчик может изменить текст запроса динамического списка, добавив в него новые поля.
  2. Программное добавление элементов формы. Хотя это менее распространено для полей, отображаемых через точку (Ссылка.Реквизит), разработчик может программно добавлять элементы управления на форму и связывать их с данными.
  3. Использование объекта СхемаЗапроса. Для более сложной модификации запроса может использоваться объект СхемаЗапроса, позволяющий динамически строить и изменять запрос.

Поиск программной модификации

Если вы подозреваете программное добавление, необходимо выполнить следующие шаги:

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

Пример изменения текста запроса в ПриСозданииНаСервере:


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

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

3. Дополнительные реквизиты и сведения

В типовых конфигурациях 1С, включая "Документооборот", активно используется механизм дополнительных реквизитов и сведений (ДРС). Эти реквизиты могут быть настроены для вывода в списках объектов, к которым они относятся. Если такие настройки сделаны, то при отображении списка документов (или других объектов), к которым привязаны ДРС, соответствующие колонки могут появиться автоматически. Эти поля также будут доступны через Элементы.Список.ТекущиеДанные.

Для проверки настройки ДРС мы можем посмотреть раздел "Администрирование" -> "Общие настройки" -> "Дополнительные реквизиты и сведения" в режиме 1С:Предприятия. Там можно увидеть, какие ДРС настроены для объектов, входящих в ваш динамический список, и как они настроены для вывода.

4. Механизмы БСП (Библиотеки стандартных подсистем)

В конфигурациях, основанных на БСП, могут быть реализованы специальные механизмы, которые динамически добавляют колонки в списки. Это может быть связано с подсистемами печати, работы с характеристиками, расширенными отчетами и т.д. Такие механизмы часто используют программное изменение запроса списка, о котором мы говорили выше. Поиск в общих модулях, относящихся к БСП (например, УправлениеПечатью, ДополнительныеСведения, СтандартныеПодсистемы), может помочь выявить такие модификации.

Заключение

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

Помните, что доступ к данным всех полей, извлеченных запросом динамического списка (будь то поля из конфигурации, добавленные пользователем или программно), всегда осуществляется через объект Элементы.Список.ТекущиеДанные для текущей строки.

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

← На главную