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