Как получить значение текущей строки и колонок динамического списка в 1С:Предприятие 8.3?

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

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

Разница между свойствами «ТекущаяСтрока» и «ТекущиеДанные»

Проанализируем, как платформа 1С возвращает информацию о текущем позиционировании в элементе формы:

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

Условия доступности колонок на клиенте и флаг «Использовать всегда»

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

  1. Колонка выведена в пользовательский интерфейс в составе элементов таблицы формы.
  2. Поле является ключевым для указанной основной таблицы (например, поле Ссылка).
  3. Для поля в настройках динамического списка (на вкладке «Настройка списка» в конфигураторе) установлен флаг Использовать всегда. Если вам требуется колонка для программной обработки на клиенте, но вы не хотите выводить ее пользователю, обязательно включите этот флаг.

Реализация обработчика «ПриАктивизацииСтроки» с проверками

Рассмотрим типовой сценарий: при смене строки в динамическом списке номенклатуры необходимо запросить остатки на складах и вывести их в подчиненную таблицу формы.

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

Посмотрим на пример правильной клиент-серверной реализации:


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

&НаСервере
Процедура ПолучитьОстаткиПоТекущейПозиции(СсылкаНоменклатура)
    
    // Проверяем корректность ссылки (например, что это не группа номенклатуры)
    Если Не ЗначениеЗаполнено(СсылкаНоменклатура) Тогда
        Возврат;
    КонецЕсли;
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |	ТоварыНаСкладахОстатки.Склад КАК Склад,
        |	ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК ВНаличии,
        |	ЕСТЬNULL(ТоварыНаСкладахОстатки.КОтгрузкеОстаток, 0) КАК КОтгрузке,
        |	ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура
        |ИЗ
        |	РегистрНакопления.ТоварыНаСкладах.Остатки(
        |			,
        |			Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстатки";
        
    Запрос.УстановитьПараметр("Номенклатура", СсылкаНоменклатура);
    
    ТбзРезультат = Запрос.Выполнить().Выгрузить();
    
    // Важно: имена колонок в запросе должны строго совпадать с колонками реквизита формы ТЗОстатки
    ЗначениеВРеквизитФормы(ТбзРезультат, "ТЗОстатки");
    
КонецПроцедуры

Типичные ошибки при работе со связанными данными

Разберем распространенные проблемы, с которыми сталкиваются разработчики:

  1. Несоответствие структуры колонок в методе ЗначениеВРеквизитФормы: Если имена колонок выгружаемой таблицы значений отличаются от структуры реквизита формы (типа ТаблицаЗначений), платформа может завершить работу с ошибкой или зависнуть. Все псевдонимы полей в запросе (через оператор КАК) должны полностью совпадать с именами колонок целевого реквизита.
  2. Зависание интерфейса из-за частых серверных вызовов: Событие ПриАктивизацииСтроки срабатывает не только при щелчке мыши, но и при навигации стрелками клавиатуры, смене фокуса и обновлении отборов. Прямой контекстный вызов сервера на каждое движение курсора создает высокую нагрузку. Для оптимизации рекомендуется использовать вызов через ПодключитьОбработчикОжидания с задержкой в 0.2–0.5 секунды либо организовать отображение связанных данных через второй динамический список с параметром.
← На главную