Как во внешней обработке заполнения (БСП 3.0) открыть форму настроек на клиенте?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При разработке внешних подключаемых обработок заполнения для конфигураций на базе Библиотеки Стандартных Подсистем (БСП 3.0), таких как 1С:Бухгалтерия 3.0, разработчики часто сталкиваются с архитектурным ограничением. Стандартная схема заполнения предполагает выполнение серверного метода ВыполнитьКоманду. Но что делать, если перед непосредственным заполнением документа необходимо показать пользователю диалоговое окно или форму настроек для выбора параметров заполнения? На сервере открыть форму невозможно, так как там отсутствует клиентский контекст.

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

---

Шаг 1. Регистрация обработки в БСП с типом команды «Открытие формы»

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

В функции СведенияОВнешнейОбработке мы должны явно указать тип команды как ТипКомандыОткрытиеФормы. Рассмотрим пример кода регистрации:


Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.0.0.0");
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
    ПараметрыРегистрации.Версия = "1.0";
    
    // Указываем документы, для которых предназначена обработка
    ПараметрыРегистрации.Назначение.Добавить("Документ.ПоступлениеТоваровУслуг");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);

    // Добавляем команду
    Команда = ПараметрыРегистрации.Команды.Добавить();
    Команда.Представление = "Заполнить по сложным правилам...";
    Команда.Идентификатор = "ОткрытьНастройкиЗаполнения";
    
    // КРИТИЧЕСКИ ВАЖНО: Указываем тип команды - Открытие формы
    Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
    Команда.ПоказыватьОповещение = Ложь;

    Возврат ПараметрыРегистрации;

КонецФункции

При такой регистрации БСП добавит команду в подменю заполнения документа, но при ее нажатии пользователем система не будет запускать серверный метод, а автоматически найдет основную форму вашей обработки и откроет ее на клиенте.

---

Шаг 2. Разработка формы настроек и получение контекста документа

После того как форма нашей обработки открылась, перед нами встает ключевая задача: как получить доступ к документу, из которого была вызвана обработка, особенно если документ еще новый и не записан в базу данных?

БСП при открытии формы передает в нее параметры. В серверной процедуре ПриСозданииНаСервере формы обработки мы можем прочитать параметр ОбъектыНазначения. Это массив ссылок на документы. Однако для новых (незаписанных) документов этот массив будет пуст. Чтобы решить эту проблему универсально, мы задействуем механизм работы с владельцем формы на клиенте.

На клиенте свойство формы ВладелецФормы указывает на форму документа-источника. Через него мы можем напрямую считывать данные формы документа и изменять их. Ниже рассмотрим наиболее производительный и архитектурно правильный паттерн работы.

Важное правило: Избегайте обхода и заполнения табличных частей документа непосредственно на клиенте в цикле. Это приводит к существенному замедлению работы интерфейса. Правильный подход — передать контекст документа на сервер формы обработки, выполнить там заполнение объектным методом и вернуть измененные данные обратно.

Рассмотрим пример реализации кода в модуле формы нашей внешней обработки:


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

&НаСервере
Процедура ЗаполнитьДокументНаСервере(ДанныеФормыДокумента)
    
    // Преобразуем ДанныеФормыСтруктура в полноценный прикладной объект ДокументОбъект
    ДокументОбъект = ДанныеФормыВЗначение(ДанныеФормыДокумента, Тип("ДокументОбъект.ПоступлениеТоваровУслуг"));
    
    // Пример заполнения реквизитов на сервере на основе настроек на форме обработки
    // На форме обработки у нас есть реквизит "КоэффициентЗаполнения" и "ВариантРаспределения"
    
    Для Каждого СтрокаТЧ Из ДокументОбъект.Товары Цикл
        
        // Наша бизнес-логика заполнения
        СтрокаТЧ.Количество = СтрокаТЧ.Количество * Объект.КоэффициентЗаполнения;
        
        Если Объект.ВариантРаспределения = "Опт" Тогда
            СтрокаТЧ.Цена = СтрокаТЧ.Цена * 0.9; // Скидка 10% для опта
        КонецЕсли;
        
        // Пересчитываем суммы стандартным методом документа
        СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена;
        
    КонецЦикла;
    
    // Обратно конвертируем измененный объект в структуру данных формы
    ЗначениеВДанныеФормы(ДокументОбъект, ДанныеФормыДокумента);
    
