Как программно выделить строки табличной части в управляемой форме 1С

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Торговля и дистрибуция
← На главную

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

Проблема пустой коллекции данных при получении формы

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

Ошибка часто кроется в неправильном использовании метода ПолучитьФорму. Если не передать уникальный идентификатор конкретного документа, платформа создаст «чистую» форму для нового объекта. Чтобы форма открылась с данными конкретного документа, необходимо использовать структуру Параметры с ключом Ключ.

Рассмотрим правильный способ инициализации формы:


// СсылкаНаДокумент — это ссылка на существующий Заказ клиента
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);
Форма = ПолучитьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента", ПараметрыФормы);

// Теперь свойство Форма.Объект.Товары будет содержать данные из базы

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

Механизм программного выделения строк

Перейдем к основной задаче: как заставить интерфейс считать, что все строки таблицы выбраны? В управляемых формах за это отвечает свойство элемента формы ВыделенныеСтроки. Важно понимать, что это не просто массив индексов, а специальный объект КоллекцияИдентификаторовСтрокТаблицыФормы.

Важный нюанс: в эту коллекцию добавляются не номера строк (0, 1, 2...) и не сами строки, а их уникальные идентификаторы. Получить их можно с помощью метода ПолучитьИдентификатор(), который доступен для строк данных формы.

Разберем по шагам алгоритм выделения всех строк:

  1. Очищаем текущую коллекцию выделенных строк, чтобы сбросить предыдущий выбор пользователя.
  2. Обходим циклом табличную часть документа (реквизит Объект.Товары).
  3. Для каждой строки получаем её идентификатор и добавляем в коллекцию ВыделенныеСтроки элемента формы.

Посмотрим на программную реализацию этого алгоритма:


&НаКлиенте
Процедура ВыделитьВсеСтрокиТовары(Форма)
    // Обращаемся к элементу управления "Товары" на форме
    ТаблицаТовары = Форма.Элементы.Товары;
    
    // Очищаем текущее выделение
    ТаблицаТовары.ВыделенныеСтроки.Очистить();
    
    // Проходим по всем строкам данных документа
    Для каждого СтрокаТЧ Из Форма.Объект.Товары Цикл
        // Добавляем идентификатор строки в коллекцию выделенных
        Идентификатор = СтрокаТЧ.ПолучитьИдентификатор();
        ТаблицаТовары.ВыделенныеСтроки.Добавить(Идентификатор);
    КонецЦикла;
КонецПроцедуры

Синхронизация данных через ЗначениеВДанныеФормы

Иногда возникают ситуации, когда документ был программно изменен на сервере, и эти изменения нужно быстро «протолкнуть» в открытую форму. Для этого используется метод ЗначениеВДанныеФормы. Это позволяет избежать пустоты в табличных частях, если форма была инициализирована специфическим образом.

Рассмотрим пример, когда мы получаем объект документа в коде и связываем его с данными формы:


// Пример выполнения на сервере внутри контекста формы
ЗаказОбъект = СсылкаНаОбъект.ПолучитьОбъект();
// Производим какие-то действия с объектом...
// ...
// Синхронизируем объект с данными формы (реквизитом "Объект")
ЗначениеВДанныеФормы(ЗаказОбъект, Объект);

После выполнения этой команды табличная часть на форме обновится, и мы сможем приступить к выделению строк на клиенте.

Комплексный пример: Заполнение обеспечения в типовых решениях

В конфигурациях 1С:ERP или Управление торговлей 11 часто требуется вызвать команду «Заполнить обеспечение». Эта команда критически зависит от того, какие строки выделены в таблице. Выясним, как собрать все знания воедино для решения этой задачи.

Проанализируем пример кода, который подготавливает данные и вызывает типовой механизм:


&НаКлиенте
Процедура ЗапуститьЗаполнениеОбеспечения()
    // 1. Получаем форму (если не открыта) или используем Текущую
    ПараметрыФормы = Новый Структура("Ключ", Объект.Ссылка);
    ФормаДок = ПолучитьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента", ПараметрыФормы);
    
    // 2. Выделяем все строки программно
    ЭлементыТовары = ФормаДок.Элементы.Товары;
    ЭлементыТовары.ВыделенныеСтроки.Очистить();
    
    Для каждого Стр Из ФормаДок.Объект.Товары Цикл
        ЭлементыТовары.ВыделенныеСтроки.Добавить(Стр.ПолучитьИдентификатор());
    КонецЦикла;

    // 3. Установка текущей строки (важно для некоторых проверок в типовом коде)
    Если ФормаДок.Объект.Товары.Количество() > 0 Тогда
        ЭлементыТовары.ТекущаяСтрока = ФормаДок.Объект.Товары[0].ПолучитьИдентификатор();
    КонецЕсли;

    // 4. Подготовка параметров для вызова типовой команды
    ПереченьВариантов = Новый Массив;
    ПереченьВариантов.Добавить(ПредопределенноеЗначение("Перечисление.ВариантыОбеспечения.СоСклада"));
    
    РезультатЗаполнения = Новый Структура;
    РезультатЗаполнения.Вставить("ПереченьВариантов", ПереченьВариантов);
    РезультатЗаполнения.Вставить("ЗаполнятьЦелымиУпаковками", Ложь);
    
    // 5. Вызов экспортной процедуры формы
    ФормаДок.ЗаполнитьОбеспечениеВУстановленномПорядке(РезультатЗаполнения);
КонецПроцедуры

Обратите внимание: программная установка ТекущаяСтрока также полезна, так как многие стандартные обработчики 1С сначала проверяют именно её, а уже затем коллекцию ВыделенныеСтроки.

Особенности и ограничения

При работе с выделением строк следует учитывать несколько технических ограничений платформы:

Таким образом, мы рассмотрели полный цикл решения задачи: от корректного открытия формы с данными до манипуляции объектами интерфейса. Использование методов ПолучитьИдентификатор() и правильная передача Ключа при открытии формы гарантируют стабильную работу вашей внешней обработки.

← На главную