Работая с формами в конфигурациях 1С Предприятие, разработчики часто сталкиваются с необходимостью обработки только тех записей, которые пользователь выделил мышью или сочетанием клавиш. Стандартные методы перебора всех строк не подходят, так как это нарушает логику взаимодействия с пользователем. Правильное получение выделенных данных требует понимания структуры формы и методов объекта ТабличноеПоле.
В этой статье мы разберем два основных подхода: использование метода Выгрузить для получения списка строк и применение метода Срез для формирования новой таблицы значений. Выбор конкретного способа зависит от того, планируете ли вы изменять данные или просто передавать их в другую функцию.
Понимание структуры табличной части на форме
Прежде всего, необходимо осознавать разницу между табличной частью в памяти и её представлением на экране. Элемент формы, отображающий список, является объектом типа ТабличноеПоле. Именно через этот объект происходит взаимодействие с выделением. Для доступа к нему в коде управляемой формы используется свойство Элементы.
Выделенные строки не хранятся в самой таблице значений напрямую. Они представляют собой массив индексов или идентификаторов строк, которые текущий пользователь пометил как активные. Если вы попытаетесь обратиться к этим данным без проверки на наличие выделения, ваш код может выдать ошибку или выполнить действие над пустым набором данных.
Важно учитывать, что в режиме управляемых форм выделение может быть множественным. Пользователь имеет возможность выбрать несколько несвязанных строк, удерживая клавишу Ctrl, или диапазон строк с помощью Shift. Ваша логика должна корректно обрабатывать оба сценария, не ограничиваясь только первой строкой списка.
Всегда проверяйте, не пуст ли массив выделенных строк, перед началом цикла обработки. Это позволит избежать лишних вызовов сервера и ускорит работу интерфейса.
⚠️ Внимание: В некоторых старых версиях платформы или при специфических настройках свойства
РежимСписка, метод получения выделения может работать иначе. Всегда тестируйте код на актуальной версии платформы 1С.
Метод Выгрузить: получение массива строк
Наиболее распространенный способ работы с выделением — это вызов метода Выгрузить у объекта табличного поля. Этот метод возвращает массив, содержащий ссылки на объекты строк табличной части. Такой подход удобен, если вам нужно передать эти строки в общую модульную процедуру или выполнить над ними специфические действия.
Для реализации этого метода сначала необходимо получить ссылку на сам элемент формы. Затем вызывается метод с параметром, указывающим, что нужны только выделенные строки. Результатом будет массив, который можно перебрать в цикле Для Каждого.
// Получаем элемент формы
ТабПоле = Элементы.ТабличнаяЧасть;
// Выгружаем выделенные строки в массив
ВыделенныеСтроки = ТабПоле.Выгрузить(Истина);
// Проверяем, есть ли выделение
Если ВыделенныеСтроки.Количество() > 0 Тогда
Для Каждого СтрокаТЗ Из ВыделенныеСтроки Цикл
// Обработка строки
КонецЦикла;
КонецЕсли;
Преимущество данного метода заключается в том, что вы работаете напрямую с объектами строк, не создавая лишних копий данных в памяти. Это особенно актуально при работе с большими объемами информации, где создание новой таблицы значений может занять лишние ресурсы.
Метод Срез: создание новой таблицы значений
Альтернативный подход предполагает использование метода Срез. В отличие от Выгрузить, этот метод возвращает новый объект типа ТаблицаЗначений, содержащий только те строки, которые были выделены пользователем. Это удобно, если дальнейшая логика требует работы именно с таблицей, а не с массивом.
Синтаксис вызова аналогичен, но результат требует иного подхода к обработке. Вы получаете полноценную таблицу, которую можно сортировать, фильтровать или выгружать в файл без дополнительных преобразований. Это упрощает код в тех случаях, когда нужно передать пакет данных на сервер для записи в регистры.
- 📊 Метод создает копию данных, что увеличивает потребление оперативной памяти.
- 🔄 Удобно для передачи данных в серверные методы, принимающие
ТаблицаЗначений. - 🛠 Позволяет сразу применить дополнительные фильтры к результату среза.
При использовании среза важно помнить о производительности. Если табличная часть содержит тысячи строк, а выделено всего несколько, создание новой таблицы все равно потребует вычислительных ресурсов. Однако для стандартных задач документооборота этот метод является наиболее читаемым и понятным для поддержки.
Оптимизация метода Срез
Если вы используете Срез часто в циклах, рассмотрите возможность кэширования результата или использования временных хранилищ для снижения нагрузки на сервер приложений.
Обработка выделения на клиенте и сервере
Критически важным аспектом является контекст выполнения кода. Получение выделенных строк возможно только на клиенте, так как именно там формируется визуальное представление формы. Попытка вызвать метод Выгрузить или Срез в серверном контексте приведет к ошибке выполнения.
Если ваша бизнес-логика должна выполняться на сервере, вам необходимо организовать передачу данных. Стандартный паттерн выглядит так: клиентская процедура собирает выделенные строки, формирует из них таблицу значений или массив структур, и передает этот параметр в серверную процедуру через модификатор &НаКлиенте и &НаСервере.
Для передачи часто используется конструкция с экспортом параметров. Клиентская часть собирает данные, а серверная часть их обрабатывает и записывает изменения. Это обеспечивает целостность данных и корректную работу с блокировками в многопользовательском режиме.
| Контекст | Доступ к Элементы | Возможность изменения БД | Скорость выполнения |
|---|---|---|---|
| Клиент | Есть | Нет | Высокая |
| Сервер | Нет | Да | Зависит от сети |
| Толстый клиент | Есть | Да | Средняя |
Никогда не пытайтесь получить выделение напрямую на сервере. Всегда используйте промежуточную клиентскую процедуру для сбора данных.
Типичные ошибки при работе с выделением
Одной из самых частых ошибок является предположение, что выделенная строка всегда одна. В реальных сценариях пользователи часто выделяют группы товаров или документов. Код, рассчитанный на одну строку, проигнорирует остальные данные, что приведет к потере информации и недовольству пользователей.
Другая распространенная проблема — работа с удаленными строками. Если пользователь выделил строку, а затем удалил её (пометил на удаление) до нажатия кнопки обработки, ваша программа может попытаться обратиться к несуществующему объекту. Необходимо добавлять проверки на пометку удаления перед началом обработки.
⚠️ Внимание: Интерфейс платформы 1С может меняться в новых релизах. Если вы обнаружите, что стандартные методы не работают, сверьтесь с синтаксис-помощником вашей конкретной версии конфигурации.
Также стоит обратить внимание на тип данных в колонках. При выгрузке строк типы данных сохраняются, но при некорректном приведении типов в цикле обработки могут возникать ошибки сравнения. Используйте строгую типизацию или функции преобразования типов для избежания сбоев.
- ❌ Игнорирование множественного выбора пользователем.
- ❌ Отсутствие проверки на помеченные на удаление строки.
- ❌ Попытка вызвать серверный код без передачи параметров.
Пример полной реализации кнопки обработки
Рассмотрим практический пример создания кнопки "Обработать выделенные" в документе. Код будет размещен в модуле формы. Сначала мы определим процедуру на клиенте, которая соберет данные, а затем вызовем серверный метод для записи изменений.
В данном примере мы используем метод Срез для наглядности передачи таблицы. Это позволяет серверному методу быть универсальным и принимать стандартный тип данных, не зависящий от конкретного элемента формы.
&НаКлиенте
Процедура КнопкаОбработатьВыделенные(Команда)
// Получаем таблицу выделенных строк
ВыделенныеДанные = Элементы.Товары.Срез(Истина);
Если ВыделенныеДанные.Количество() = 0 Тогда
СообщениеПользователю("Не выбраны строки для обработки");
Возврат;
КонецЕсли;
// Вызываем серверную процедуру
ОбработатьСтрокиНаСервере(ВыделенныеДанные);
КонецПроцедуры
&НаСервере
Процедура ОбработатьСтрокиНаСервере(ТаблицаСтрок)
Для Каждого Строка Из ТаблицаСтрок Цикл
// Логика изменения данных
Строка.Количество = Строка.Количество * 1.1;
КонецЦикла;
КонецПроцедуры
Такая структура кода является эталонной для платформы 1С Предприятие 8. Она разделяет ответственность: клиент отвечает за взаимодействие с пользователем и получение контекста, а сервер — за целостность данных и бизнес-логику.
☑️ Проверка перед внедрением
FAQ: Часто задаваемые вопросы
Можно ли получить выделенные строки в управляемой форме без использования кода?
Нет, стандартными средствами интерфейса без написания кода обработчика команды это сделать невозможно. Требуется написание процедуры в модуле формы.
В чем разница между Выгрузить(Истина) и Выгрузить(Ложь)?
Параметр Истина указывает методу возвращать только выделенные строки. Параметр Ложь (или отсутствие параметра) возвращает все строки табличной части, независимо от выделения.
Что делать, если метод Срез возвращает пустую таблицу?
Это означает, что пользователь не выделил ни одной строки. Необходимо добавить проверку свойства Количество() перед дальнейшей работой с таблицей.
Работает ли этот метод в веб-клиенте и тонком клиенте одинаково?
Да, методы объекта ТабличноеПоле унифицированы и работают идентично во всех разновидностях клиентов платформы 1С.