|
Внешняя обработка для заполнения объектов в УФ | ☑ | ||
---|---|---|---|---|
0
Alexey vip
05.01.13
✎
21:15
|
Требуется заполнить ТЧ документа с помощью подключенной внешней обработки в бп 3.0.
Пишу код: модуль обработки: Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = Новый Структура; МассивНазначений = Новый Массив; МассивНазначений.Добавить("Документ.ТребованиеНакладная"); ПараметрыРегистрации.Вставить("Вид", "ЗаполнениеОбъекта"); ПараметрыРегистрации.Вставить("Назначение", МассивНазначений); ПараметрыРегистрации.Вставить("Наименование", "Заполнить по спецификации номенклатуры"); ПараметрыРегистрации.Вставить("Версия", "1.0"); ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина); ПараметрыРегистрации.Вставить("Информация", "Дополнительная обработка табличной части к документу Требование-Накладная"); ТаблицаКоманд = Получить*Таб*лиц*уКоманд(); ДобавитьКоманду(ТаблицаКоманд, "Заполнить по спецификации", "Заполнить документ", "ВызовКлиентскогоМетода", Истина); ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд); Возврат ПараметрыРегистрации; КонецФункции Функция Получ*итьТа*блиц*уКоманд() Команды = Новый ТаблицаЗначений; Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево")); Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка")); Возврат Команды; КонецФункции Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "") НоваяКоманда = ТаблицаКоманд.Добавить(); НоваяКоманда.Представление = Представление; НоваяКоманда.Идентификатор = Идентификатор; НоваяКоманда.Использование = Использование; НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение; НоваяКоманда.Модификатор = Модификатор; КонецПроцедуры все стандартно, всё ок. модуль формы обработки: &НаКлиенте Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт Для каждого Элемент из ОбъектыНазначенияМассив Цикл //Зададим ключ поиска документа, из которого вызвана данная обработка, //чтобы получить ссылку на редактирумый документ в удобном виде для //функции ОткрытьФорму() КлючПоиска = Новый Структура("Ключ", Элемент); //Но нам не надо открывать новую форму (окно) для изменяемого документа, а //Нам надо все изменения показать в уже открытых у клиента окнах Окна = ПолучитьОкна(); Для каждого Окно из Окна Цикл //Окно изменяемого документа будет точно не основным, а вспомогательным, поэтому //сразу пропускаем основное окно, а далее идем на не очень хороший способ поиска открытого окна //изменяемого документа. Мы просто переберем все окна, а в заголовке, которых будет встречаться //Наименование, номер и дата нужного документа - будем изменять Если НЕ Окно.Основное И Найти(Окно.Заголовок, Элемент) Тогда //Передадим ключ поиска (можно сказать ссылку на объект) и данные о найденном открытом окне //в функцию ОткрытьФорму() //Код находится в цикле на тот случай, если открытых окон изменяемого документа больше одного Форма = ОткрытьФорму("Документ.ТребованиеНакладная.Форма.ФормаДокумента",КлючПоиска,,,Окно); СпецификацияНоменклатуры = ОткрытьФормуМодально("Справочник.СпецификацииНоменклатуры.ФормаВыбора"); Если СпецификацияНоменклатуры = Неопределено Тогда Возврат; КонецЕсли; //Далее мы получаем объект только, что повторно открытой формы и помещаем её в переменную //В объекте содержатся все реквизиты (элементы) формы НовыйОбъект = Форма.Объект; //Мы помещаем объект формы в переменную, //так как должны передать её в процедуру на сервере, //где нельзя изменять объект формы, зато можно править переменную содержащую его ЗаполнитьОбъект(НовыйОбъект, СпецификацияНоменклатуры); //После выполнения процедуры на сервере мы получаем изменную переменную НовыйОбъект, //которую необходимо передать в уже полученную нами форму КопироватьДанныеФормы(НовыйОбъект, Форма.Объект); Режим = РежимДиалогаВопрос.ДаНет; Текст = "2. |Продолжить?"; Ответ = Вопрос(Текст, Режим, 0); Если Ответ = КодВозвратаДиалога.Да Тогда //Возврат; КонецЕсли; Заполнили = Истина; КонецЕсли; КонецЦикла; КонецЦикла; КонецПроцедуры &НаСервере Функция ЗаполнитьОбъект(НовыйОбъект, СпецификацияНоменклатуры) Если ТипЗнч(НовыйОбъект.Ссылка) = Тип("ДокументСсылка.ТребованиеНакладная") Тогда Для каждого СтрокаТЧ из СпецификацияНоменклатуры.ИсходныеКомплектующие Цикл НоваяСтрока = НовыйОбъект.Материалы.Добавить(); НоваяСтрока.Номенклатура = СтрокаТЧ.Номенклатура; НоваяСтрока.Количество = СтрокаТЧ.Количество; СчетаУчета = БухгалтерскийУчетПереопределяемый.ПолучитьСчетаУчетаНоменклатуры(НовыйОбъект.Организация, СтрокаТЧ.Номенклатура, НовыйОбъект.Склад); НоваяСтрока.Счет = СчетаУчета.СчетУчета; КонецЦикла; КонецЕсли; КонецФункции теперь собственно проблема. Когда доходит до вопроса, то я вижу, что ТЧ заполнилась, но как только обработка закончит свое выполнение, всё сбрасывается. Кто подскажет, почему так? Может вообще по другому нужно как-то подключать? |
|||
1
Alexey vip
05.01.13
✎
21:15
|
звездочки поставил, так как там какой-то фильтр сработал.
|
|||
2
Alexey vip
07.01.13
✎
14:30
|
Если кому-то интересно то вот ответ
http://forum.infostart.ru/forum26/topic74015/ |
|||
3
banco
07.01.13
✎
15:45
|
жди БСП 2.1.3 Возможность разрабатывать дополнительные обработки по заполнению объектов, которые не требуют записи объектов в информационную базу. После выполнения такой обработки результат ее работы сразу виден в форме объекта.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |