Как вызвать процедуру формы из внешней обработки и обойти выделенные строки в 1С

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Вызов экспортной процедуры формы

Для того чтобы процедура, описанная в модуле формы, стала доступна «снаружи» (например, из кода внешней обработки), необходимо соблюсти два условия: добавить ключевое слово Экспорт в объявлении процедуры и правильно обратиться к экземпляру формы. Разберем этот процесс по шагам.

Во-первых, в модуле формы объекта, которую мы планируем вызывать, процедура должна выглядеть следующим образом:


Процедура МояЭкспортнаяПроцедура() Экспорт
    // Логика процедуры, например, пересчет итогов
    Сообщить("Процедура формы вызвана успешно!");
КонецПроцедуры

Во-вторых, в коде внешней обработки нам нужно получить ссылку на объект формы. Важно понимать разницу между получением новой формы и обращением к уже открытой. Если мы используем метод ПолучитьФорму(), система возвращает объект формы, через который можно вызвать процедуру. Проанализируем пример кода во внешней обработке:


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

// Если форма должна быть видна пользователю
ФормаОбъекта.Открыть();

// Вызываем экспортную процедуру через переменную формы
ФормаОбъекта.МояЭкспортнаяПроцедура();

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

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

Хотя вызов процедур формы технически возможен, хорошим тоном разработки в 1С считается вынос бизнес-логики в модуль объекта или модуль менеджера. Рассмотрим, почему это предпочтительнее. Процедуры модуля формы «живут» только пока форма открыта и загружена в память. Если логика не связана напрямую с изменением цвета кнопок или видимостью полей, лучше перенести её в модуль объекта.

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


ОбъектДок = СсылкаНаДокумент.ПолучитьОбъект();
ОбъектДок.ПроцедураВМодулеОбъекта();
ОбъектДок.Записать();

Работа с выделенными строками табличного поля

Вторая часть задачи — программная обработка строк, которые пользователь выделил мышкой в табличном поле (обычные формы). Коллекция ВыделенныеСтроки содержит массив строк, но работа с ними имеет свои особенности в зависимости от источника данных.

Рассмотрим ситуацию, когда источником данных табличного поля является Таблица Значений. Чтобы обойти все ячейки в выделенных строках и, например, пропустить первую колонку, используем вложенные циклы.

Выясним алгоритм действий:

  1. Получаем коллекцию выделенных строк из элемента управления.
  2. Запускаем цикл по строкам.
  3. Внутри каждой строки запускаем цикл по колонкам или обращаемся к данным через индекс/имя.

Посмотрим на пример реализации, который позволяет пропустить первую колонку:


Для Каждого СтрокаТЗ Из ЭлементыФормы.ТабличноеПоле1.ВыделенныеСтроки Цикл
    // Способ 1: Обход всех колонок через индекс, пропуская первую (индекс 0)
    КоличествоКолонок = ЭлементыФормы.ТабличноеПоле1.Колонки.Количество();
    
    Для К = 1 По КоличествоКолонок - 1 Цикл
        ИмяКолонки = ЭлементыФормы.ТабличноеПоле1.Колонки[К].Имя;
        ЗначениеЯчейки = СтрокаТЗ[ИмяКолонки];
        // Обработка данных
    КонецЦикла;
    
    // Способ 2: Использование счетчика в цикле "Для каждого"
    Счетчик = 0;
    Для Каждого ЭлементСтроки Из СтрокаТЗ Цикл
        Счетчик = Счетчик + 1;
        Если Счетчик = 1 Тогда
            Продолжить; // Пропускаем первую колонку
        КонецЕсли;
        // Работаем с данными ЭлементСтроки
    КонецЦикла;
КонецЦикла;

Тонкости работы с выделенными областями

Если в настройках табличного поля свойство РежимВыделения установлено в значение Ячейки (а не Строки), коллекция ВыделенныеСтроки может работать не так, как ожидается. В этом случае следует использовать коллекцию ВыделенныеОбласти. Проанализируем, как это работает:

Для повышения производительности при массовой обработке строк рекомендуется отключать обновление интерфейса. Это предотвратит «мерцание» экрана и ускорит выполнение кода:


ЭтаФорма.ОбновлениеОтображения = Ложь;
Попытка
    // Здесь ваш код обработки выделенных строк
Исключение
    ЭтаФорма.ОбновлениеОтображения = Истина;
    ВызватьИсключение;
КонецПопытки;
ЭтаФорма.ОбновлениеОтображения = Истина;

Таким образом, мы разобрали основные способы взаимодействия с формой и её данными. Использование Экспорт для процедур формы — это быстрый способ решить задачу «здесь и сейчас», но для долгосрочной поддержки конфигурации всегда старайтесь выносить общую логику в модули объектов или общие модули.

← На главную