В процессе отладки управляемых форм разработчики нередко сталкиваются с ситуацией, когда в окне отладчика (в табло или при вычислении выражений) одно и то же выражение ведет себя по-разному: на одной рабочей станции или в одном сеансе у значения есть знак раскрытия («+») и можно просмотреть состав полей, а в другом — знака нет, и получить доступ к реквизитам строки не удается.
Разберем подробнее, почему возникает такое поведение платформы 1С:Предприятие 8.3, в чем заключается принципиальная разница между типами клиентов и как правильно обращаться к данным выбранной строки таблицы.
Главная причина различного отображения данных в отладчике заключается в режиме запуска клиентского приложения:
Проанализируем работу двух часто путаемых свойств элемента формы типа «Таблица»:
Свойство ТекущаяСтрока возвращает не саму строку со всеми ее колонками, а только ее идентификатор:
Число). Поскольку число является простым типом данных, у него нет и не может быть дочерних реквизитов.СправочникСсылка.Номенклатура или ДокументСсылка.РеализацияТоваровУслуг) либо ключ записи регистра. В тонком клиенте ссылка не раскрывает свои реквизиты «через точку» без обращения к серверу.Свойство ТекущиеДанные возвращает объект с типом ДанныеФормыЭлементКоллекции (или структуру строки динамического списка). Именно в этом объекте содержатся все колонки и значения текущей строки, отображаемые в таблице. Этот объект всегда доступен для разворачивания в отладчике тонкого клиента.
Рассмотрим, как правильно организовать доступ к реквизитам строки в зависимости от контекста выполнения кода.
1. Получение данных строки на клиенте
Если требуется получить значения колонок текущей строки в клиентской процедуре или просмотреть их в табло отладчика, необходимо обращаться к свойству ТекущиеДанные:
// В табло отладчика или в клиентском коде
ДанныеСтроки = Элементы.ИмяТаблицы.ТекущиеДанные;
Если ДанныеСтроки <> Неопределено Тогда
ЗначениеРеквизита = ДанныеСтроки.ИмяКолонки;
КонецЕсли;
2. Получение строки табличной части на сервере по идентификатору
Обратите внимание: свойство ТекущиеДанные недоступно на сервере. Поэтому на сервере используется идентификатор строки из свойства ТекущаяСтрока для поиска строки в коллекции данных формы:
&НаСервере
Процедура ОбработатьСтрокуНаСервере()
ИдентификаторСтроки = Элементы.ИмяТаблицы.ТекущаяСтрока;
Если ИдентификаторСтроки <> Неопределено Тогда
СтрокаТабличнойЧасти = Объект.ИмяТабличнойЧасти.НайтиПоИдентификатору(ИдентификаторСтроки);
Если СтрокаТабличнойЧасти <> Неопределено Тогда
СтрокаТабличнойЧасти.Количество = 10;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
3. Работа с динамическим списком
Если таблица формы связана с динамическим списком:
Элементы.ИмяДинамическогоСписка.ТекущиеДанные.ИмяПоля.ТекущаяСтрока вернула ссылку на объект базы данных, для чтения полных реквизитов выполняем запрос или получаем объект через Ссылка.ПолучитьОбъект().Таким образом, для стабильной отладки и корректной работы кода в тонком клиенте всегда используйте ТекущиеДанные для просмотра состава строки на клиенте, а ТекущаяСтрока применяйте как идентификатор для серверных операций.