Создание подключаемой обработки табличной части с диалогом запроса параметров заполнения (управляемые формы)

Обработки - Обработка документов

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

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

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

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

Приступим к реализации:

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

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

В реквизиты обработки добавим реквизит Документ, который пригодится при отладке и будет применяться при зарегистрированном использовании. Этот вариант дает некоторую универсальность. Можно тестировать, отлаживать и, если все в порядке, сразу подключить пользователю.

Теперь нам нужна основная форма, которая будет видна только при запуске через Файл - Открыть, но её процедуры нужны в любом случае. А так-же нужна вторая форма, назовем её "ЗапросПараметров", она станет служить для указания параметров пользователем.

В модуль основной формы пишем:

Перем ОбъектЗаполнения Экспорт;

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

Эта часть перебрасывает нас на форму параметров, так что переходим на неё. Добавляем требуемые реквизиты, и пару команд (Выполнить и Отмена):

В процедуре кнопки Выполнить напишите:

 
    Парам = Новый Структура("ОбъектДляЗаполнения,Номенклатура,ИзменениеЦены");
    Парам.ОбъектДляЗаполнения = ВладелецФормы;
    Парам.Номенклатура = ЭтаФорма.Номенклатура;
    Парам.ИзменениеЦены = ЭтаФорма.ИзменениеЦены;
    ЭтаФорма.Закрыть(Парам);

Для кнопки Отмена:

    ЭтаФорма.Закрыть(Неопределено);

Теперь эта форма поместит указанные реквизиты в структуру и передаст её в основную форму.

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

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

Остался маленьких штрих. Основная форма осталась пустой, но так не должно быть. Поместите на неё созданный ранее реквизит Документ и добавьте кнопку ВыполнитьОбработку, при нажатии на которую выполнится одна команда:

    ВыполнитьКоманду("", Объект.Документ);

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

Для работы использовалась платформа 1С:Предприятие 8.3 (8.3.11.3034).

Метод использовался при создании обработки Замена финансирования определенных видов расчета в документе Начисление зарплаты и взносов (ЗИКГУ 3.1)

Скачать файлы

Наименование Файл Версия Размер
Пример - Создание подключаемой обработки табличной части с диалогом запроса параметров заполнения (Управляемые формы):
.epf 10,39Kb
03.05.18
5
.epf 10,39Kb 5 Скачать

См. также

Комментарии
1. Алексей Лапицкий (Lapitskiy) 870 12.05.18 03:50 Сейчас в теме
Суть прекрасно описано.
Но есть одно НО.
Документ записывается после обработки, а это методически не верное решение.
А причина - в изменении данных "Объект", а правильно изменять данные "Форма".
Тогда всё измененное, сразу отобразится на форме, без костылей типа "Записать", "Прочитать".
2. Николай Ф (Mirage78) 26 12.05.18 10:18 Сейчас в теме
(1) К сожалению, пришлось задействовать этот грубый вариант "Объект/Записать/Прочитать", и причина в ограничениях платформы. Смысл обработки именно в обработке, а не в заполнении табличной части с нуля. Изменять существующую табличную часть формы проблематично ...
Оставьте свое сообщение