Как получить актуальные значения из ячеек табличного поля в обычном приложении 1С?

Программист 1С v8.3 (Обычные формы)
← На главную

При работе в обычном приложении 1С 8.3 разработчики часто сталкиваются с задачей программного получения данных из Табличного поля. Особенность этой платформы заключается в разделении визуального элемента формы и реального объекта данных, который за ним стоит. Давайте детально разберем, как правильно обращаться к значениям ячеек, особенно если пользователь внес изменения "на лету", и как избежать распространенных ошибок вроде значения Неопределено.

Понимание архитектуры: Виджет vs Данные

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

Рассмотрим важный нюанс: когда пользователь редактирует ячейку, данные сначала меняются в экранной форме, и только после завершения редактирования строки или потери фокуса они записываются в связанный источник данных. Если мы попытаемся прочитать значение из кода в момент нажатия кнопки, данные могут оказаться "грязными" — то есть старыми, если курсор все еще мигает в ячейке.

Решение 1: Получение текущей (активной) строки

Если нам нужно получить значение из той строки, на которой в данный момент стоит курсор пользователя, мы используем свойство ТекущиеДанные. Выясним причину, почему оно часто возвращает Неопределено.

Свойство ТекущиеДанные возвращает объект строки (тип зависит от источника: это может быть СтрокаТабличнойЧасти или СтрокаТаблицыЗначений). Если ни одна строка не выбрана (таблица пуста или фокус на другом элементе без сохранения выделения), система вернет Неопределено.

Рассмотрим пример правильного получения значения из колонки Цена для текущей строки:


// Получаем доступ к элементу формы
ТабПоле = ЭлементыФормы.Заказы22;

// Проверяем, есть ли активная строка
Если ТабПоле.ТекущиеДанные <> Неопределено Тогда
    АктуальнаяЦена = ТабПоле.ТекущиеДанные.Цена;
    Сообщить("Цена в текущей строке: " + АктуальнаяЦена);
Иначе
    Сообщить("Строка не выбрана!");
КонецЕсли;

Решение 2: Перебор всех строк таблицы с учетом изменений

Если задача стоит в получении данных по всем строкам (например, для суммирования значений определенной колонки), нам необходимо обращаться к источнику данных напрямую. В 99% случаев ТабличноеПоле связано с табличной частью или переменной типа ТаблицаЗначений.

Разберем по шагам процесс получения актуальных данных из всех строк:

  1. Завершение редактирования: Перед обходом коллекции данных необходимо принудительно заставить форму "сбросить" введенные пользователем значения в память. Используем метод ЗакончитьРедактирование().
  2. Обход коллекции: Перебираем источник через цикл Для Каждого.

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


// 1. Принудительно фиксируем изменения, если пользователь еще в режиме ввода
ЭлементыФормы.Заказы22.ЗакончитьРедактирование(Ложь);

// 2. Определяем источник данных. 
// В обычном приложении свойство Значение элемента ТабличноеПоле 
// содержит саму коллекцию (ТЧ или ТЗ).
ИсточникДанных = ЭлементыФормы.Заказы22.Значение;

// 3. Перебираем строки в цикле
Для Каждого СтрИзЗаказов Из ИсточникДанных Цикл
    // Обращаемся к колонке по имени, как в конфигураторе
    ТекЗначение = СтрИзЗаказов.ИмяНужнойКолонки;
    
    // Выполняем логику, например, проверку
    Если ЗначениеЗаполнено(ТекЗначение) Тогда
        // Ваши действия
    КонецЕсли;
КонецЦикла;

Почему цикл по самому элементу формы не работает?

Проанализируем ситуацию, описанную в сообщениях форума, где автор пытался написать Для Каждого Стр Из Таб Цикл, где Таб — это ЭлементыФормы.Заказы22. Это частая ошибка. Элемент формы ТабличноеПоле не является коллекцией, по которой можно итерировать. Итератором обладает только значение этого поля.

Поэтому вместо попытки перебора элемента формы, мы всегда должны обращаться к ЭлементыФормы.ИмяПоля.Значение или напрямую к реквизиту объекта (например, ЭтотОбъект.Заказы), если таблица связана с ним.

Как работать с "вычисленными" колонками

Иногда в таблице есть колонки, которых нет в источнике данных (в Табличной части). Их значения обычно рассчитываются в событии ПриВыводеСтроки или ПриПолученииДанных и отображаются через свойство ОформлениеСтроки.Ячейки.ИмяКолонки.УстановитьТекст().

Важно понимать: такие данные нельзя получить простым перебором коллекции строк, так как в коллекции этих данных физически нет. Если вам нужно получить значение из такой "виртуальной" ячейки, рассмотрите следующие варианты:

Подводим итоги

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

  1. Вызовите ЭлементыФормы.ИмяВашегоПоля.ЗакончитьРедактирование(Ложь). Это гарантирует, что текущая редактируемая ячейка сохранит значение в объект данных.
  2. Обращайтесь к источнику данных напрямую через реквизит (например, ЭтотОбъект.ИмяТЧ) или через ЭлементыФормы.ИмяВашегоПоля.Значение.
  3. Если нужна только одна строка, используйте ЭлементыФормы.ИмяВашегоПоля.ТекущиеДанные, предварительно проверив на Неопределено.

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

← На главную