КонецПроцедуры

---

Шаг 3. Настройка модального режима (блокировка окна владельца)

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

Для реализации этого поведения выполните следующие настройки:

  1. Откройте внешнюю обработку в конфигураторе.
  2. Перейдите в свойства вашей основной формы настроек.
  3. Найдите свойство Режим открытия окна (Window opening mode).
  4. Установите для него значение Блокировать окно владельца (Lock owner window).

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

---

Шаг 4. Эффективные методы отладки внешних обработок в БСП

Отладка внешних обработок заполнения часто вызывает трудности у начинающих разработчиков. БСП подключает обработку из справочника «Дополнительные отчеты и обработки» путем загрузки ее двоичного файла во временное хранилище и регистрации под уникальным именем в безопасном режиме. Из-за этого точки останова, установленные в вашем исходном файле .epf на диске, просто не срабатывают.

Рассмотрим три надежных способа обойти эту проблему и настроить полноценную отладку.

Способ А. Использование штатного режима отладки БСП (Рекомендуемый)

В современных версиях БСП разработчики предусмотрели штатный механизм отладки без изменения кода конфигурации:

  1. Запустите информационную базу в режиме «1С:Предприятие» под пользователем с административными правами.
  2. Перейдите в раздел Администрирование -> Печатные формы, отчеты и обработки -> Дополнительные отчеты и обработки.
  3. Найдите вашу обработку в списке и откройте ее карточку.
  4. В верхней панели карточки (или по кнопке «Еще») найдите пункт Настройка отладки.
  5. В открывшемся окне включите признак отладки и укажите точный путь к вашему файлу .epf на локальном диске компьютера.
  6. После сохранения настроек БСП при выполнении команды заполнения будет использовать файл напрямую с диска. Откройте этот файл в Конфигураторе, установите точки останова в модуле формы или объекта, и вы сможете отлаживать код «на лету» в реальном контексте документа.

Способ Б. Временная подмена программного подключения (через расширение или код)

Если штатная настройка отладки по какой-то причине недоступна в вашей версии БСП, вы можете временно изменить код интеграции в общем модуле БСП (лучше делать это через механизм расширений, переопределив метод «Перед» или «Вместо»):

Найдите в общем модуле ДополнительныеОтчетыИОбработки функцию, отвечающую за подключение внешней обработки (например, ПодключитьВнешнююОбработку), и временно замените строку получения менеджера из временного хранилища на прямое создание из файла:


// Стандартный код БСП:
// ИмяОбработки = Менеджер.Подключить(АдресВоВременномХранилище, , БезопасныйРежим);

// Код для отладки:
ИмяОбработки = Менеджер.Создать("C:\MyDevelopments\FillProcessing.epf", Ложь);

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

Способ В. Создание вспомогательной формы-стартера внутри обработки

Для быстрой разработки логики заполнения без необходимости постоянной перерегистрации обработки в справочниках БСП, можно встроить механизм самозапуска:

  1. Создайте внутри внешней обработки вспомогательную форму и назовите ее ФормаОтладки. Сделайте ее основной формой обработки.
  2. Разместите на ней реквизит с типом ссылки на тестируемый документ (например, ДокументСсылка.ПоступлениеТоваровУслуг).
  3. Добавьте кнопку «Запустить заполнение». При ее нажатии программно открывайте форму выбранного документа, делайте ее владельцем и вызывайте вашу основную форму настроек заполнения.

Такой подход позволяет полностью автономно отлаживать сложные алгоритмы заполнения как обычную внешнюю обработку через стандартное меню Файл -> Открыть.

← На главную