При работе в обычном приложении 1С 8.3 разработчики часто сталкиваются с задачей программного получения данных из Табличного поля. Особенность этой платформы заключается в разделении визуального элемента формы и реального объекта данных, который за ним стоит. Давайте детально разберем, как правильно обращаться к значениям ячеек, особенно если пользователь внес изменения "на лету", и как избежать распространенных ошибок вроде значения Неопределено.
Для начала проанализируем ситуацию: на форме обычного приложения элемент ТабличноеПоле не является самостоятельным хранилищем информации. Это лишь "окно" в мир данных. У каждого такого элемента есть свойство Данные, которое указывает на источник (например, Товары, ЭтотОбъект.Заказы или переменная типа ТаблицаЗначений).
Рассмотрим важный нюанс: когда пользователь редактирует ячейку, данные сначала меняются в экранной форме, и только после завершения редактирования строки или потери фокуса они записываются в связанный источник данных. Если мы попытаемся прочитать значение из кода в момент нажатия кнопки, данные могут оказаться "грязными" — то есть старыми, если курсор все еще мигает в ячейке.
Если нам нужно получить значение из той строки, на которой в данный момент стоит курсор пользователя, мы используем свойство ТекущиеДанные. Выясним причину, почему оно часто возвращает Неопределено.
Свойство ТекущиеДанные возвращает объект строки (тип зависит от источника: это может быть СтрокаТабличнойЧасти или СтрокаТаблицыЗначений). Если ни одна строка не выбрана (таблица пуста или фокус на другом элементе без сохранения выделения), система вернет Неопределено.
Рассмотрим пример правильного получения значения из колонки Цена для текущей строки:
// Получаем доступ к элементу формы
ТабПоле = ЭлементыФормы.Заказы22;
// Проверяем, есть ли активная строка
Если ТабПоле.ТекущиеДанные <> Неопределено Тогда
АктуальнаяЦена = ТабПоле.ТекущиеДанные.Цена;
Сообщить("Цена в текущей строке: " + АктуальнаяЦена);
Иначе
Сообщить("Строка не выбрана!");
КонецЕсли;
Если задача стоит в получении данных по всем строкам (например, для суммирования значений определенной колонки), нам необходимо обращаться к источнику данных напрямую. В 99% случаев ТабличноеПоле связано с табличной частью или переменной типа ТаблицаЗначений.
Разберем по шагам процесс получения актуальных данных из всех строк:
ЗакончитьРедактирование().Для Каждого.Посмотрим на пример кода, который решает задачу автора темы:
// 1. Принудительно фиксируем изменения, если пользователь еще в режиме ввода
ЭлементыФормы.Заказы22.ЗакончитьРедактирование(Ложь);
// 2. Определяем источник данных.
// В обычном приложении свойство Значение элемента ТабличноеПоле
// содержит саму коллекцию (ТЧ или ТЗ).
ИсточникДанных = ЭлементыФормы.Заказы22.Значение;
// 3. Перебираем строки в цикле
Для Каждого СтрИзЗаказов Из ИсточникДанных Цикл
// Обращаемся к колонке по имени, как в конфигураторе
ТекЗначение = СтрИзЗаказов.ИмяНужнойКолонки;
// Выполняем логику, например, проверку
Если ЗначениеЗаполнено(ТекЗначение) Тогда
// Ваши действия
КонецЕсли;
КонецЦикла;
Проанализируем ситуацию, описанную в сообщениях форума, где автор пытался написать Для Каждого Стр Из Таб Цикл, где Таб — это ЭлементыФормы.Заказы22. Это частая ошибка. Элемент формы ТабличноеПоле не является коллекцией, по которой можно итерировать. Итератором обладает только значение этого поля.
Поэтому вместо попытки перебора элемента формы, мы всегда должны обращаться к ЭлементыФормы.ИмяПоля.Значение или напрямую к реквизиту объекта (например, ЭтотОбъект.Заказы), если таблица связана с ним.
Иногда в таблице есть колонки, которых нет в источнике данных (в Табличной части). Их значения обычно рассчитываются в событии ПриВыводеСтроки или ПриПолученииДанных и отображаются через свойство ОформлениеСтроки.Ячейки.ИмяКолонки.УстановитьТекст().
Важно понимать: такие данные нельзя получить простым перебором коллекции строк, так как в коллекции этих данных физически нет. Если вам нужно получить значение из такой "виртуальной" ячейки, рассмотрите следующие варианты:
ПриВыводеСтроки, используя данные текущей строки.ТаблицеЗначений.Для надежного получения данных из табличного поля в обычном приложении 1С используйте следующую проверенную схему:
ЭлементыФормы.ИмяВашегоПоля.ЗакончитьРедактирование(Ложь). Это гарантирует, что текущая редактируемая ячейка сохранит значение в объект данных.ЭтотОбъект.ИмяТЧ) или через ЭлементыФормы.ИмяВашегоПоля.Значение.ЭлементыФормы.ИмяВашегоПоля.ТекущиеДанные, предварительно проверив на Неопределено.Следуя этой методике, вы всегда будете работать с актуальной информацией, которую пользователь видит на экране.