Как получить данные текущей строки табличной части и прочитать реквизиты объекта в событии ПриИзменении в 1С?

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

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

Почему параметр Элемент не возвращает данные строки

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

Кроме того, если мы передаем ссылочный тип данных (например, СправочникСсылка.Сотрудники) на сторону клиента, то доступной остается только сама ссылка (и ее строковое представление). Обратиться через точку к реквизитам справочника на клиенте нельзя, так как данные объекта физически находятся в базе данных на сервере.

Шаг 1. Получение данных текущей строки без полного обхода таблицы

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

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


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

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

Шаг 2. Оптимальное чтение реквизитов на сервере

Для чтения реквизитов ссылочного типа необходимо выполнить серверный вызов. Наиболее производительным решением является использование директивы компиляции &НаСервереБезКонтекста. В этом случае на сервер передаются только явно указанные параметры, без сериализации всех данных и реквизитов формы, что существенно снижает сетевой трафик и нагрузку на сервер.

Посмотрим на пример серверной функции:


&НаСервереБезКонтекста
Функция ПолучитьСтатусРабочегоНаСервере(Знач СотрудникСсылка)
    
    // Чтение реквизита через обращение к ссылке
    Возврат СотрудникСсылка.Статус;
    
КонецФункции

Если требуется получить несколько реквизитов или минимизировать чтение лишних данных из базы, рекомендуется использовать обращение через запрос или стандартные механизмы БСП (функция ОбщегоНазначения.ЗначениеРеквизитаОбъекта()), так как прямое обращение через точку к реквизиту ссылки считывает весь объект в оперативную память сервера.

Альтернативные события формы для валидации данных

Событие ПриИзменении наступает уже после того, как значение было выбрано и записано в данные формы. У него нет стандартного параметра Отказ, позволяющего отменить выбор. Если требуется более строгий контроль ввода, разберем альтернативные подходы:

  1. Событие «ОбработкаВыбора» элемента формы: вызывается в момент выбора значения из формы выбора или выпадающего списка до его помещения в строку. Имеет параметр Отказ, что позволяет прервать выбор некорректного значения.
  2. Событие таблицы «ПередОкончаниемРедактирования»: срабатывает при попытке пользователя зафиксировать строку (перейти на другую строку или нажать Enter). Содержит параметры Отказ и НоваяСтрока. Если строка не удовлетворяет условиям, установка Отказ = Истина не позволяет завершить редактирование.
  3. Параметры и связи параметров выбора: если необходимо запретить выбор определенных элементов, настройте свойства Параметры выбора (ChoiceParameters) или Связи параметров выбора (ChoiceParameterLinks) непосредственно в свойствах реквизита или элемента формы. Это превентивно скроет неподходящие элементы из списка выбора.
  4. Контроль в модуле объекта: проверки на форме защищают только от ошибок ручного ввода. Окончательную валидацию соответствия строк документа бизнес-правилам всегда следует дублировать в событиях ПередЗаписью или ОбработкаПроведения модуля объекта.
← На главную