При разработке внешних обработок часто возникает задача автоматизации действий пользователя непосредственно в открытой форме документа. Одной из таких задач является программное выделение строк в табличной части для последующего выполнения команд, которые работают с коллекцией ВыделенныеСтроки. В этой статье мы подробно разберем, как правильно получить форму существующего документа, инициализировать её данные и программно управлять выделением строк.
Рассмотрим типичную ситуацию: разработчик пытается получить форму существующего документа из внешней обработки, чтобы вызвать в ней процедуру обеспечения (например, в документе Заказ клиента). Однако при обращении к Объект.Товары выясняется, что табличная часть пуста, хотя в базе данных документ заполнен. Проанализируем причину этой ошибки.
Ошибка часто кроется в неправильном использовании метода ПолучитьФорму. Если не передать уникальный идентификатор конкретного документа, платформа создаст «чистую» форму для нового объекта. Чтобы форма открылась с данными конкретного документа, необходимо использовать структуру Параметры с ключом Ключ.
Рассмотрим правильный способ инициализации формы:
// СсылкаНаДокумент — это ссылка на существующий Заказ клиента
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);
Форма = ПолучитьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента", ПараметрыФормы);
// Теперь свойство Форма.Объект.Товары будет содержать данные из базы
Если же форма уже открыта на экране и нам нужно работать именно с ней, рекомендуется использовать поиск среди уже открытых окон или передавать контекст формы в обработку. Однако метод с параметром Ключ является наиболее надежным для программного управления.
Перейдем к основной задаче: как заставить интерфейс считать, что все строки таблицы выбраны? В управляемых формах за это отвечает свойство элемента формы ВыделенныеСтроки. Важно понимать, что это не просто массив индексов, а специальный объект КоллекцияИдентификаторовСтрокТаблицыФормы.
Важный нюанс: в эту коллекцию добавляются не номера строк (0, 1, 2...) и не сами строки, а их уникальные идентификаторы. Получить их можно с помощью метода ПолучитьИдентификатор(), который доступен для строк данных формы.
Разберем по шагам алгоритм выделения всех строк:
Объект.Товары).ВыделенныеСтроки элемента формы.Посмотрим на программную реализацию этого алгоритма:
&НаКлиенте
Процедура ВыделитьВсеСтрокиТовары(Форма)
// Обращаемся к элементу управления "Товары" на форме
ТаблицаТовары = Форма.Элементы.Товары;
// Очищаем текущее выделение
ТаблицаТовары.ВыделенныеСтроки.Очистить();
// Проходим по всем строкам данных документа
Для каждого СтрокаТЧ Из Форма.Объект.Товары Цикл
// Добавляем идентификатор строки в коллекцию выделенных
Идентификатор = СтрокаТЧ.ПолучитьИдентификатор();
ТаблицаТовары.ВыделенныеСтроки.Добавить(Идентификатор);
КонецЦикла;
КонецПроцедуры
Иногда возникают ситуации, когда документ был программно изменен на сервере, и эти изменения нужно быстро «протолкнуть» в открытую форму. Для этого используется метод ЗначениеВДанныеФормы. Это позволяет избежать пустоты в табличных частях, если форма была инициализирована специфическим образом.
Рассмотрим пример, когда мы получаем объект документа в коде и связываем его с данными формы:
// Пример выполнения на сервере внутри контекста формы
ЗаказОбъект = СсылкаНаОбъект.ПолучитьОбъект();
// Производим какие-то действия с объектом...
// ...
// Синхронизируем объект с данными формы (реквизитом "Объект")
ЗначениеВДанныеФормы(ЗаказОбъект, Объект);
После выполнения этой команды табличная часть на форме обновится, и мы сможем приступить к выделению строк на клиенте.
В конфигурациях 1С:ERP или Управление торговлей 11 часто требуется вызвать команду «Заполнить обеспечение». Эта команда критически зависит от того, какие строки выделены в таблице. Выясним, как собрать все знания воедино для решения этой задачи.
Проанализируем пример кода, который подготавливает данные и вызывает типовой механизм:
&НаКлиенте
Процедура ЗапуститьЗаполнениеОбеспечения()
// 1. Получаем форму (если не открыта) или используем Текущую
ПараметрыФормы = Новый Структура("Ключ", Объект.Ссылка);
ФормаДок = ПолучитьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента", ПараметрыФормы);
// 2. Выделяем все строки программно
ЭлементыТовары = ФормаДок.Элементы.Товары;
ЭлементыТовары.ВыделенныеСтроки.Очистить();
Для каждого Стр Из ФормаДок.Объект.Товары Цикл
ЭлементыТовары.ВыделенныеСтроки.Добавить(Стр.ПолучитьИдентификатор());
КонецЦикла;
// 3. Установка текущей строки (важно для некоторых проверок в типовом коде)
Если ФормаДок.Объект.Товары.Количество() > 0 Тогда
ЭлементыТовары.ТекущаяСтрока = ФормаДок.Объект.Товары[0].ПолучитьИдентификатор();
КонецЕсли;
// 4. Подготовка параметров для вызова типовой команды
ПереченьВариантов = Новый Массив;
ПереченьВариантов.Добавить(ПредопределенноеЗначение("Перечисление.ВариантыОбеспечения.СоСклада"));
РезультатЗаполнения = Новый Структура;
РезультатЗаполнения.Вставить("ПереченьВариантов", ПереченьВариантов);
РезультатЗаполнения.Вставить("ЗаполнятьЦелымиУпаковками", Ложь);
// 5. Вызов экспортной процедуры формы
ФормаДок.ЗаполнитьОбеспечениеВУстановленномПорядке(РезультатЗаполнения);
КонецПроцедуры
Обратите внимание: программная установка ТекущаяСтрока также полезна, так как многие стандартные обработчики 1С сначала проверяют именно её, а уже затем коллекцию ВыделенныеСтроки.
При работе с выделением строк следует учитывать несколько технических ограничений платформы:
ВыделенныеСтроки доступно только в клиентских процедурах. Попытка изменить его на сервере приведет к ошибке выполнения.Таким образом, мы рассмотрели полный цикл решения задачи: от корректного открытия формы с данными до манипуляции объектами интерфейса. Использование методов ПолучитьИдентификатор() и правильная передача Ключа при открытии формы гарантируют стабильную работу вашей внешней обработки.