Управляемая форма 1С 8.2 – работа с таблицей на форме (управление текущей строкой, перемещение и удаление элементов)

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

Задача: реализовать две команды КурсорВверх и КурсорВниз, которые соответственно перемещают ТекущуюСтроку(Курсор) на предыдущую(следующую) строку.

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

&НаКлиенте
Процедура КурсорВниз(Команда)
  ИндексТекущегоЭлементаКоллекции = ТЗОбъект.Индекс(
    Элементы.ТЗОбъект.ТекущиеДанные);
  КоличествоЭлементовКоллекции = ТЗОбъект.Количество();
  Если ИндексТекущегоЭлементаКоллекции < КоличествоЭлементовКоллекции - 1 Тогда
    Элементы.ТЗОбъект.ТекущаяСтрока =
      ТЗОбъект[ИндексТекущегоЭлементаКоллекции+1].ПолучитьИдентификатор();
  Иначе
    Сообщить("Нельзя!");
  КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура КурсорВверх(Команда)
  ИндексТекущегоЭлементаКоллекции = ТЗОбъект.Индекс(
    Элементы.ТЗОбъект.ТекущиеДанные);
  Если ИндексТекущегоЭлементаКоллекции > 0  Тогда
    Элементы.ТЗОбъект.ТекущаяСтрока =
       ТЗОбъект[ИндексТекущегоЭлементаКоллекции-1].ПолучитьИдентификатор();
  Иначе
    Сообщить("Нельзя!");
  КонецЕсли;
КонецПроцедуры

Теперь давайте разберемся что здесь к чему. Во первых следует уяснить, что ДанныеФормыКоллекция и Таблица формы это два совершенно разных объекта. Первый содержит данные, а второй является контейнером для их отображения. Элементы.ТЗОбъект.ТекущиеДанные предоставляет доступ к данным текущей строки и имеет тип ДанныеФормыЭлементКоллекции, он доступен только для чтения. С помощью метода Индекс(Элементы.ТЗОбъект.ТекущиеДанные) мы получаем индекс текущего элемента коллекции, далее осуществляем проверку выхода за границы коллекции. После чего с помощью метода ПолучитьИдентификатор() получаем идентификатор следующего(предыдущего) элемента коллекции и присваиваем его свойству Таблицы формы ТекущаяСтрока, которое как раз и содержит идентификатор текущей строки таблицы(на которую установлен курсор). Вот такая нетривиальная связь между вышеупомянутыми объектами.
Реализуем ещё несколько полезных команд: удаление текущего элемента, перемещение текущего элемента вверх(вниз). Несмотря на то, что эти команды являются стандартными(для объекта Таблица) и поддерживаются на уровне самой платформы, их альтернативная ПРОГРАММНАЯ реализация в некоторых случаях может быть очень полезна.

&НаКлиенте
Процедура ЭлементВниз(Команда)
  ИндексТекущегоЭлементаКоллекции = ТЗОбъект.Индекс(
    Элементы.ТЗОбъект.ТекущиеДанные);
  КоличествоЭлементовКоллекции = ТЗОбъект.Количество();
  Если ИндексТекущегоЭлементаКоллекции < КоличествоЭлементовКоллекции - 1 Тогда
    ТЗОбъект.Сдвинуть(ИндексТекущегоЭлементаКоллекции, 1);
  Иначе
    Сообщить("Нельзя!");
  КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЭлементВверх(Команда)
  ИндексТекущегоЭлементаКоллекции = ТЗОбъект.Индекс(
    Элементы.ТЗОбъект.ТекущиеДанные);
  Если ИндексТекущегоЭлементаКоллекции > 0 Тогда
    ТЗОбъект.Сдвинуть(ИндексТекущегоЭлементаКоллекции, -1);
  Иначе
    Сообщить("Нельзя!");
  КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьЭлемент(Команда)
  ИдентификаторСтроки = Элементы.ТЗОбъект.ТекущаяСтрока;
  Если ИдентификаторСтроки <> Неопределено Тогда
    ЭлементКоллекции = ТЗОбъект.НайтиПоИдентификатору(ИдентификаторСтроки);
    ИндексЭлементаКоллекции = ТЗОбъект.Индекс(ЭлементКоллекции);
    ТЗОбъект.Удалить(ИндексЭлементаКоллекции);
  КонецЕсли;
КонецПроцедуры

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

Комментарии:

  1. Семён пишет:

    Подскажите пожалуйста, а почему +1 ?
    Если в пару раз строчку добавлю и удалю, а потом добавлю новую – у неё не будет ли индекс уже +3 ?

  2. Сергей пишет:

    Феноменально. Спасибо. Очень помогло!

  3. Павел пишет:

    Спасибо, очень пригодилось!

  4. Дмитрий пишет:

    Спасибо. Но странный глюк словил. По кнопке вверх перемещается по строкам вверх. Но вот по кнопке вниз ..он берет и саму строку перемещает вниз. О_о
    Код же одинаковый не считая условий.
    Не подскажете в чем может быть причина?

    1. Дмитрий пишет:

      Все разобрался. На кнопке была стандартная таблицы команда вниз а не мой код.

  5. Сергей пишет:

    Не работает такая конструкция на 8.3
    ТЗОбъект.Индекс(Элементы.ТЗОбъект.ТекущиеДанные);

    Ругается, говорит что нет у реквизита формы ТЗОбъект свойства Индекс.
    Есть только НайтиПоИдентификатору и ВыбратьЭлементы.

    1. Игорь пишет:

      Код на 100% верен. На 8.3 – выполняется

  6. miki пишет:

    Всем привет! У меня вопрос, как в дереве формы, у которого колонки создаются динамически установить стандартные настройки, только программно?

  7. Bas пишет:

    Спасибо, статья хорошая.

    А как установить признак модифицированности формы (ЭтаФорма.Модифицированность = Истина;) но при изменении порядка строк стандартными командами формы?
    Такого предопределенного события (ПриИзмененииПорядкаСтрок, например) для таблицы формы я не нашел.

    1. Bas пишет:

      Уже сам разобрался.
      Событие ПриИзменении срабатывает при изменении порядка строк.

  8. Александр пишет:

    Для меня пока это магия. Но она работает :)

  9. andyid пишет:

    спасибо, очень полезная статья)

Оставить комментарий