Почему в отладчике 1С не раскрываются реквизиты свойства ТекущаяСтрока?

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

В процессе отладки управляемых форм разработчики нередко сталкиваются с ситуацией, когда в окне отладчика (в табло или при вычислении выражений) одно и то же выражение ведет себя по-разному: на одной рабочей станции или в одном сеансе у значения есть знак раскрытия («+») и можно просмотреть состав полей, а в другом — знака нет, и получить доступ к реквизитам строки не удается.

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

Выясняем причину: разница между тонким и толстым клиентами

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

  1. Тонкий клиент: работает в условиях строгого разделения клиентского и серверного контекстов. Клиентское приложение не хранит полные объекты базы данных и их контекст. Если выражение возвращает примитивное значение или ссылку, отладчик тонкого клиента не выполняет неявных серверных обращений для дочитывания состава реквизитов.
  2. Толстый клиент (управляемое приложение): содержит в себе контекст сервера и кэш метаданных. При отладке в толстом клиенте среда разработки способна динамически получать информацию о связанных объектах, поэтому у ссылочных типов и элементов коллекций отображается знак «+», позволяющий развернуть внутреннюю структуру.

Разница между свойствами ТекущаяСтрока и ТекущиеДанные

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

Свойство ТекущаяСтрока возвращает не саму строку со всеми ее колонками, а только ее идентификатор:

  1. Для табличных частей и таблиц значений — это системный идентификатор строки (тип Число). Поскольку число является простым типом данных, у него нет и не может быть дочерних реквизитов.
  2. Для динамических списков — это ссылка на текущий объект (например, СправочникСсылка.Номенклатура или ДокументСсылка.РеализацияТоваровУслуг) либо ключ записи регистра. В тонком клиенте ссылка не раскрывает свои реквизиты «через точку» без обращения к серверу.

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

Способы решения и корректного получения данных

Рассмотрим, как правильно организовать доступ к реквизитам строки в зависимости от контекста выполнения кода.

1. Получение данных строки на клиенте

Если требуется получить значения колонок текущей строки в клиентской процедуре или просмотреть их в табло отладчика, необходимо обращаться к свойству ТекущиеДанные:


// В табло отладчика или в клиентском коде
ДанныеСтроки = Элементы.ИмяТаблицы.ТекущиеДанные;
Если ДанныеСтроки <> Неопределено Тогда
    ЗначениеРеквизита = ДанныеСтроки.ИмяКолонки;
КонецЕсли;

2. Получение строки табличной части на сервере по идентификатору

Обратите внимание: свойство ТекущиеДанные недоступно на сервере. Поэтому на сервере используется идентификатор строки из свойства ТекущаяСтрока для поиска строки в коллекции данных формы:


&НаСервере
Процедура ОбработатьСтрокуНаСервере()
    ИдентификаторСтроки = Элементы.ИмяТаблицы.ТекущаяСтрока;
    Если ИдентификаторСтроки <> Неопределено Тогда
        СтрокаТабличнойЧасти = Объект.ИмяТабличнойЧасти.НайтиПоИдентификатору(ИдентификаторСтроки);
        Если СтрокаТабличнойЧасти <> Неопределено Тогда
            СтрокаТабличнойЧасти.Количество = 10;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

3. Работа с динамическим списком

Если таблица формы связана с динамическим списком:

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

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

← На главную