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