Обновление данных в табличной части документа

1. Aleksz 24.10.14 11:38 Сейчас в теме
Здравствуйте. Знаю, что неоднократно был такой вопрос, но всё же... Имеется внешняя обработка заполнения ТЧ Товары документа "Заказ клиента", требуется ввести некоторые данные, нажать на форме обработки кнопку "Выполнить", и ТЧ Товары должна заполниться требуемыми значениями. Но без нажатия кнопки "Перечитать" в разделе "Все действия" список товаров на форме не обновляется.

Что пробовал: как и написано везде, "ОповеститьОбИзменении(Объект.Док)", где Объект.Док - ссылка на документ, который нужно заполнить. Однако никаких изменений не происходит, форма не обновляется. Может ли кто подтолкнуть в правильном направлении? Заранее спасибо.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. infostart user 20 24.10.14 11:52 Сейчас в теме
3. Aleksz 24.10.14 11:59 Сейчас в теме
(2) infostart user,
ну это сначала надо к форме обратиться, но с сервера не получается это сделать, а на клиенте метод "ПолучитьОбъект()" не работает. Как в этом случае поступить?
4. infostart user 20 24.10.14 12:04 Сейчас в теме
(3) Aleksz, после того, как из документа форму обработки вызываешь делай Прочитать()


еще как вариант:
1. на форме обработки после выполнить() вызвать метод Оповестить("ОбновитьЗаказКлиента").
2. на форме заказа клиента задать обработчик ОбработкаОповещения(), тебе туда прилетит имя события ("ОбновитьЗаказКлиента"), если имя события "ОбновитьЗаказКлиента" тогда Прочитать()
lion-killer; +1 Ответить
5. Aleksz 24.10.14 12:10 Сейчас в теме
(4) infostart user, ругается, метод не обнаружен. Выкладываю код, так понятнее будет.

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

&НаСервере
процедура ЗаполнитьОбъект()
ДокЗаполнения = Объект.Док.ПолучитьОбъект();
ДокЗаполнения.НеОтгружатьЧастями = Ложь;
ДокЗаполнения.Товары.Очистить();
Цена = Объект.СуммаПодписки / Объект.МесяцевПодписки;
Для м=0 по Объект.МесяцевПодписки-1 Цикл
НоваяСтрока = ДокЗаполнения.Товары.Добавить();
НоваяСтрока.Номенклатура = Объект.Подписка;
НоваяСтрока.ДатаОтгрузки = ДобавитьМесяц(Объект.ДатаС, м);
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
Скобка = Найти(Объект.Подписка.Наименование,")");
Строка1 = Лев(Объект.Подписка.Наименование,Скобка);
НоваяСтрока.Содержание = "" + Строка1 + " DVD за " + Нрег(Формат(НоваяСтрока.ДатаОтгрузки, "ДФ=MMMM")) + " " + Формат(НоваяСтрока.ДатаОтгрузки, "ДФ=yyyy") + " г.";
НоваяСтрока.КоличествоУпаковок = 1;
НоваяСтрока.Количество = 1;
НоваяСТрока.Упаковка = Справочники.УпаковкиНоменклатуры.НайтиПоНаименованию("мес",,,НоваяСтрока.Номенклатура);
НоваяСтрока.Цена = Цена;
НоваяСтрока.Сумма = НоваяСтрока.Цена * НоваяСтрока.КоличествоУпаковок;
НоваяСтрока.СуммаСНДС = НоваяСтрока.Сумма;
КонецЦикла;
ДокЗаполнения.Записать();
Форма1 = РеквизитФормыВЗначение("Объект");
Форма1.Обновить();
Модифицированность=Истина;
КонецПроцедуры

&НаКлиенте
Процедура Заполнить(Команда, Отказ)
Объект.КнопкаНажата = Истина;
Режим = РежимДиалогаВопрос.ДаНет;
Текст = "ru = ""Табличная часть не пуста, при повторном заполнении табличная часть будет очищена. Продолжить выполнение операции?"";";
Ответ = Вопрос(НСтр(Текст), Режим, 0);
Если Ответ = КодВозвратаДиалога.Нет Тогда
Отказ = Истина;
Иначе
ЗаполнитьОбъект();
КонецЕсли;
ОповеститьОбИзменении(Объект.Док);
Модифицированность=Истина;
ЭтаФорма.Закрыть();
КонецПроцедуры
6. infostart user 20 24.10.14 12:18 Сейчас в теме
(5) Aleksz, непонятно, что и где выполняется. Прочитать нужно не документ, а просто вызвать метод на форме заказа после выполнения всех процедура.
&НаКлиенте
Процедура Команда1(Команда)
//...
//открываем форму подбора товара
//...

