Имя: Пароль:
1C
1С v8
УФ. Заполнение ТЧ документа из внешней обработки
, ,
0 pessok
 
20.09.12
12:24
Коллеги, не пойму. Решил таки раздуплиться с УФ и клиент-серверным взаимодействием. Решил начать с простого, казалось бы. Заполнение табличной части документа из внешней обработки.

На входе имеет следующий код:

Команда в документе:

ФормаОбработки = ПолучитьФорму("Обработка.ЗаполнитьТаблицуДокумента.Форма.Форма", , ЭтаФорма);
   
   ФормаОбработки.ОткрытьМодально();


В обработке:


&НаКлиенте
Процедура ЗаполнитьТаблицуДокумента(Команда)
   
   ЗаполнитьДокументОснование(ВладелецФормы.Объект);
   
КонецПроцедуры

&НаСервере
Функция ПолучитьДанныеЗаполнения()
   
   Результат = Неопределено;
   
   ПараметрыЗапроса = "";
   
   Если ЗначениеЗаполнено(Объект.Город) Тогда
       
       ПараметрыЗапроса = ПараметрыЗапроса + "ГДЕ Адреса.Город = &Город";
       
   КонецЕсли;
   
   Если ЗначениеЗаполнено(Объект.Сеть) Тогда
       
       ПараметрыЗапроса = ПараметрыЗапроса + ?(ЗначениеЗаполнено(ПараметрыЗапроса), " И ", "ГДЕ ") + "Адреса.Сеть = &Сеть";
       
   КонецЕсли;
   
   Запрос = Новый Запрос(
   "ВЫБРАТЬ
   |    Адреса.Город,
   |    Адреса.Сеть,
   |    Адреса.Ссылка КАК Адрес
   |ИЗ
   |    Справочник.Адреса КАК Адреса " + ПараметрыЗапроса +
   " УПОРЯДОЧИТЬ ПО
   |    Адреса.Наименование ");
   
   Запрос.УстановитьПараметр("Город", Объект.Город);
   Запрос.УстановитьПараметр("Сеть", Объект.Сеть);
   
   РезультатЗапроса = Запрос.Выполнить();
   
   //Формируем результат в ТЗ
   Если Не РезультатЗапроса.Пустой() Тогда
       
       Результат = РезультатЗапроса.Выгрузить();
       
       Результат.Колонки.Добавить("КоличествоДней");
       Результат.Колонки.Добавить("ПродолжительностьВизита");
       Результат.Колонки.Добавить("Цена");
       
       Результат.ЗаполнитьЗначения(Объект.КоличествоДней, "КоличествоДней");
       Результат.ЗаполнитьЗначения(Объект.ПродолжительностьВизита, "ПродолжительностьВизита");
       Результат.ЗаполнитьЗначения(Объект.Цена, "Цена");
       
   КонецЕсли;
   
   Возврат Результат;
КонецФункции

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


В итоге, когда до конца отрабатывает команда обработки выползает ошибка:

Нельзя изменять поле, содержащее объект данных формы

И вот не пойму, ЧЯДНТ.

Вроде на сервере меняю ДокументОбъект, по и, как мне наивно казалось, все должно было бы сработать, ан нет... Ткните пальцем, плз, куда посмотреть
1 pessok
 
20.09.12
13:58
ап
2 zladenuw
 
20.09.12
14:08
форма уф.
модуль обработки


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

   РегистрационныеДанные.Вставить("Команды", ТаблицаКоманд);
   
    = Новый Массив;
   МассивНазначений.Добавить("Документ.ЗаказКлиента");
   
   РегистрационныеДанные.Вставить("Назначение", МассивНазначений);
   
   Возврат РегистрационныеДанные;
   
КонецФункции

Функция ПолучитьТабКомд()

   Команды = Новый ТаблицаЗначений;
   Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));    
   Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
   Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
   Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
   Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
   
   Возврат Команды;

КонецФункции

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Использование, Идентификатор, ПоказыватьОповещение = Истина, Модификатор = "")
   
   НоваяКоманда = ТаблицаКоманд.Добавить();
   НоваяКоманда.Представление = Представление;
   НоваяКоманда.Использование = Использование;
   НоваяКоманда.Идентификатор = Идентификатор;
   НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
   НоваяКоманда.Модификатор = Модификатор;
   
КонецПроцедуры

модуль формы.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   
   ЗаполняемыйДокумент = Параметры.ОбъектыНазначения[0];
   
   Объект.Товары.Загрузить(ЗаполняемыйДокумент.Товары.Выгрузить());
   
КонецПроцедуры

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

&НаСервере
Процедура ПеренестиВДокументНаСервере(ДанныеФормыОбъект)
   
   ДанныеФормыОбъект.Товары.Загрузить(Объект.Товары.Выгрузить());
           
КонецПроцедуры

объект обработки товары
3 pessok
 
20.09.12
14:30
(2) спасибо, изучаю
4 pessok
 
20.09.12
14:32
а, т.е. обратным путем... из обработки по ключу получаем форму, и уже потом заполняем... блин. как-то нелогично выглядит вроде бы. однако попробую, спасибо
5 pessok
 
