Обновление данных формы после заполнения
Привет всем.
У мен КА 2.5 есть док изменения цен.
Сделал обработку которая выбирает EXCEL файл и загружает в док, но проблема в том, что форма не показывает измененные данные,
Код проц:
Читает EXCEL замечательно, по всем колонкам которым нужно, все как положено вроде заполняет последняя Сообщить(ВладелецФормы.Объект.Товары.Количество()); показывает 300 с лишним строк
но вот форма из которой вызываю внешнюю обработку заполнения табличной части в ТЧ пусто
У мен КА 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 и КС-3 в "1С:Бухгалтерия 3.0"
- Заполнение категорий статистического учета для формы ЗП-Образование, пр-366 от 8 марта 2021
- Неочевидные нюансы записи управляемой формы
- Мониторинг ПФР/Минтруда по приказу № Пр-366. Форма для сбора сведений о заработной плате работников бюджетной сферы. Автоматическое заполнение с возможностью корректировки и консолидации и выгрузка в формате XML. ЗГУ/ЗУП 3.1
- Заполнение объектов в модели MVC
Ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
а если
или вообще
Прочитать()
Описание:
Обновляет объект формы клиентского приложения.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
ЭтаФорма.ОтобразитьИзменениеДанных(ВладелецФормы.Объект,ВидИзмененияДанных.Изменение);
или вообще
Прочитать()
Описание:
Обновляет объект формы клиентского приложения.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Так у меня при заполнении открывается форма в которой команда "Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт"
Если я буду обновлять ЭтаФорма.ОтобразитьИзменениеДанных то ничего не произойдет
В модуле код описания внешней обработки:
Если я буду обновлять ЭтаФорма.ОтобразитьИзменениеДанных то ничего не произойдет
В модуле код описания внешней обработки:
Функция СведенияОВнешнейОбработке() Экспорт
Назначения = Новый Массив ;
Назначения.Добавить("Документ.УстановкаЦенНоменклатуры") ;
ПараметрыРегистрации = Новый Структура ;
ПараметрыРегистрации.Вставить("Вид","ЗаполнениеОбъекта");
ПараметрыРегистрации.Вставить("Назначение",Назначения);
ПараметрыРегистрации.Вставить("Наименование","Заполнить Документ из EXCEL");
ПараметрыРегистрации.Вставить("Версия","1.0");
ПараметрыРегистрации.Вставить("Информация","Дополнительная обработка табличной части Установки цен наменклатуры");
ПараметрыРегистрации.Вставить("БезопасныйРежим",Истина);
Команды = ПолучитьТаблицуКоманд() ;
ДобавитьКоманду(Команды, "Заполнить из EXEL","ЗаполнитьДокумент","ВызовКлиентскогоМетода",Ложь,) ;
ПараметрыРегистрации.Вставить("Команды",Команды) ;
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений ;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")) ;
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")) ;
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")) ;
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево")) ;
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка")) ;
Возврат Команды ;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить() ;
НоваяКоманда.Представление = Представление ;
НоваяКоманда.Идентификатор = Идентификатор ;
НоваяКоманда.Использование = Использование ;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение ;
НоваяКоманда.Модификатор = Модификатор ;
КонецПроцедуры
ПоказатьПрикрепленные файлы:
(4)в демо-базе БСП есть пример. Внешняя обработка Демо: Заполнение контрагентов.
Если открыть в конфигураторе, у обработки есть форма, где как раз описана процедура заполнения &НаКлиенте.
Дальше, для отображения изменений вызывается
Если открыть в конфигураторе, у обработки есть форма, где как раз описана процедура заполнения &НаКлиенте.
Дальше, для отображения изменений вызывается
&НаКлиенте
Процедура ОбновитьКонтрагентовИЗакрыть()
Если ТипЗнч(ВладелецФормы) = Тип("УправляемаяФорма") И Не ВладелецФормы.Модифицированность Тогда
Попытка
ВладелецФормы.Прочитать();
Исключение
// Значит это форма списка.
КонецПопытки;
КонецЕсли;
ОповеститьОбИзменении(Тип("СправочникСсылка._ДемоКонтрагенты"));
Если Открыта() Тогда
Закрыть();
КонецЕсли;
КонецПроцедуры
Показать
(7)
не заполняет всеравно:
Если ТипЗнч(ВладелецФормы) = Тип("УправляемаяФорма") И Не ВладелецФормы.Модифицированность Тогда
Попытка
ВладелецФормы.Прочитать();
Исключение
// Значит это форма списка.
КонецПопытки;
КонецЕсли;
ОповеститьОбИзменении(Тип("СправочникСсылка._ДемоКонтрагенты"));
Если Открыта() Тогда
Закрыть();
КонецЕсли;
Попытка
ВладелецФормы.Прочитать();
Исключение
// Значит это форма списка.
КонецПопытки;
КонецЕсли;
ОповеститьОбИзменении(Тип("СправочникСсылка._ДемоКонтрагенты"));
Если Открыта() Тогда
Закрыть();
КонецЕсли;
не заполняет всеравно:
Если ТипЗнч(ВладелецФормы) = Тип("УправляемаяФорма") И Не ВладелецФормы.Модифицированность Тогда
Попытка
ВладелецФормы.Прочитать();
Сообщить("Прочитал");
Исключение
Сообщить("Не смог прочитать");
КонецПопытки;
КонецЕсли;
ОповеститьОбИзменении(Тип("ДокументСсылка.УстановкаЦенНоменклатуры"));
Если Открыта() Тогда
Закрыть();
КонецЕсли;
Показать
(10) Создал обработку и подключил
Создаются строки и не надо ничего обновлять, странно почему у Вас не работает
МодульФормы
МодульОбъекта
Создаются строки и не надо ничего обновлять, странно почему у Вас не работает
МодульФормы
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
ВладелецФормы.Объект.Товары.Добавить();
КонецПроцедуры
МодульОбъекта
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации =ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.1.2.500");
ПараметрыРегистрации.Вид =ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
ПараметрыРегистрации.Версия = "1.2";
ПараметрыРегистрации.Назначение.Добавить("Документ.ЗаказКлиента");
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = НСтр("ru = 'Тест'");
НоваяКоманда.Идентификатор = "Тест1";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
Возврат ПараметрыРегистрации;
КонецФункции
Показать
(10) Пришлось лезть в конфу, хотя на вашем месте я бы в первую очередь это сделал, как что-то не заработало.
На форме документа УстановкаЦенНоменклатуры не таблица товаров, а дерево значений, которое заполняется в процедуре ЗаполнитьДокумент().
Можно попробовать вызвать самому в своей обработке
Но правильнее расширением добавить экспортную процедуру, в которой вызывается ЗаполнитьДокумент(), а в обработке вызвать ВладелецФормы.<ПроцедураРасширения>, чтобы вызвалось ЗаполнитьДокумент()
На форме документа УстановкаЦенНоменклатуры не таблица товаров, а дерево значений, которое заполняется в процедуре ЗаполнитьДокумент().
Можно попробовать вызвать самому в своей обработке
КэшДанных = УстановкаЦенСервер.ИнициализироватьСтруктуруКэшаДанных();
УстановкаЦенСервер.ЗагрузитьТабличнуюЧастьТовары(ВладелецФормы, КэшДанных);
Но правильнее расширением добавить экспортную процедуру, в которой вызывается ЗаполнитьДокумент(), а в обработке вызвать ВладелецФормы.<ПроцедураРасширения>, чтобы вызвалось ЗаполнитьДокумент()
(13)У вас док заполняется, вы же сами написали, что
У вас проблема, что теперь эти заполненные данные нужно вывести на форму.
В документе установки цен в КА 2.5 на форме не таблица Объект.Товары, а дерево значений, которое программно, при открытии документа заполняется на основании таблицы товаров, в методе ЗаполнитьДокумент().
Вам нужно вызвать этот же самый метод в своей обработке, чтобы дерево заполнилось на основании заполненной вами таблицы товаров.
Это же очень частый кейс, когда данные на форме отображаются в элементе, не связанном напрямую с реквизитами объекта.
Взять тот же табель в ЗУП, ровно та же самая ситуация.
Сообщить(ВладелецФормы.Объект.Товары.Количество()); показывает 300 с лишним строк
У вас проблема, что теперь эти заполненные данные нужно вывести на форму.
В документе установки цен в КА 2.5 на форме не таблица Объект.Товары, а дерево значений, которое программно, при открытии документа заполняется на основании таблицы товаров, в методе ЗаполнитьДокумент().
Вам нужно вызвать этот же самый метод в своей обработке, чтобы дерево заполнилось на основании заполненной вами таблицы товаров.
Это же очень частый кейс, когда данные на форме отображаются в элементе, не связанном напрямую с реквизитами объекта.
Взять тот же табель в ЗУП, ровно та же самая ситуация.
Вакансии
1С-Программист (интегратор Битрикс24)
Санкт-Петербург
зарплата от 150 000 руб. до 250 000 руб.
Полный день
Санкт-Петербург
зарплата от 150 000 руб. до 250 000 руб.
Полный день