//после того как подбор закончили, пишем Прочитать на форме, на клиенте
Прочитать();
КонецПроцедуры
Показать


ПС еще можно посмотреть, как реализован типовой механизм подбора товара в заказе покупателя.
7. Aleksz 24.10.14 13:04 Сейчас в теме
(6) infostart user, это, выходит, форму документа надо редактировать? Хотелось бы сделать обновление без изменения конфигурации.
8. infostart user 20 24.10.14 13:12 Сейчас в теме
(7) Aleksz, а откуда у вас вызывается обработка заполнения?
9. Aleksz 24.10.14 14:12 Сейчас в теме
(8) infostart user, я её прикрутил к документу "Заказ клиента". Нажимаю "Заполнить", вываливается форма обработки, в которой я указываю необходимые данные по заказу, и потом уже на форме обработки жму "Заполнить документ" - документ-то в принципе заполняется, но вижу это я лишь после "Перечитать" или переоткрытия документа.
10. infostart user 20 24.10.14 14:20 Сейчас в теме
(9) Aleksz, если прикрутили к документу, значит редактировали уже форму.
как вариант еще, попробовать закрыть документ и открыть, т.е. переоткрыть программно.
11. Aleksz 24.10.14 15:29 Сейчас в теме
(10) infostart user, я имел в виду "прикрутил", то есть прописал во внешней обработке заполнения ТЧ документ, из которого она будет вызываться. То есть конфигурацию я не изменял.
12. Aleksz 24.10.14 17:33 Сейчас в теме
Разобрался. Требовалось в последней процедуре "Заполнить" прописать следующий код:

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

И форма обновляется! Ну и, соответственно, конфигурацию мучать изменениями не надо, что тоже хорошо.
alisakish; gusteleva; RomanKod; jaroslav.h; regstaer; gala2009; berserjk; ogre2007; Дейл; join2us; k992007; shrek2; +12 Ответить
14. dadel 19 29.03.17 00:55 Сейчас в теме
(12)Тоже столкнулся, но решил по другому. Вернулся на клиента с ТЗ и там заполнение сделал. Если получить ТекСтроку из ВладелецФормы.Объект, то все обновляется. Если из переменной НашДокумент , то не обновляется.
Дополнение. ТЗ с сервера в таком виде возвращается только в толстом клиенте, в тонком через массив нужно возвращать на клиента.
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
	
	НашДокумент = ВладелецФормы.Объект;
	Режим = РежимДиалогаВопрос.ДаНет; 
	Текст = "ru = ""Колонка Цена, табличной части Товары, будет перезаполнена.
	|Продолжить выполнение операции?"";"; 
	Ответ = Вопрос(НСтр(Текст), Режим, 0); 
	Если Ответ = КодВозвратаДиалога.Нет Тогда 
		Отказ = Истина; 
	Иначе 
		ТЗ = ЗаполнитьЦеныТоваров(НашДокумент);
	КонецЕсли; 
	
	Для каждого  ТекущаяСтрока из ВладелецФормы.Объект.Товары Цикл
		СтруктураОтбора=Новый Структура;
		СтруктураОтбора.Вставить("Номенклатура",ТекущаяСтрока.Номенклатура);
		СтруктураОтбора.Вставить("Характеристика",ТекущаяСтрока.Характеристика);
		НайденныеСтроки = ТЗ.НайтиСтроки(СтруктураОтбора);
		ТекущаяСтрока.Цена =  НайденныеСтроки[0].Цена;
	КонецЦикла;
	
КонецПроцедуры	

&НаСервере
Функция  ЗаполнитьЦеныТоваров(НашДокумент)
	
	Запрос.....


	Результат = Запрос.Выполнить();
	ТЗ = Результат.Выгрузить(); 
	Возврат ТЗ;
	
