Программное заполнение Установки цен номенклатуры

1. Barok 12.12.19 16:05 Сейчас в теме
Здравствуйте. Пытаюсь программно при помощи внешней обработки в режиме "ЗаполнениеОбъекта" заполнить цены в документе УстановкаЦенНоменклатуры прямо из формы в УТ 11.4 УФ. Написал для начала самый простой код
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) экспорт
	Для каждого стр из ВладелецФормы.Объект.Товары цикл
		Если ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(Стр.ВидЦены,"Наименование") = "Оптовая" Тогда
			Стр.Цена = 100;
        	Сообщить(стр.цена);	
		КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать

По сообщениям вижу, что цена меняется, но в документе в табличной части всё остается по старому. Каким образом "обновить" табличную часть, чтобы отобразились новые цены? Ну или может подскажите, как правильно заполнить цены табличной части?
По теме из базы знаний
Найденные решения
13. independ 1520 12.12.19 23:04 Сейчас в теме
(12) пример
СсылкаНаДокЦен - тип ДокументСсылка, не ДокументОбъект
Прикрепленные файлы:
ИзменитьЦеныПоУсловиюУТ11.epf
user836224; KurovD; Barok; +3 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. YannikAlx 43 12.12.19 16:10 Сейчас в теме
(1) ваш код вот в принципе не меняет цену в документе!
код - даже коментировать не могу - что он делает....

Если вы хотите поменять что-то в документе программно- зачем вы в форму то лезете?

Получайте документ из ссылки, обращайтесь к табличной части, меняйте цены , сохраняйте...
Форма тут при чем?
5. Barok 12.12.19 19:45 Сейчас в теме
(2), смотрите, пользователь интерактивно создает документ УстановкаЦенНоменклатуры, подбирает нужный ему товар, далее нужно, чтобы он нажал на выполнение обработки, подключенной к документу и путем определенных формул ему проставились цены в подобранные товары
11. tolyan_ekb 104 12.12.19 20:06 Сейчас в теме
(1) соглашусь с 2, нужно сначала почитать книжку про управляемые формы, например, Радченко "Практическое пособие разработчика". Потом будет понятнее писаться "самый простой код"
3. VictorRGB2 13 12.12.19 16:13 Сейчас в теме
данные с формы можно изменить на сервере
передайте таблицу формы на сервер, заполните там и обновите отображение на клиенте
7. Barok 12.12.19 19:50 Сейчас в теме
(3) подскажите, пожалуйста, каким образом это сделать? Во многих обучающих примерах меняют на клиенте и у них вроде как всё чудесно, а у меня не выходит :(
9. Barok 12.12.19 19:55 Сейчас в теме
(8) форма у меня уже открыта интерактивно пользователем и товары уже подобраны, нужно лишь проставить цены в текущую открытую форму
10. independ 1520 12.12.19 20:02 Сейчас в теме
(9) попробуйте предложенное решение - оно рабочее, а для того чтобы не открывалась форма обработки заполнения, в процедуре при открытии выполните запуск процедуры заполнения на клиенте, после прочитать форму владелец, затем Закрыть().
Форма документа установки цен непростая, это кросс таблица по видам цен, она не перерисуется если заполнить через ВладелецФормы, а через запись документа и Прочитать() без проблем
12. Barok 12.12.19 21:29 Сейчас в теме
(10) пробую по вашему примеру
&НаКлиенте
Процедура ПриОткрытии(Отказ)
	Если ВладелецФормы<>Неопределено Тогда
	    СсылкаНаДокЦен=ВладелецФормы.Объект.Ссылка;
	КонецЕсли;
КонецПроцедуры


&НаСервере
Процедура УстановитьЦеныНаСервере()
	ДокЦен = СсылкаНаДокЦен.ПолучитьОбъект();
	Для Каждого Стр из ДокЦен.Товары Цикл
		Если ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(Стр.ВидЦены,"Наименование") = "Оптовая" Тогда
			Стр.Цена = 100;
		КонецЕсли;
	КонецЦикла;
	ДокЦен.Записать();
КонецПроцедуры


&НаКлиенте
Процедура УстановитьЦены(Команда)
	УстановитьЦеныНаСервере();
	Если ВладелецФормы<>Неопределено Тогда
        ВладелецФормы.Прочитать();
    КонецЕсли;
    ПоказатьОповещениеПользователя("Готово");
КонецПроцедуры
Показать

Показывает ошибку
{ВнешняяОбработка.УстановкаЦенНоменклатуры.Форма.Форма.Форма(6)}: Ошибка при установке значения атрибута контекста (СсылкаНаДокЦен)
	    СсылкаНаДокЦен=ВладелецФормы.Объект.Ссылка;
по причине:
Нельзя изменять поле, содержащее объект данных формы
Нельзя изменять поле, содержащее объект данных формы


Если Реквизит не на форму добавить, а в обработку, тогда ругается
{ВнешняяОбработка.УстановкаЦенНоменклатуры.Форма.Форма.Форма(13,11)}: Переменная не определена (СсылкаНаДокЦен)
	ДокЦен = <<?>>СсылкаНаДокЦен.ПолучитьОбъект(); (Проверка: Сервер)

Если написать
ДокЦен = Объект.СсылкаНаДокЦен.ПолучитьОбъект();

Тогда обработка запускается, но при выполнении ругается
Метод объекта не обнаружен (ПолучитьОбъект)
{ВнешняяОбработка.УстановкаЦенНоменклатуры.Форма.Форма.Форма(13)}:	ДокЦен = Объект.СсылкаНаДокЦен.ПолучитьОбъект();
13. independ 1520 12.12.19 23:04 Сейчас в теме
(12) пример
СсылкаНаДокЦен - тип ДокументСсылка, не ДокументОбъект
Прикрепленные файлы:
ИзменитьЦеныПоУсловиюУТ11.epf
user836224; KurovD; Barok; +3 Ответить
17. Barok 12.12.19 23:53 Сейчас в теме
(13) Да, действительно, не тот тип реквизита указал. Спасибо огромное!
20. KurovD 18.02.20 11:32 Сейчас в теме
(13) Спасибо. Пример помог (переписал по своему, вместо открытия формы выполнил запуск клиентского метода, но суть от этого не поменялась), печально только что приходится записывать документ. Пытался заполнить ТОЛЬКО форму, чтобы юзвери могли закрыть её ДО записи дока (если нажали кнопку случайно :\ ), но не взлетело.
4. micha26 12.12.19 17:04 Сейчас в теме
Вам уважаемый на сервер надо, там объект получать и меняйте что хотите.
6. Barok 12.12.19 19:48 Сейчас в теме
(4) документ пользователь создает интерактивно и подбирает нужный ему товар интерактивно, от обработки требуется лишь проставить цены в подобранные товары на форме в данном документе, а не в ранее созданные. Я не против и серверными функциями воспользоваться, подскажите как?)
14. Barok 12.12.19 23:42 Сейчас в теме
Уже попробовал по другому варианту. Вот код модуля обработки
Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
    ПараметрыРегистрации.Наименование = НСтр("ru='Установка цен номенклатуры");
    ПараметрыРегистрации.Информация = НСтр("ru='Установка цен номенклатуры по заданному курсу валюты'");
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.Назначение.Добавить("Документ.УстановкаЦенНоменклатуры");
    
    Команда = ПараметрыРегистрации.Команды.Добавить();
    Команда.Идентификатор = "УстановитьЦены";
    Команда.Представление = "Установить цены";
    Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
    
    Возврат ПараметрыРегистрации;
    
