Почему в динамическом списке не получается получить ссылку и как это исправить

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

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

Проблема оптимизации динамических списков

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

Рассмотрим ситуацию: вы создаете динамический список в расширении, пишете запрос вида:


ВЫБРАТЬ
    ЧекККМ.Ссылка КАК Ссылка,
    ЧекККМ.Дата КАК Дата,
    ЧекККМ.Номер КАК Номер
ИЗ
    Документ.ЧекККМ КАК ЧекККМ
ГДЕ
    НЕ ЧекККМ.ПометкаУдаления

Затем в коде формы при попытке обратиться к Элементы.ТаблицаЧеков.ТекущиеДанные.Ссылка вы получаете ошибку или Неопределено, хотя в запросе поле есть. Выясним, как заставить платформу «отдать» нам эти данные.

Способ 1: Использование основной таблицы

Проанализируем настройки самого реквизита формы с типом ДинамическийСписок. Одним из ключевых свойств является Основная таблица.

Если в настройках списка указана основная таблица (например, Документ.ЧекККМ), поведение платформы меняется:

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

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

Способ 2: Свойство «Использовать всегда»

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

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

Установка этого признака прямо указывает платформе: «Это поле критически важно для работы алгоритмов, не исключай его из выборки, даже если его нет на экране».

Способ 3: Программная установка обязательного использования

Рассмотрим наиболее гибкий метод, который особенно актуален при динамической смене текста запроса в процедуре ПриСозданииНаСервере или других событиях. Если мы программно меняем ТекстЗапроса, нам следует так же программно подтвердить необходимость получения поля Ссылка.

Для этого используется метод УстановитьОбязательноеИспользование. Проанализируем пример кода:


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

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

Способ 4: Различие между ТекущиеДанные и ТекущаяСтрока

Важно понимать разницу между этими двумя свойствами элемента формы «Таблица». Посмотрим на их поведение:

Поэтому, если вы работаете без основной таблицы, ваш единственный путь — обеспечить наличие поля Ссылка в ТекущиеДанные через способы, описанные выше.

Почему «копирование» списка иногда решает проблему?

Разберем интересный эффект, упомянутый в практике: когда разработчик создает новый список, поля нет, но если скопировать список с типовой формы — оно появляется. Это происходит из-за того, что при копировании объекта реквизита копируются и его скрытые настройки компоновки данных (СКД). В типовых конфигурациях (например, в Рознице 3.0) многие списки уже имеют предопределенные настройки, где для ключевых полей включены невидимые флаги обязательного использования. При создании списка «с нуля» в расширении эти настройки пусты, и включается механизм максимальной экономии трафика.

Резюме и рекомендации

Для стабильной работы с данными динамического списка рекомендуется придерживаться следующих правил:

  1. Если список отображает данные одной таблицы, всегда указывайте ее в поле Основная таблица. Это автоматически решит проблему получения ссылки через ТекущаяСтрока.
  2. Если вы используете сложный произвольный запрос без основной таблицы, всегда вызывайте УстановитьОбязательноеИспользование("Ссылка", Истина) сразу после изменения текста запроса.
  3. Проверяйте видимость колонок. Если поле Ссылка выведено на форму (даже если оно скрыто программно через Видимость = Ложь), платформа чаще всего включит его в выборку, но полагаться на это как на единственный метод не стоит — лучше использовать явное указание обязательности.

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

← На главную