Здравствуйте. Знаю, что неоднократно был такой вопрос, но всё же... Имеется внешняя обработка заполнения ТЧ Товары документа "Заказ клиента", требуется ввести некоторые данные, нажать на форме обработки кнопку "Выполнить", и ТЧ Товары должна заполниться требуемыми значениями. Но без нажатия кнопки "Перечитать" в разделе "Все действия" список товаров на форме не обновляется.
Что пробовал: как и написано везде, "ОповеститьОбИзменении(Объект.Док)", где Объект.Док - ссылка на документ, который нужно заполнить. Однако никаких изменений не происходит, форма не обновляется. Может ли кто подтолкнуть в правильном направлении? Заранее спасибо.
(2) infostart user,
ну это сначала надо к форме обратиться, но с сервера не получается это сделать, а на клиенте метод "ПолучитьОбъект()" не работает. Как в этом случае поступить?
(3) Aleksz, после того, как из документа форму обработки вызываешь делай Прочитать()
еще как вариант:
1. на форме обработки после выполнить() вызвать метод Оповестить("ОбновитьЗаказКлиента").
2. на форме заказа клиента задать обработчик ОбработкаОповещения(), тебе туда прилетит имя события ("ОбновитьЗаказКлиента"), если имя события "ОбновитьЗаказКлиента" тогда Прочитать()
&НаКлиенте
Процедура Заполнить(Команда, Отказ)
Объект.КнопкаНажата = Истина;
Режим = РежимДиалогаВопрос.ДаНет;
Текст = "ru = ""Табличная часть не пуста, при повторном заполнении табличная часть будет очищена. Продолжить выполнение операции?"";";
Ответ = Вопрос(НСтр(Текст), Режим, 0);
Если Ответ = КодВозвратаДиалога.Нет Тогда
Отказ = Истина;
Иначе
ЗаполнитьОбъект();
КонецЕсли;
ОповеститьОбИзменении(Объект.Док);
Модифицированность=Истина;
ЭтаФорма.Закрыть();
КонецПроцедуры
(5) Aleksz, непонятно, что и где выполняется. Прочитать нужно не документ, а просто вызвать метод на форме заказа после выполнения всех процедура.
&НаКлиенте
Процедура Команда1(Команда)
//...
//открываем форму подбора товара
//...
//после того как подбор закончили, пишем Прочитать на форме, на клиенте
Прочитать();
КонецПроцедуры
Показать
ПС еще можно посмотреть, как реализован типовой механизм подбора товара в заказе покупателя.
(8) infostart user, я её прикрутил к документу "Заказ клиента". Нажимаю "Заполнить", вываливается форма обработки, в которой я указываю необходимые данные по заказу, и потом уже на форме обработки жму "Заполнить документ" - документ-то в принципе заполняется, но вижу это я лишь после "Перечитать" или переоткрытия документа.
(9) Aleksz, если прикрутили к документу, значит редактировали уже форму.
как вариант еще, попробовать закрыть документ и открыть, т.е. переоткрыть программно.
(10) infostart user, я имел в виду "прикрутил", то есть прописал во внешней обработке заполнения ТЧ документ, из которого она будет вызываться. То есть конфигурацию я не изменял.
(12)Тоже столкнулся, но решил по другому. Вернулся на клиента с ТЗ и там заполнение сделал. Если получить ТекСтроку из ВладелецФормы.Объект, то все обновляется. Если из переменной НашДокумент , то не обновляется.
Дополнение. ТЗ с сервера в таком виде возвращается только в толстом клиенте, в тонком через массив нужно возвращать на клиента.
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
НашДокумент = ВладелецФормы.Объект;
Режим = РежимДиалогаВопрос.ДаНет;
Текст = "ru = ""Колонка Цена, табличной части Товары, будет перезаполнена.
|Продолжить выполнение операции?"";";
Ответ = Вопрос(НСтр(Текст), Режим, 0);
Если Ответ = КодВозвратаДиалога.Нет Тогда
Отказ = Истина;
Иначе
ТЗ = ЗаполнитьЦеныТоваров(НашДокумент);
КонецЕсли;
Для каждого ТекущаяСтрока из ВладелецФормы.Объект.Товары Цикл
СтруктураОтбора=Новый Структура;
СтруктураОтбора.Вставить("Номенклатура",ТекущаяСтрока.Номенклатура);
СтруктураОтбора.Вставить("Характеристика",ТекущаяСтрока.Характеристика);
НайденныеСтроки = ТЗ.НайтиСтроки(СтруктураОтбора);
ТекущаяСтрока.Цена = НайденныеСтроки[0].Цена;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ЗаполнитьЦеныТоваров(НашДокумент)
Запрос.....
Результат = Запрос.Выполнить();
ТЗ = Результат.Выгрузить();
Возврат ТЗ;
КонецФункции
Спасибо огромное! Была аналогичная проблема. Писал обработку заполнения ТЧ на УФ. В тонком клиенте выпадала ошибка "Интерактивные операции запрещены". (В толстом все работало.) С помощью данного способа решил вопрос. Спасибо.
это не решает проблемы, если нужно из обработки Заполнение объекта поменять данные формы без записи в базу данных, т.е. без записи в сам объект.
Например, нужно изменить данные табл.части документа, отобразить эти изменения на форме, но при закрытии формы отказаться от внесенных изменений
ЭтотОбъект.Прочитать() весьма опасная штука. Допустим Вы работалина форме, вносили изменения в поля, не записали эти изменения, потом решили что-то догрузить внешней обработкой, которая опять-таки что-то меняет на форме, и потом в конце вызывает ЭтотОбъект.Прочитать(), который затирает все, что было сделано на форме и загружает состояние объекта до начала редактирования (так как мы ничего не записали).