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

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С
Киров (Кировская обл.)
зарплата от 100 000 руб.
Полный день

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

Архитектор 1С
Москва
зарплата от 250 000 руб.
Полный день

1С-Программист (интегратор Битрикс24)
Санкт-Петербург
зарплата от 150 000 руб. до 250 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 100 000 руб.
Временный (на проект)