Как получить значение из «виртуальной» колонки табличной части в обычных формах 1С?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке в обычных формах 1С:Предприятия часто возникает ситуация, когда необходимо вывести дополнительные данные (например, остатки) в табличную часть документа. Если эти данные не являются реквизитами объекта, мы обычно создаем «виртуальную» колонку, которая заполняется программно в событиях ПриПолученииДанных или ПриВыводеСтроки. Однако нередко возникает вопрос: как получить значение из такой колонки, например, при изменении количества в строке? Рассмотрим подробнее, как решить эту задачу.

Почему данные недоступны напрямую

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

Способ №1: Прямое обращение к оформлению ячейки

Самый простой, хотя и не самый «чистый» с точки зрения архитектуры способ — это обратиться к ячейке текущей строки через объект ОформлениеСтроки. Мы можем извлечь визуальный текст, который был ранее установлен в событии отрисовки.

Для этого воспользуемся следующей конструкцией в обработчике события ПриИзменении:


// Обращаемся к текущей строке табличного поля
СтрокаОформления = ЭлементыФормы.Товары.ОформлениеСтроки(ЭлементыФормы.Товары.ТекущаяСтрока);

// Получаем текст из ячейки виртуальной колонки
ТекстовоеЗначениеОстатка = СтрокаОформления.Ячейки.Остаток1.Текст;

// Преобразуем полученный текст в число для дальнейших расчетов
Остаток = Число(ТекстовоеЗначениеОстатка);

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

Способ №2: Работа с источником данных (Рекомендуемый)

Более правильным подходом является использование исходной таблицы значений (или выборки), из которой вы берете данные для отображения. Если вы уже формируете таблицу Т (содержащую номенклатуру и остатки), то при изменении строки нет нужды «выковыривать» текст из интерфейса. Нужно просто обратиться к этой таблице напрямую.

  1. Убедитесь, что таблица Т доступна в модуле формы (объявлена в переменных модуля).
  2. В процедуре ПриИзменении находите нужную строку по номенклатуре.
  3. Получайте значение из переменной, а не из ячейки формы.

Процедура ТоварыКоличествоЗаказаноПриИзменении(Элемент)
    ТекущаяСтрокаТЧ = ЭлементыФормы.Товары.ТекущиеДанные;
    Если ТекущаяСтрокаТЧ <> Неопределено Тогда
        // Ищем остаток в нашей таблице Т, а не в визуальной колонке
        НайденнаяСтрока = Т.Найти(ТекущаяСтрокаТЧ.Номенклатура, "Номенклатура");
        Если НайденнаяСтрока <> Неопределено Тогда
            ДоступныйОстаток = НайденнаяСтрока.Остаток1;
            // Теперь можно выполнять проверку
            Если ТекущаяСтрокаТЧ.Количество > ДоступныйОстаток Тогда
                Предупреждение("Недостаточно товара на складе!");
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Лучшие практики и архитектурные советы

Разберем, почему второй способ предпочтительнее:

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

← На главную