КонецФункции 

Показать
20. RomanKod 26.11.21 18:29 Сейчас в теме
(12)
п = Новый Структура("Ключ", Объект.Док);
Форма = ПолучитьФорму("Документ.ЗаказКлиента.ФормаОбъекта", п);
Форма.Прочитать();


Спасибо тебе, добрый человек! Целый час убил на эту проблему пока не нашёл твое сообщение! Отправляю ментально огромный плюс тебе в карму )
13. shrek2 34 16.05.16 11:14 Сейчас в теме
Спасибо огромное! Была аналогичная проблема. Писал обработку заполнения ТЧ на УФ. В тонком клиенте выпадала ошибка "Интерактивные операции запрещены". (В толстом все работало.) С помощью данного способа решил вопрос. Спасибо.
15. mikl79 118 21.05.18 14:36 Сейчас в теме
это не решает проблемы, если нужно из обработки Заполнение объекта поменять данные формы без записи в базу данных, т.е. без записи в сам объект.
Например, нужно изменить данные табл.части документа, отобразить эти изменения на форме, но при закрытии формы отказаться от внесенных изменений
sumber; Ateterev; Itelesha; +3 Ответить
16. Ateterev 24.10.18 11:38 Сейчас в теме
17. TonyBreza 10.01.19 14:35 Сейчас в теме
(16) Есть. Вот пример заполнения ТЧ документа из внешней обработки:
Ключевой момент:
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыЗаполнениеФормы();
Подробнее:
https://its.1c.ru/db/bsp246doc#content:31:1:issogl3_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80_%D0%BE%D0%B1%D1­%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%B7%D0%B0%D0%BF%D­0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B4%D0%B0%D0%BD%­D0%BD%D1%8B%D1%85_%D1%84%D0%BE%D1%80%D0%BC%D1%8B_%D0%B1%D0%B­5%D0%B7_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B8_%D0%BE%D0%B1%D1­%8A%D0%B5%D0%BA%D1%82%D0%B0

Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации =ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид =ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
ПараметрыРегистрации.Версия = "1.2";
ПараметрыРегистрации.Назначение.Добавить("Справочник._ДемоКонтрагенты");
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = НСтр("ru = 'Заполнить реквизит ""ИНН"" не записывая объект (заполнение формы)'");
НоваяКоманда.Идентификатор = "ЗаполнитьИНН";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыЗаполнениеФормы();
Возврат ПараметрыРегистрации;
КонецФункции
Процедура ВыполнитьКоманду(ИмяКоманды, ОбъектыНазначения, ПараметрыВыполнения) Экспорт
Если ИмяКоманды = "ЗаполнитьИНН" Тогда
Генератор = Новый ГенераторСлучайныхЧисел;
ЭтаФорма = ПараметрыВыполнения.ЭтаФорма;
ЭтаФорма.Объект.ИНН = Формат(Генератор.СлучайноеЧисло(1, 999999999), "ЧЦ=12; ЧДЦ=0; ЧВН=; ЧГ=");
ЭтаФорма.Модифицированность = Истина;
Сообщение = Новый СообщениеПользователю();
Сообщение.Поле = "Объект.ИНН";
Сообщение.Текст = НСтр("ru = 'Поле ""ИНН"" успешно заполнено'");
Сообщение.Сообщить();
...
КонецПроцедуры
19. galyausik1 06.09.20 22:05 Сейчас в теме
(17) А у меня такой код не вносит никаких изменений. Т.е. процедура выполняется, но на открытой форме данные никак не меняются(
18. v3rter 30.07.19 23:27 Сейчас в теме
Для тех, кто вдруг ищет для обычных форм: ЭтаФорма.Обновить()
21. MaCCapAkIII 05.07.23 11:06 Сейчас в теме
ЭтотОбъект.Прочитать() весьма опасная штука. Допустим Вы работалина форме, вносили изменения в поля, не записали эти изменения, потом решили что-то догрузить внешней обработкой, которая опять-таки что-то меняет на форме, и потом в конце вызывает ЭтотОбъект.Прочитать(), который затирает все, что было сделано на форме и загружает состояние объекта до начала редактирования (так как мы ничего не записали).
mark_oilbass; nkopablevwork; denis83; olbu; +4 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот