Управляемая форма 1С 8.2 – работа с таблицей на форме (управление текущей строкой, перемещение и удаление элементов)
Очередная статья посвящена программной работе с таблицей управляемой формы, отображающей реквизит формы типа ДанныеФормыКоллекция. Казалось бы, такая элементарная задача как установка текущей строки, имеет далеко не тривиальное решение.
Задача: реализовать две команды КурсорВверх и КурсорВниз, которые соответственно перемещают ТекущуюСтроку(Курсор) на предыдущую(следующую) строку.
Исходные данные: управляемая форма, ТЗОбъект — реквизит формы типа ТаблицаЗначений(конечно же правильней говорить о типе который моделирует Таблицу значений, а именно ДанныеФормыКоллекция), которая отображается на форме при помощи элемента формы ТЗОбъект типа Таблица(Не путать с одноименным реквизитом формы!). Предполагается, что ДанныеФормыКоллекция содержит некоторые данные, внесенные вручную или программно. Добавляем пару команд и пишем код, реализующей нужные действия, комментарии я дам ниже.
&НаКлиенте Процедура КурсорВниз(Команда) ИндексТекущегоЭлементаКоллекции = ТЗОбъект.Индекс( Элементы.ТЗОбъект.ТекущиеДанные); КоличествоЭлементовКоллекции = ТЗОбъект.Количество(); Если ИндексТекущегоЭлементаКоллекции < КоличествоЭлементовКоллекции - 1 Тогда Элементы.ТЗОбъект.ТекущаяСтрока = ТЗОбъект[ИндексТекущегоЭлементаКоллекции+1].ПолучитьИдентификатор(); Иначе Сообщить("Нельзя!"); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура КурсорВверх(Команда) ИндексТекущегоЭлементаКоллекции = ТЗОбъект.Индекс( Элементы.ТЗОбъект.ТекущиеДанные); Если ИндексТекущегоЭлементаКоллекции > 0 Тогда Элементы.ТЗОбъект.ТекущаяСтрока = ТЗОбъект[ИндексТекущегоЭлементаКоллекции-1].ПолучитьИдентификатор(); Иначе Сообщить("Нельзя!"); КонецЕсли; КонецПроцедуры
Теперь давайте разберемся что здесь к чему. Во первых следует уяснить, что ДанныеФормыКоллекция и Таблица формы это два совершенно разных объекта. Первый содержит данные, а второй является контейнером для их отображения. Элементы.ТЗОбъект.ТекущиеДанные предоставляет доступ к данным текущей строки и имеет тип ДанныеФормыЭлементКоллекции, он доступен только для чтения. С помощью метода Индекс(Элементы.ТЗОбъект.ТекущиеДанные) мы получаем индекс текущего элемента коллекции, далее осуществляем проверку выхода за границы коллекции. После чего с помощью метода ПолучитьИдентификатор() получаем идентификатор следующего(предыдущего) элемента коллекции и присваиваем его свойству Таблицы формы ТекущаяСтрока, которое как раз и содержит идентификатор текущей строки таблицы(на которую установлен курсор). Вот такая нетривиальная связь между вышеупомянутыми объектами.
Реализуем ещё несколько полезных команд: удаление текущего элемента, перемещение текущего элемента вверх(вниз). Несмотря на то, что эти команды являются стандартными(для объекта Таблица) и поддерживаются на уровне самой платформы, их альтернативная ПРОГРАММНАЯ реализация в некоторых случаях может быть очень полезна.
&НаКлиенте Процедура ЭлементВниз(Команда) ИндексТекущегоЭлементаКоллекции = ТЗОбъект.Индекс( Элементы.ТЗОбъект.ТекущиеДанные); КоличествоЭлементовКоллекции = ТЗОбъект.Количество(); Если ИндексТекущегоЭлементаКоллекции < КоличествоЭлементовКоллекции - 1 Тогда ТЗОбъект.Сдвинуть(ИндексТекущегоЭлементаКоллекции, 1); Иначе Сообщить("Нельзя!"); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ЭлементВверх(Команда) ИндексТекущегоЭлементаКоллекции = ТЗОбъект.Индекс( Элементы.ТЗОбъект.ТекущиеДанные); Если ИндексТекущегоЭлементаКоллекции > 0 Тогда ТЗОбъект.Сдвинуть(ИндексТекущегоЭлементаКоллекции, -1); Иначе Сообщить("Нельзя!"); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура УдалитьЭлемент(Команда) ИдентификаторСтроки = Элементы.ТЗОбъект.ТекущаяСтрока; Если ИдентификаторСтроки <> Неопределено Тогда ЭлементКоллекции = ТЗОбъект.НайтиПоИдентификатору(ИдентификаторСтроки); ИндексЭлементаКоллекции = ТЗОбъект.Индекс(ЭлементКоллекции); ТЗОбъект.Удалить(ИндексЭлементаКоллекции); КонецЕсли; КонецПроцедуры
Если публикация помогла Вам справится с проблемой, решить задачу или расширить свои знания - поддержите автора.
Комментарии:
Чтобы оставить комментарий, Вы должны войти в систему.
спасибо, очень полезная статья)
Для меня пока это магия. Но она работает 🙂
Спасибо, статья хорошая.
А как установить признак модифицированности формы (ЭтаФорма.Модифицированность = Истина;) но при изменении порядка строк стандартными командами формы?
Такого предопределенного события (ПриИзмененииПорядкаСтрок, например) для таблицы формы я не нашел.
Уже сам разобрался.
Событие ПриИзменении срабатывает при изменении порядка строк.
Всем привет! У меня вопрос, как в дереве формы, у которого колонки создаются динамически установить стандартные настройки, только программно?
Не работает такая конструкция на 8.3
ТЗОбъект.Индекс(Элементы.ТЗОбъект.ТекущиеДанные);
Ругается, говорит что нет у реквизита формы ТЗОбъект свойства Индекс.
Есть только НайтиПоИдентификатору и ВыбратьЭлементы.
Код на 100% верен. На 8.3 — выполняется
Спасибо. Но странный глюк словил. По кнопке вверх перемещается по строкам вверх. Но вот по кнопке вниз ..он берет и саму строку перемещает вниз. О_о
Код же одинаковый не считая условий.
Не подскажете в чем может быть причина?
Все разобрался. На кнопке была стандартная таблицы команда вниз а не мой код.
Спасибо, очень пригодилось!
Феноменально. Спасибо. Очень помогло!
Подскажите пожалуйста, а почему +1 ?
Если в пару раз строчку добавлю и удалю, а потом добавлю новую — у неё не будет ли индекс уже +3 ?