Обновление данных формы после заполнения

1. BARDER 35 21.06.23 09:24 Сейчас в теме
Привет всем.
У мен КА 2.5 есть док изменения цен.
Сделал обработку которая выбирает EXCEL файл и загружает в док, но проблема в том, что форма не показывает измененные данные,
Код проц:
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
	Если ПутьКФайлу = "" Тогда
		ВыбратьФайлЗ();
	КонецЕсли;
	//Если ПутьКФайлу <> "" Тогда
	//	ВладелецФормы.Объект.Товары.Очистить();
	//КонецЕсли;
    Попытка
		ОбъектExcel = Новый COMОбъект("Excel.Application");
	Исключение
		Сообщить ("Ошибка открытия MS Excel");	
	КонецПопытки;
	
	Попытка
		ОбъектExcel.WorkBooks.Open(ПутьКФайлу);
	Исключение
		ОбъектExcel.DisplayAlerts = 0; 
		ОбъектExcel.Quit();
		ОбъектExcel.DisplayAlerts = 1;
		
		Сообщить ("Ошибка открытия файла для чтения: " + ПутьКФайлу);	
	КонецПопытки;
	
	Попытка
		ОбъектExcel.Sheets(1).Select();
	Исключение
		ОбъектExcel.ActiveWorkbook.Close();
		ОбъектExcel = 0;
		
		Сообщить( "Ошибка при чтении файла: " + ПутьКФайлу);
	КонецПопытки;
	
	Version	= ОбъектExcel.Version;
	
	Версия = Лев(Version, Найти(Version,".") - 1 );
	
	Если Версия = "8" тогда
		ФайлСтрок	= ОбъектExcel.Cells.CurrentRegion.Rows.Count;
		ФайлКолонок = Макс(ОбъектExcel.Cells.CurrentRegion.Columns.Count, 13);
	Иначе
		ФайлСтрок	= ОбъектExcel.Cells(1,1).SpecialCells(11).Row;
		ФайлКолонок = ОбъектExcel.Cells(1,1).SpecialCells(11).Column;
	Конецесли;
	
	ЦеныДляПрайса 		= ПолучитьМассивДляПрайса();
	Сообщить(ЦеныДляПрайса[0]);
	Сообщить(ЦеныДляПрайса[1]);
	ТЧВидЦены 			= ВладелецФормы.Объект.ВидыЦен.Добавить();
    ТЧВидЦены.ВидЦены 	= ЦеныДляПрайса[0] ;
	ТЧВидЦены 			= ВладелецФормы.Объект.ВидыЦен.Добавить();
    ТЧВидЦены.ВидЦены 	= ЦеныДляПрайса[1] ;
	
 	Для НС = 1 по ФайлСтрок Цикл 
		Артикул = СокрЛП(ОбъектExcel.Cells(НС, 2).Text); //СокрЛП(ОбъектExcel.Cells(НС, 1).Text);
		Если Артикул = "" Тогда
			Продолжить;
		КонецЕсли; 
		Номенклатура = ПолучитьНоменклатуруПоАртикулу(Артикул);
		Сообщить(Артикул + " - " + Номенклатура);
		Если Номенклатура = Неопределено Тогда
		 	Продолжить;
		КонецЕсли; 
		ЦенаОпт 	=  СокрЛП(ОбъектExcel.Cells(НС, 5).Text); //СокрЛП(ОбъектExcel.Cells(НС, 16).Text);
		ЦенаРозн 	=  СокрЛП(ОбъектExcel.Cells(НС, 7).Text); //СокрЛП(ОбъектExcel.Cells(НС, 17).Text);
		
	//Строка с ценой Оптовая
        СтрокаТЧ 				= ВладелецФормы.Объект.Товары.Добавить();
	СтрокаТЧ.Номенклатура 	= Номенклатура;
        СтрокаТЧ.ВидЦены 		= ЦеныДляПрайса[0];
        СтрокаТЧ.Цена 			= ЦенаОпт;
		
	//Строка с ценой РРЦ
        СтрокаТЧ 				= ВладелецФормы.Объект.Товары.Добавить();
        СтрокаТЧ.Номенклатура 	= Номенклатура;
	СтрокаТЧ.ВидЦены 		= ЦеныДляПрайса[1];
        СтрокаТЧ.Цена 			= ЦенаРозн;
	КонецЦикла;
	
	
	ОбъектExcel.DisplayAlerts = 0; 
	ОбъектExcel.Quit();
	ОбъектExcel.DisplayAlerts = 1;
	ОтобразитьИзменениеДанных(ВладелецФормы.Объект,ВидИзмененияДанных.Изменение); 
	Сообщить(ВладелецФормы.Объект.Товары.Количество());
	
