Четверг, 28.03.2024. 20:53 | RSS
 Приветствуем Вас, Гость! Регистрация | Вход с параметрами
Меню сайта
Категории каталога
Обзоры оборудования [44]
Обзоры различного оборудования, побывавшего в руках автора сайта: ноутбуки, винчестеры, мониторы, материнские платы, видеокарты и др.
Тестирование [7]
Отчасти перекликается с обзорами оборудования, однако здесь сделан упор именно на тестирование в каких-либо бенчмарках
Практика апгрейда [9]
Статьи, посвященные вопросам апгрейда компьютера. Примеры конфигураций, оценка стоимости
Решение проблем [5]
Рассматриваются различные мелкие и не очень проблемы и их возможные варианты решения
Обзоры софта [6]
Обзоры программного обеспечения: антивирусы, браузеры, утилиты и др.
Игры [37]
Обзоры игр, советы по прохождению
Программирование, 1С [13]
Освещаются вопросы по программированию, в немалой степени - на платформе 1С: Предприятия
Цифровое фото, видео [5]
Выделенный раздел, посвященным цифровым фотоаппаратам и видеокамерам
Вход на сайт
Параллельные проекты
Друзья сайта
Статистика

Околокомпьютерный сайт Дмитрия Косолапова
Главная » Статьи » Программирование, 1С

Позиционирование табличного поля в 1С: Предприятии 8

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

Итак, набросок кода:

Code
ТабличноеПоле1 = Запрос.Выполнить().Выгрузить(); // здесь ТабличноеПоле1 - реквизит формы, соответствующий элементу управления, тип - таблица значений
СтруктураПоиска = Новый Структура();
СтруктураПоиска.Вставить("Код",КодСтроки); // допустим, надо спозиционироваться на строке, колонка "Код" которой равна значению переменной КодСтроки

// Ищем нужную строку и позиционируемся
Строки = ТабличноеПоле1.НайтиСтроки(СтруктураПоиска);
Если Строки.Количество()>0 Тогда
  ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока = Строки[0];
КонецЕсли;

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

Code
ТекСтр = ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока;
ТабличноеПоле1 = Запрос.Выполнить().Выгрузить();
ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока = ТекСтр;

Вот такая вот проблемка, над которой, как ни странно, мы довольно долго ломали голову. Надеюсь, эта заметка кому-нибудь пригодится smile

Разное по программированию в 1С на форуме

Категория: Программирование, 1С | Добавил: Vetkhy (26.03.2009) | Автор: Дмитрий Косолапов | Просмотров: 13723

Метки: позиционирование, , табличное поле

Всего комментариев: 7
0  
1 Дмитрий   (29.09.2010 12:30) [Материал]
Не работает у меня, в форме стоит Табличное поле с типом значения Регистр сведений и я не могу после обновления вернуть курсор на текущее поле.
ВремИнд=ЭлементыФормы.ТаблицаТоваров.ТекущаяСтрока;
ТаблицаТоваров.Отбор.Весы.Установить(ЭлементыФормы.ТаблицаВесов.ТекущаяСтрока);
ТаблицаТоваров.Прочитать();
ЭлементыФормы.ТаблицаТоваров.ТекущаяСтрока=ВремИнд;

Ошибка при установке значения атрибута контекста (ТекущаяСтрока)


0  
2 Vetkhy   (29.09.2010 18:05) [Материал]
Для начала - строка, которую мы запомнили в первой строке (ВремИнд), остается после применения отбора?

0  
3 Дмитрий   (05.10.2010 07:45) [Материал]
ВремИнд это текущая строка таблицы (ТаблицаТоваров), на которой стоит курсор, мне надо после обновления вернуть его на место.

0  
4 Дмитрий   (05.10.2010 07:46) [Материал]
ВремИнд, канешна остается

0  
5 Vetkhy   (05.10.2010 08:49) [Материал]
Странно все. Значит по первому варианту надо пробовать (через структуру поиска).

0  
6 Дмитрий   (05.10.2010 14:09) [Материал]
Я не знаю правильно ли это, но вот так стало работать:

Врем=ЭлементыФормы.ТаблицаТоваров.ТекущиеДанные;
Если Врем<>Неопределено Тогда
Врем=ТаблицаТоваров.Индекс(Врем);
Иначе
Врем=0;
КонецЕсли;
ТаблицаТоваров.Отбор.Весы.Установить(ЭлементыФормы.ТаблицаВесов.ТекущаяСтрока);
ТаблицаТоваров.Прочитать();
КолВо=ТаблицаТоваров.Количество()-1;
Если КолВо>0 Тогда
ЭлементыФормы.ТаблицаТоваров.ТекущаяСтрока=ТаблицаТоваров.Получить(?(Врем>КолВо,К олВо,Врем));
КонецЕсли;


0  
7 Vetkhy   (05.10.2010 14:14) [Материал]
Code
Врем=ЭлементыФормы.ТаблицаТоваров.ТекущиеДанные;
Если Врем<>Неопределено Тогда
    Врем=ТаблицаТоваров.Индекс(Врем);
Иначе
    Врем=0;
КонецЕсли;
ТаблицаТоваров.Отбор.Весы.Установить(ЭлементыФормы.ТаблицаВесов.ТекущаяСтрока);
ТаблицаТоваров.Прочитать();
КолВо=ТаблицаТоваров.Количество()-1;
Если КолВо>0 Тогда
    ЭлементыФормы.ТаблицаТоваров.ТекущаяСтрока=ТаблицаТоваров.Получить(?(Врем>КолВ о ,КолВо,Врем));
КонецЕсли;

Некоторое недоумение вызывает последняя конструкция - ?(Врем>КолВо,КолВо,Врем) wacko , а так, в принципе, по индексу тоже неплохая идея.

P.S. Хотя, в принципе, если до изменения весов в этой таблице было больше строк, тогда да. Сначала немного тупанул.


Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Сайт управляется системой uCozДмитрий Косолапов © 2007-2024