Как реализовать подтверждение действия пользователем во внешней обработке заполнения объекта в 1С?

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

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

Анализ проблемы и выбор архитектуры

Рассмотрим ситуацию: вы создаете внешнюю обработку с видом ЗаполнениеОбъекта. Если в регистрационных данных (функция СведенияОВнешнейОбработке) указать тип использования ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода(), код будет выполняться на стороне сервера в модуле объекта. На сервере использование функций Вопрос() или Предупреждение() технически невозможно и приведет к ошибке.

Чтобы задать вопрос пользователю, нам необходимо перенести логику на клиентскую сторону. Проанализируем шаги, которые для этого потребуются:

  1. Изменение способа вызова команды на Вызов клиентского метода.
  2. Создание основной формы внешней обработки.
  3. Реализация экспортной процедуры в модуле формы.
  4. Использование асинхронных вызовов для работы с интерфейсом.

Шаг 1. Регистрация команды в модуле объекта

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


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

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

Шаг 2. Реализация логики в модуле формы

Создадим основную форму обработки. В модуле этой формы нам необходимо прописать процедуру ВыполнитьКоманду. Именно её будет искать БСП при нажатии пользователем кнопки в документе. Проанализируем шаблон для обработок заполнения:


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

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

Шаг 3. Обработка ответа пользователя

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


&НаКлиенте
Процедура ПослеВопросаОЗаполнении(Результат, ДополнительныеПараметры) Экспорт
    
    Если Результат = КодВозвратаДиалога.Да Тогда
        
        // Получаем форму документа, из которого была вызвана обработка
        ФормаДокумента = ВладелецФормы;
        
        // Проверим, что форма открыта и это действительно форма нужного нам объекта
        Если ФормаДокумента <> Неопределено Тогда
            
            // Выполняем очистку и заполнение через контекст формы
            // Мы можем напрямую обращаться к данным формы: ФормаДокумента.Объект...
            ЗаполнитьДанныеНаСервере(ФормаДокумента.Объект);
            
            // Сообщаем пользователю об успехе
            ПоказатьОповещениеПользователя("Готово", , "Табличная часть перезаполнена");
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Оптимизация работы с данными

Проанализируем ситуацию, когда заполнение требует сложных расчетов. В этом случае логику заполнения лучше вынести в &НаСервере процедуру модуля формы или модуля объекта. При работе на клиенте через ВладелецФормы мы имеем доступ к структуре Объект, которая содержит все реквизиты и табличные части документа, отображаемые на экране.

Важные моменты при разработке:

Резюме

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

← На главную