КонецПроцедуры
Показать


Читает EXCEL замечательно, по всем колонкам которым нужно, все как положено вроде заполняет последняя Сообщить(ВладелецФормы.Объект.Товары.Количество()); показывает 300 с лишним строк
но вот форма из которой вызываю внешнюю обработку заполнения табличной части в ТЧ пусто
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. glek 119 21.06.23 09:53 Сейчас в теме
(1) Ну так на форме документа не табличная часть документа, а таблица значений. Её перезаполняете после чтения файла?
6. BARDER 35 21.06.23 23:45 Сейчас в теме
(2) ну код я показал, не перезаполняю.
9. DBV 22.06.23 09:03 Сейчас в теме
(1)
ВладелецФормы.ОбновитьОтображениеДанных()


Описание:
В принудительном порядке обновляет содержание элементов управления.
Полезен при изменении значений реквизитов формы вне формы, в тот момент, когда форма отображается на экране.
3. Vladimir-R 167 21.06.23 12:39 Сейчас в теме
а если

ЭтаФорма.ОтобразитьИзменениеДанных(ВладелецФормы.Объект,ВидИзмененияДанных.Изменение);


или вообще

Прочитать()
Описание:
Обновляет объект формы клиентского приложения.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
user1619761; Fatenm; +2 Ответить
5. BARDER 35 21.06.23 21:45 Сейчас в теме
(3) Форма открывается обработки, поэтому не получится использовать ЭтаФорма
4. BARDER 35 21.06.23 21:39 Сейчас в теме
Так у меня при заполнении открывается форма в которой команда "Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт"
Если я буду обновлять ЭтаФорма.ОтобразитьИзменениеДанных то ничего не произойдет

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

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

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
	НоваяКоманда = ТаблицаКоманд.Добавить() ;
	НоваяКоманда.Представление = Представление ;
	НоваяКоманда.Идентификатор = Идентификатор ;
	НоваяКоманда.Использование = Использование ;
	НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение ;
	НоваяКоманда.Модификатор = Модификатор ;
КонецПроцедуры	
Показать
Прикрепленные файлы:
7. laperuz 45 22.06.23 06:35 Сейчас в теме
(4)в демо-базе БСП есть пример. Внешняя обработка Демо: Заполнение контрагентов.

Если открыть в конфигураторе, у обработки есть форма, где как раз описана процедура заполнения &НаКлиенте.
Дальше, для отображения изменений вызывается

&НаКлиенте
Процедура ОбновитьКонтрагентовИЗакрыть()
	Если ТипЗнч(ВладелецФормы) = Тип("УправляемаяФорма") И Не ВладелецФормы.Модифицированность Тогда
		Попытка
			ВладелецФормы.Прочитать();
		Исключение
			// Значит это форма списка.
		КонецПопытки;
	КонецЕсли;
	ОповеститьОбИзменении(Тип("СправочникСсылка._ДемоКонтрагенты"));
	Если Открыта() Тогда
		Закрыть();
	КонецЕсли;
КонецПроцедуры
Показать
8. BARDER 35 22.06.23 08:48 Сейчас в теме
(7)
Если ТипЗнч(ВладелецФормы) = Тип("УправляемаяФорма") И Не ВладелецФормы.Модифицированность Тогда
Попытка
ВладелецФормы.Прочитать();
Исключение
// Значит это форма списка.
КонецПопытки;
КонецЕсли;
ОповеститьОбИзменении(Тип("СправочникСсылка._ДемоКонтрагенты"));
Если Открыта() Тогда
Закрыть();
КонецЕсли;


