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