20.09.12
15:27
блин. что-то нифига...

&НаКлиенте
Процедура ЗаполнитьТаблицуДокумента(Команда)
   
   КлючПоиска = Новый Структура("Ключ", Параметры.СсылкаНаДокумент);
   ФормаДокумента = ПолучитьФорму("Документ.ПриложениеКонтрагента.ФормаОбъекта", КлючПоиска);
   ДанныеФормыОбъект = ФормаДокумента.Объект;
   ЗаполнитьДокументОснование(ДанныеФормыОбъект);
   
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьДокументОснование(ДокументОбъект)

   ТЗ = ПолучитьДанныеЗаполнения();
   
   Для каждого СтрТЗ Из ТЗ Цикл
       
       ЗаполнитьЗначенияСвойств(ДокументОбъект.Услуги.Добавить(), СтрТЗ);
       
   КонецЦикла;
   
КонецПроцедуры

ДокументОбъект.Услуги имеет тип ДанныеФормыКоллекция. В эту коллекцию в цикле идет добавление. Но в форме документа ничего не меняется...
6 vmv
 
20.09.12
15:33
(5) Обновить() коллекцию и ОбновитьОтображениеФолрмы() или как там для формы не помню попробуй, сначала первое потом второе

САвет: если модифировать Дфк(Данные формы коллекцию) на сервере, то чтобы на клиенте данные обновились в некоторых случаях(большинсве) клиент нужно пнуть на обновление данных модификации или формы.

правило простое - одеквату легко усвоить простую логику
7 vmv
 
20.09.12
15:40
еще савет

и идентифицируй переменные сразу правильно

я такой шаблон придумал

Тч - табличная часть, источник Объект.ТабличнаяЧастьТовары (это не в диковинку)

Тф - табллица формы, источник Элементы.ДСписокДокументы, Элементы.ТчТовары; иногда полезно перебрать подчиненные поля.

Дфк - ДанныеФормыКоллекция, Источник: отображение таблицы значений, табличной части на УФ

ДфкЭлКл - ДанныеФормыЭлеменетКоллекции - строка обтображения отображение таблицы значений, табличной части на УФ

Дфск - ДанныеФормыСтруткрураСКоллекций (дерево)

и тогда код читать просто и понятно, например

Для каждого ДфЭлКл Из ДфкОтбор Цикл
       Если ДфЭлКл.Включить Тогда
           СтруктураОтбора.Вставить(ДфЭлКол.Ключ, ДфЭлКл.Значение);
       КонецЕсли;
КонецЦикла;

а хрен поймешь что за тип в ваших старых привычках

Тз, СтрокаТз и прочая чушь

"разруха сначала в головах, а потом в сараях"
8 pessok
 
20.09.12
15:48
уххх скока инфы. перевариваю...
9 pessok
 
20.09.12
15:51
ну насчет (7) согласен полностью.
насчет (6)... у коллекия нет метода обновить, а обновление формы на клиенте уже что-т не помогло...
10 vmv
 
20.09.12
15:54
обновлялки - это коптенция таблиц формы, т.е. Элементы.ТчТовары.Обновить() вроде так да и ваще твой код адске непонятен и по сути и по иденфикации объектов, наверняка там еще косяк с объектом-переменной

гружу в такой-то, вижу другой-то и где мой мешочек с травой - почему не вижу
11 pessok
 
20.09.12
16:06
(10) ну попробую пояснить

&НаКлиенте
Процедура ЗаполнитьТаблицуДокумента(Команда)
   
   КлючПоиска = Новый Структура("Ключ", Параметры.СсылкаНаДокумент);
       ФормаДокумента = ПолучитьФорму("Документ.ПриложениеКонтрагента.ФормаОбъекта", КлючПоиска);
       ДанныеФормыОбъект = ФормаДокумента.Объект;
   ЗаполнитьДокументОснование(ДанныеФормыОбъект);
   ФормаДокумента.ОбновитьОтображениеДанных();
   
КонецПроцедуры

В документе команда, она открывает форму обработку и передает туда параметр СсылкаНаДокумент.

В открывшейся форме обработки при клаце на выполнить происходит поиск формы того самого документа по ссылке (хотя я нихера не понял, почему нельзя юзать ВладелецФормы для идентификации). Находим форму и получаем из нее ДанныеФормыОбъект (Дфс). Передаем на сервер для изменения, т.к. заполняем из ТЗ, сформированной запросом


&НаСервере
Процедура ЗаполнитьДокументОснование(ДокументОбъект)

   ТЗ = ПолучитьДанныеЗаполнения();
   
   Для каждого СтрТЗ Из ТЗ Цикл
       
       ЗаполнитьЗначенияСвойств(ДокументОбъект.Услуги.Добавить(), СтрТЗ);
       
   КонецЦикла;
   
КонецПроцедуры

На сервере из полученной ТЗ начинаем заполнять Дфс документа. Хотим видеть изменения в документе
12 pessok
 
20.09.12
16:32
еще разок всплывем, так и не работает(