не заполняет всеравно:
Если ТипЗнч(ВладелецФормы) = Тип("УправляемаяФорма") И Не ВладелецФормы.Модифицированность Тогда
        Попытка
            ВладелецФормы.Прочитать();  
			Сообщить("Прочитал");

        Исключение
            Сообщить("Не смог прочитать");
        КонецПопытки;
    КонецЕсли;
    ОповеститьОбИзменении(Тип("ДокументСсылка.УстановкаЦенНоменклатуры"));
    Если Открыта() Тогда
        Закрыть();
    КонецЕсли;
Показать
10. BARDER 35 22.06.23 09:08 Сейчас в теме
(9)
ОбновитьОтображениеДанных()

Все равно ТЧ пустая
11. DBV 22.06.23 09:29 Сейчас в теме
(10) Создал обработку и подключил
Создаются строки и не надо ничего обновлять, странно почему у Вас не работает

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


МодульОбъекта
Функция СведенияОВнешнейОбработке() Экспорт
	ПараметрыРегистрации =ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.1.2.500");
	ПараметрыРегистрации.Вид =ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
	ПараметрыРегистрации.Версия = "1.2";
	ПараметрыРегистрации.Назначение.Добавить("Документ.ЗаказКлиента");
	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
	НоваяКоманда.Представление = НСтр("ru = 'Тест'");
	НоваяКоманда.Идентификатор = "Тест1";
	НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
	Возврат ПараметрыРегистрации;
КонецФункции
Показать
12. laperuz 45 22.06.23 09:52 Сейчас в теме
(10) Пришлось лезть в конфу, хотя на вашем месте я бы в первую очередь это сделал, как что-то не заработало.
На форме документа УстановкаЦенНоменклатуры не таблица товаров, а дерево значений, которое заполняется в процедуре ЗаполнитьДокумент().

Можно попробовать вызвать самому в своей обработке

КэшДанных = УстановкаЦенСервер.ИнициализироватьСтруктуруКэшаДанных();
УстановкаЦенСервер.ЗагрузитьТабличнуюЧастьТовары(ВладелецФормы, КэшДанных);


Но правильнее расширением добавить экспортную процедуру, в которой вызывается ЗаполнитьДокумент(), а в обработке вызвать ВладелецФормы.<ПроцедураРасширения>, чтобы вызвалось ЗаполнитьДокумент()
13. BARDER 35 22.06.23 21:19 Сейчас в теме
(12) Вообще не понял, нафига расширение...
Мне нужно просто программно заполнить док из файла
14. laperuz 45 23.06.23 04:09 Сейчас в теме
(13)У вас док заполняется, вы же сами написали, что

Сообщить(ВладелецФормы.Объект.Товары.Количество()); показывает 300 с лишним строк


У вас проблема, что теперь эти заполненные данные нужно вывести на форму.
В документе установки цен в КА 2.5 на форме не таблица Объект.Товары, а дерево значений, которое программно, при открытии документа заполняется на основании таблицы товаров, в методе ЗаполнитьДокумент().
Вам нужно вызвать этот же самый метод в своей обработке, чтобы дерево заполнилось на основании заполненной вами таблицы товаров.

Это же очень частый кейс, когда данные на форме отображаются в элементе, не связанном напрямую с реквизитами объекта.
Взять тот же табель в ЗУП, ровно та же самая ситуация.
Оставьте свое сообщение
Вакансии
Разработчик 1С
Москва
зарплата от 150 000 руб. до 250 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Программист 1С
Екатеринбург
зарплата от 130 000 руб. до 170 000 руб.
Полный день

Программист 1C
Санкт-Петербург
зарплата от 140 000 руб. до 200 000 руб.
Полный день

Программист 1С
Москва
зарплата от 190 000 руб. до 240 000 руб.
Полный день