"Для выполнения команды данные будут записаны. Продолжить?"
Сталкивались? Бывает необходимо, перед заполнением документа из внешней обработки, вызвать некий диалог с предварительными настройками, но к сожалению типовой функционал не позволяет сделать это без записи документа. А если у нас сложный документ с большим объемом данных, который долго пишется? Или мы просто не хотим записывать документ, а только посмотреть результат заполнения? В этой статье я попытаюсь решить данную задачу доработкой типовой подсистемы подсистемы "Дополнительные отчеты и обработки".
Доработку можно сделать через расширение или напрямую в конфигурацию.
1. Добавляем в ТЧ "Команды" справочника "ДополнительныеОтчетыИОбработки" новый реквизит "доп_РежимЗаписи" с типом Строка(50)
2. В общем модуле "ДополнительныеОтчетыИОбработки" вносим следующие доработки
2.1. Функция "СведенияОВнешнейОбработке".
Необходимо для таблицы команд добавить еще одну колонку "доп_РежимЗаписи"
ТаблицаКоманд.Колонки.Добавить("доп_РежимЗаписи", Новый ОписаниеТипов("Строка"));
Это позволит в дальнейшем указывать нам нужный режим записи, при вызове данной функции из обработки ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке()
2.2. Функция "ТаблицаОтчетовИОбработок"
Необходимо доработать запрос, а именно добавить новый реквизит в выборку из таблицы команд
| ПоказыватьОповещение,
//+++
| доп_РежимЗаписи,
//---
| Скрыть
2.3. Процедура "ПриОпределенииКомандЗаполненияПодключенныхКОбъекту"
Добавим дополнительное условие для отмены записи документа
Если СтрокаТаблицы.ВариантЗапуска = ЗаполнениеФормы Тогда
Команда.Обработчик = "ДополнительныеОтчетыИОбработки.ОбработчикКомандыЗаполнения";
Команда.РежимЗаписи = "НеЗаписывать";
//+++
ИначеЕсли СтрокаТаблицы.доп_РежимЗаписи = "НеЗаписывать" Тогда
Команда.Обработчик = "ДополнительныеОтчетыИОбработкиКлиент.ОбработчикКомандыЗаполнения";
Команда.РежимЗаписи = "НеЗаписывать";
//---
Иначе
Команда.Обработчик = "ДополнительныеОтчетыИОбработкиКлиент.ОбработчикКомандыЗаполнения";
Команда.РежимЗаписи = "Записывать";
КонецЕсли;
Обратите внимание как работает типовой функционал.
Если у нас вид обработки "Заполнение формы", то идет вызов команды на сервер (модуль обработки) и запись отключена.
Во всех остальных случаях режим записи - "Записывать".
Мы же добавили новое условие, что если у обработки реквизит "доп_РежимЗаписи" равен "НеЗаписывать" тогда мы устанавливаем режим записи "НеЗаписывать".
Пример вызова из самой обработки:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
...
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
//Добавляем при необходимости режим записи. Условие добавлено для обратной совместимости.
Если ПараметрыРегистрации.Команды.Колонки.Найти("доп_РежимЗаписи") <> Неопределено Тогда
Команда.доп_РежимЗаписи = "НеЗаписывать";
КонецЕсли;
...
Возврат ПараметрыРегистрации;
КонецФункции
Часть типового кода я пропустил, думаю тут нет необходимости что либо показывать. Полное описание в документации БСП или в приложенной обработке - примере.
Как происходит заполнение:
Открывается обработка. В событии "ПриОткрытии" на клиенте, нам доступен реквизит "ВладелецФормы" - владелец этой формы.
Мы выполняем какие либо промежуточные действия. Данные берем с реквизитов или объекта формы владельца.
По окончании нужного нам действия, мы заполняем данными форму владельца и закрываем при необходимости.
PS: Доработка простая, можно обойтись реализацией через расширение. Каких либо других способов обойти запись документа без доработки типовой подсистемы я не увидел.
Можно обойтись без нового реквизита, например добавить признак в реквизит "Модификатор", но все равно нужно доработать процедуру "ПриОпределенииКомандЗаполненияПодключенныхКОбъекту", чтобы учесть нужный модификатор, например:
ИначеЕсли СтрокаТаблицы.Модификатор = "НеЗаписывать" Тогда
Команда.Обработчик = "ДополнительныеОтчетыИОбработкиКлиент.ОбработчикКомандыЗаполнения";
Команда.РежимЗаписи = "НеЗаписывать";
Такой вариант проще, но только если вы не используете типовой модификатор, например для печатной формы "ПечатьMXL".
В приложенных файлах пример подключаемой обработки и расширения с данной доработкой.
Тестировалось в конфигурации 1C:ERP 2.5.7.201 (БСП 3.1.5.192).
В обработке примере прописано назначение "Документ.ЗаказКлиента".