Имя: Пароль:
1C
1С v8
Внешняя обработка для заполнения объектов в УФ
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    Возможность разрабатывать дополнительные обработки по заполнению объектов, которые не требуют записи объектов в информационную базу. После выполнения такой обработки результат ее работы сразу виден в форме объекта.