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