КонецФункции
Показать


Вот код формы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	ОбъектНазначения = Параметры.ОбъектыНазначения[0];
КонецПроцедуры

&НаКлиенте
Процедура УстановитьЦены(Команда)
	ФормаДокумента = ВладелецФормы;
	ОбъектДокумента = ФормаДокумента.Объект;
    
    ЗаполнитьДокументНаСервере(ОбъектДокумента);
    
    КопироватьДанныеФормы(ОбъектДокумента, ФормаДокумента.Объект);
    
    ФормаДокумента.Модифицированность = Истина;
    
    Закрыть();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьДокументНаСервере(ОбъектДокумента)
    
    Для каждого Стр Из ОбъектДокумента.Товары Цикл
        Если ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(Стр.ВидЦены,"Наименование") = "Оптовая" Тогда
            Стр.Цена = 100;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры
Показать


Всё равно не меняются цены в форме документа... Подскажите, пожалуйста, как же все же изменить цены в открытом документе УстановкаЦенНоменклатуры?
15. independ 1520 12.12.19 23:47 Сейчас в теме
(14) в (13) пример, он работает
16. zakidonoff 12.12.19 23:50 Сейчас в теме
(15) Только эта обработка меняет цены в закрытом документе.
А ТС хочет, как я понял, чтобы цены менялись в форме уже открытого.
18. Barok 12.12.19 23:55 Сейчас в теме
(16)не, всё норм, меняет в открытом документе
19. zakidonoff 12.12.19 23:56 Сейчас в теме
(14) У тебя на форме установки цен есть элемент под названием ДеревоЦен.
Именно он и отражает цены на форме. А заполняется это дерево при открытии формы.

Если хочешь обновить цены после изменения их в документе, нужно принудительно обновить дерево цен на клиенте.
Где-то вот тут:
&НаКлиенте
Процедура УстановитьЦены(Команда)
    ФормаДокумента = ВладелецФормы;
    ОбъектДокумента = ФормаДокумента.Объект;
    
    ЗаполнитьДокументНаСервере(ОбъектДокумента);
    ОбновитьДеревоЦен(ФормаДокумента);
...
&НаКлиенте
Процедура ОбновитьДеревоЦен(Команда)
...
КонецПроцеДуры
Показать
Оставьте свое сообщение

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