Установить текущую строку таблицы формы 1с управляемые формы
Табличное поле предоставляет свойства ТекущиеДанные и ТекущаяСтрока . Отличие между этими свойствами состоит в том, что свойство ТекущиеДанные содержит значения считанных данных текущей строки табличного поля, а свойство ТекущаяСтрока содержит значение, идентифицирующее строку.
Следует отметить, что свойство ТекущиеДанные содержит коллекцию значений текущей строки, соответствующую коллекции колонок отображаемого динамического списка, при этом если нужного поля нет в текущих данных, то его можно добавить в коллекцию полей списка используя метод Добавить() коллекции колонок списка.
Свойство ТекущиеДанные предназначено для получения значений колонок текущей строки, а свойство ТекущаяСтрока для получения и установки текущей строки табличного поля.
Следует понимать, что для объектных данных (Справочник, Документ и т.д.) в качестве значения свойства ТекущаяСтрока используется ссылка на объект базы данных. Соответственно при обращении к свойствам этого значения будет выполняться считывание объекта базы данных.
Типичной ошибкой является обращение к данным строки с использованием свойства ТекущаяСтрока . В этом случае будет выполняться считывание данных объекта из базы данных, что может существенно снизить производительность работы табличного поля. Например, приведенный ниже фрагмент текста программы является неэффективным:
Рекомендуется для обращения к данным объекта использовать свойство ТекущиеДанные . Правильный фрагмент приведен ниже:
Если есть идентификатор текущей строки (т.е. свойство ТекущаяСтрока ), можно получить ТекущиеДанные . И наоборот:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
На управляемой форме лежит элемент Таблица, связанный с реквизитом типа Динамический список, также на форме множество различных флажков и полей для установки отбора. Есть поле типа Переключатель (4 положения), который определяет тип и состав документов, участвующих в запросе.
При переключении Переключателя запрос отрабатывает с новыми условиями и данные в Таблице обновляются. В обработчике ПриАктивизацииСтроки запоминаю в переменной последний подсвеченный (текущий) документ в Таблице.
Вопрос - как мне установить (попытаться установить) текущей строку динамического списка при переключении Переключателя в то положение, где предыдущая ссылка на документ сохранена в переменной?
Для табличной части (на обработке баловался) можем применить метод НайтиСтроки :
Для элемента типа ДеревоЗначений использовал метод ПолучитьЭлементы() :
А как поступить с динамическим списком что-то не понимаю. Методов и нет.
Хотя при открытии формы мы можем передать в качестве параметра ТекущаяСтрока в форму нужную ссылку, а как быть, если форма уже открыта, изменился только запрос и собственно сам состав документов динамического списка?
Флажок Восстанавливать ТекущуюСтроку тоже не спасает. Он только при открытии формы отрабатывает. При переключении Переключателя пытается сделать текущей ту строку, которая была до этого текущей по порядку.
Текущая строка - это идентификатор строки в наборе данных. Зачем присваивать старый идентификатор, если сам набор данных уже изменен?
(3) foxey, а разве ТекущаяСтрока - это не ссылка на элемент справочника/документ? Только что попробовал - работает (если для динамического списка указана "Основная таблица")
(4) У меня нет справочника. У меня сложная выборка из документов разного типа.
ТекущаяСтрока содержит идентификатор строки из набора данных (т.е. просто число). А вот в реквизите ТекущиеДанные можно накопать поля, которые возвращает запрос.
Чтобы спозиционироваться на визуальной таблице в нужную строку, надо от этой строки в наборе данных через ПолучитьИдентификатор() получить число и присвоить его параметру ТекущаяСтрока. А как поступить с димнамическим списком, я теряюсь.
(5) foxey, Если логика работы не предполагает дублирования документов в списке, то можно попробовать "обходным путем": создать журнал документов, включить в него нужные документы, указать его в качестве "основной таблицы" динамического списка. Тогда ТекущаяСтрока будет ссылкой на документ.
Как решить "в лоб" - пока ничего на ум не приходит.
Может быть сначала найти в списке эту строку, получить её, затем и подсветить? Найти по каким-то ключевым параметрам и запоминать тоже ключевые параметры.
(6)Вот в этом и вопрос - как её найти! У меня есть ссылка на документ, который был текущей строкой. Надо только найти его. Искать надо в динамическом списке. А методов там не вижу подходящих. Их там парочка на всех.
ДинамическийСписок (DynamicList)
Свойства:
АвтоматическоеСохранениеПользовательскихНастроек (AutoSaveUserSettings)
Группировка (Group)
ДинамическоеСчитываниеДанных (DynamicDataRead)
КлючТекущихПользовательскихНастроек (CurrentUserSettingsKey)
КомпоновщикНастроек (SettingsComposer)
ОсновнаяТаблица (MainTable)
Отбор (Filter)
Параметры (Parameters)
Порядок (Order)
ПроизвольныйЗапрос (CustomQuery)
ТекстЗапроса (QueryText)
УсловноеОформление (ConditionalAppearance)
ПолучитьОбязательноеИспользование (GetRequiredUse)
УстановитьОбязательноеИспользование (SetRequiredUse)
Динамический список предоставляет разработчику возможность описать в форме запрос практически произвольного вида, указать условное оформление данных, порядок сортировки, отборы и группировки данных.
Ограничения: в запросах нельзя использовать объединения.
Тонкий клиент, веб-клиент, сервер, толстый клиент, мобильное приложение(клиент), мобильное приложение(сервер).
Может использоваться в реквизитах управляемой формы.
ТекущиеДанные — свойство таблицы формы, предоставляющее доступ к данным текущей строки. Оно может быть представлено тремя типами данных (в зависимости от источника таблицы формы): ДанныеФормыСтруктура, ДанныеФормыЭлементКоллекции, ДанныеФормыЭлементДерева. По сути, в каждом из этих случаев, текущие данные 1с представляют из себя структуру текущей строки таблицы формы.
Вся информация, представленная в статье, относится только к управляемому приложению.
Так как свойство относится к элементу формы (таблице), данные получаются именно из него, а не из источника. Из этого следует несколько особенностей свойства ТекущиеДанные:
- Доступно только на клиенте. Его нельзя передавать и использовать на сервере. Поэтому правильно будет получить значения нужных полей в клиентской процедуре и передать их в серверную, при необходимости.
- Содержит данные реквизитов добавленных на форму, а также данные реквизитов с установленным флагом Использовать всегда. Остальные реквизиты отсутствуют в коллекции.
Как видно на картинке, в текущих данных представлены реквизиты Номенклатура и Сумма, добавленные в таблицу и реквизит Количество с установленным флагом Использовать всегда. - В случае, если таблица формы пустая или у нее нет активизированной строки, свойство ТекущиеДанные будет содержать значение Неопределено. Поэтому, перед использованием свойства, имеет смысл делать проверку. Но только в тех случаях, когда таблица действительно может быть пустой или не активизированной. Например событие ПриАктивизацииСтроки вызывается и для пустой таблицы. А вот событие ПриИзменении колонки таблицы, может вызываться только при наличии активизированной строки. Поэтому в проверке не будет смысла.
- При помощи свойства ТекущиеДанные можно не только читать, но и изменять информацию. Исключение — таблица формы, источником которой является динамический список. В этом случае изменение текущих данных, не приведет к изменению строки таблицы.
Варианты получения свойства Текущие данные 1С
В общем случае к свойству ТекущиеДанные можно обратиться через элемент формы к которому оно относится.
Но при обращении к текущим данным из обработчика события таблицы формы, можно воспользоваться параметром Элемент. В нем уже содержится таблица формы. В этом случае обращение к текущим данным будет выглядеть следующим образом:
Такое обращение к текущим данным не получится реализовать в обработчиках событий колонок таблицы формы. Так как в параметр Элемент там передается ПолеФормы, относящееся к колонке.
Управляемая форма 1С 8.2 – работа с таблицей на форме (управление текущей строкой, перемещение и удаление элементов)
Очередная статья посвящена программной работе с таблицей управляемой формы, отображающей реквизит формы типа ДанныеФормыКоллекция. Казалось бы, такая элементарная задача как установка текущей строки, имеет далеко не тривиальное решение.
Задача: реализовать две команды КурсорВверх и КурсорВниз, которые соответственно перемещают ТекущуюСтроку(Курсор) на предыдущую(следующую) строку.
Исходные данные: управляемая форма, ТЗОбъект — реквизит формы типа ТаблицаЗначений(конечно же правильней говорить о типе который моделирует Таблицу значений, а именно ДанныеФормыКоллекция), которая отображается на форме при помощи элемента формы ТЗОбъект типа Таблица(Не путать с одноименным реквизитом формы!). Предполагается, что ДанныеФормыКоллекция содержит некоторые данные, внесенные вручную или программно. Добавляем пару команд и пишем код, реализующей нужные действия, комментарии я дам ниже.
Теперь давайте разберемся что здесь к чему. Во первых следует уяснить, что ДанныеФормыКоллекция и Таблица формы это два совершенно разных объекта. Первый содержит данные, а второй является контейнером для их отображения. Элементы.ТЗОбъект.ТекущиеДанные предоставляет доступ к данным текущей строки и имеет тип ДанныеФормыЭлементКоллекции, он доступен только для чтения. С помощью метода Индекс(Элементы.ТЗОбъект.ТекущиеДанные) мы получаем индекс текущего элемента коллекции, далее осуществляем проверку выхода за границы коллекции. После чего с помощью метода ПолучитьИдентификатор() получаем идентификатор следующего(предыдущего) элемента коллекции и присваиваем его свойству Таблицы формы ТекущаяСтрока, которое как раз и содержит идентификатор текущей строки таблицы(на которую установлен курсор). Вот такая нетривиальная связь между вышеупомянутыми объектами.
Реализуем ещё несколько полезных команд: удаление текущего элемента, перемещение текущего элемента вверх(вниз). Несмотря на то, что эти команды являются стандартными(для объекта Таблица) и поддерживаются на уровне самой платформы, их альтернативная ПРОГРАММНАЯ реализация в некоторых случаях может быть очень полезна.
Если публикация помогла Вам справится с проблемой, решить задачу или расширить свои знания - поддержите автора.
Любая таблица значений состоит из колонок, каждая из которых имеет свой тип и уникальное название, а также из строк. Если таблица значений размещена на управляемой форме в виде элемента Таблица, то колонки создаются изначально на этапе разработки, а строки пользователь может создать самостоятельно, нажав на кнопку «Добавить» в командной панели этой таблицы.
Также пользователь может удалять строки или перемещать. Но, гораздо интереснее программная работа со строками таблицы значений.
Программное добавление строк таблицы значений в 1С
В платформе 1С 8.2 — 8.3 разработчик имеет возможность добавлять строки таблицы значений непосредственно с помощью языка разработки, работая в конфигураторе 1С.
Для того чтобы создать новую строку таблицы значений, используется метод Добавить, данный метод не имеет параметров и является функцией.
Новая строка таблицы значений создается следующим образом:
НоваяСтрока = ФИО.Добавить();
Как видите, с помощью метода Добавить мы создали переменную НоваяСтрока, тип значения которой Строка таблицы значений. Но, просто создать строку мало, нам еще необходимо записать в нее определенные данные. Как получить доступ к колонкам данной строки?
Осуществить это можно двумя способами:
НоваяСтрока.Фамилия = «Иванов»;
НоваяСтрока[1] = «Иван»;
В первом способе мы получаем доступ к колонке как к свойству через точку, во втором — используя оператор квадратные скобки и указывая в них номер индекса колонки. Я предпочитаю первый способ, так как он делает код гораздо лучше читаемым и наглядным.
Допустим, у нас есть некоторая таблица значений ФИО с колонками Фамилия, Имя, Отчество, ФИО и ДатаРождения, то добавить новую строку этой таблицы и заполнить колонки этой строки можно следующим образом.
НоваяСтрока = ФИО . Добавить ();
НоваяСтрока . Фамилия = «Иванов» ;
НоваяСтрока [ 1 ] = «Иван» ;
НоваяСтрока . Отчество = «Петрович» ;
НоваяСтрока . ДатаРождения = ‘19800209’ ;
НоваяСтрока . ФИО = НоваяСтрока . Фамилия + » » +
Лев ( НоваяСтрока . Имя , 1 ) + «.» +
Лев ( НоваяСтрока . Отчество , 1 ) + «.» ;
С помощью метода Добавить мы создаем строку, которая вставляется в конец таблицы значений. Для того чтобы поместить строку в нужное место таблицы значений, необходимо использовать метод Вставить. Параметром данного метода является индекс, на который вставляется данная строка.
Добавим с помощью этого метода еще одну строку в таблицу ФИО. И поставим ее на первое место.
НоваяСтрока = ФИО . Вставить ( 0 );
НоваяСтрока . Фамилия = «Петров» ;
НоваяСтрока . Имя = «Игорь» ;
НоваяСтрока . Отчество = «Андреевич» ;
НоваяСтрока . ФИО = НоваяСтрока . Фамилия + » » + Лев ( НоваяСтрока . Имя , 1 ) + «.» + Лев ( НоваяСтрока . Отчество , 1 ) + «.» ;
НоваяСтрока . ДатаРождения = ‘19850909’ ;
Программный обход строк таблицы значений в 1С
Узнаем как обходить сроки таблицы. Это можно осуществлять с помощью операторов цикла Для каждого…Цикл и Для…Цикл.
Оператор цикла Для каждого…Цикл.
Для Каждого Стр из ФИО цикл
Сообщить ( Стр . ФИО + «, дата рождения » +
Формат ( Стр . ДатаРождения , «ДЛФ = ДД» ));
КонецЦикла;
С помощью этого оператора мы обходим все строки таблицы значений. Переменная Стр принимает значения каждой строки таблицы в порядке обхода. Тип данной переменной — Строка таблицы значений, поэтому мы можем спокойно обращаться к колонкам данной строки, используя точку или квадратные скобки.
Оператор цикла Для…Цикл.
Для н = 0 по ФИО . Количество () — 1 цикл
Сообщить ( ФИО [ н ]. ФИО + «, дата рождения » +
Формат ( ФИО [ н ]. ДатаРождения , «ДЛФ = ДД» ));
КонецЦикла;
В этом цикле нам необходимо получить индексы всех строк, для этого мы осуществляем обход, начиная с нуля и заканчивая значением, которое возвращает метод Количество за минусом единицы.
Когда мы используем квадратные скобки применительно к таблице значений (например, ФИО[н]), то результатом данной операции является строка таблицы с соответствующим индексом.
Индекс строки таблицы значений
Каждая строка имеет свой уникальный индекс. Все индексы идут по порядку и начинаются с 0. Для того, чтобы узнать индекс нужно строки необходимо применить метод Индекс таблицы значений, где в качестве параметра указать нужную строк.
Для Каждого Стр из ФИО цикл
Сообщить ( Стр . ФИО + «, дата рождения » +
Формат ( Стр . ДатаРождения , «ДЛФ = ДД» ));
Инд = ФИО . Индекс ( Стр )
КонецЦикла;
В этом коде в переменную Инд будет записываться индекс строки при каждой итерации цикла.
Программное удаление строк таблицы значений
Для программного удаление определенной строки таблицы значений нужно использовать метод Удалить этой таблицы. В качестве параметра указывается или индекс нужной строки или сама строка.
ФИО . Удалить ( 0 )
У новичков основные сложности возникают, когда нужно удалить несколько строк из таблицы значений. Если делать обход таблицы значений циклом, то данное удаление пройдет не совсем корректно. Я в этом случае поступаю так: сохраняю нужные строки в массиве, а потом обхожу этот массив циклом и уже в нем их все удаляю. Получается примерно так:
МассивДляУдаления = Новый Массив ;
Для Каждого Стр из ФИО цикл
Если тогда //какое-то условие
МассивДляУдаления . Добавить ( Стр );
КонецЕсли
КонецЦикла;
Для Каждого СтрМассива из МассивДляУдаления Цикл
ФИО . Удалить ( стрМассива )
КонецЦикла
Более подробно о работе с таблицами значений и другими интересными объектами языка программирования в 1С читайте в моей книге «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
Читайте также: