Записать реквизит при записи документа

1. Drizer2000 14 26.10.11 21:51 Сейчас в теме
Есть задачка вывести в журнал документа цены номенклатуры из документа.
Для этого добавил в шапку документа строковый реквизит "Цены" и пробую записать в него значения цен при записи документа.
Так вот по-нормальному не получается это сделать, если я использую процедуру:
Процедура ПередЗаписью()
//Здесь я собираю цены
Цены=ЦеныДокумента;
КонецПроцедуры
Для уже сохраненного документа и забитых цен все нормально получается, а вот если добавляешь новую цену и записываешь документ,то цена в журнале не отображается, пока не пересохранишь документ повторно.
Если использую процедуру ПриЗаписи(), то после записи документа, при закрытии документа выскакивает еще одно сообщение, что документ был изменен и хотите ли вы его сохранить.
Подскажите обойти такие проблемы, чтобы реквизит при записи правильно записывался без пересохранений.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. VaneSyS 26.10.11 22:30 Сейчас в теме
А ЦеныДокумента - не равны нули в этой процедуре?
И реквизит "Цены" не пробовал изменять не перед записью, а после окончания редактирования таб. части?
Но все таки мне кажется, что проблема именно в первом пункте)
4. Drizer2000 14 26.10.11 22:35 Сейчас в теме
(2) VaneSyS, нет не равны нулю, я бы такое заметил))
Захожу в документ устанавливаю цену, провожу документ и цена не появляется в журанле, еще раз захожу в документ,документ еще раз сохраняю и цена появляется.
Посмотрел подобную задачку в ЗУП, там они они выводят в строковый реквизит шапки перечень сотрудников из документа, используют процедуру ПередЗаписью() и у там все работает. Бред какой-то, у меня практически также и не работает.
3. Octopus 338 26.10.11 22:30 Сейчас в теме
Ну если уж добавляете в процедуру ПередЗаписью, то следует понимать, что в момент ее вызова измененые данные в форме документа еще не сохранены, следовательно реквизит будет заполнен по данным документа до внесения изменений.

Используйте процедуру ПриЗаписи()
6. Drizer2000 14 26.10.11 22:38 Сейчас в теме
(3) Octopus, такая же конструкция в ЗУП работает и, если я использую метод Призаписи() то при закрытии документа выдается сообщение о том что документ был изменен и хотите ли вы его сохранить.
5. Octopus 338 26.10.11 22:35 Сейчас в теме
Причем этих процедур две - одна в форме документа, вторая - в модуле объекта. Вам нужна вторая.
7. Octopus 338 26.10.11 22:39 Сейчас в теме
Метод надо прописывать не в модуле формы документа, а в модуле объекта
8. aqualife 26.10.11 22:41 Сейчас в теме
модуль объекта передзаписью()
9. megaandr 26.10.11 22:41 Сейчас в теме
Как ты общую цену считаешь? Ты случайно к реквизитам табличной части обращаешся не через ссылку на этот документ?
12. Drizer2000 14 26.10.11 23:00 Сейчас в теме
(9) megaandr, Видимо в этом и есть затык, я получал цены через ссылку.
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

	ЗапросСуммы = Новый Запрос;
	ЗапросСуммы.Текст = 	
	"ВЫБРАТЬ
	|СУММА(АктПриемкиСоставПоставки.МассаБрутто - АктПриемкиСоставПоставки.Партия.МассаТары) КАК Сумма,
	|АктПриемкиСоставПоставки.Цена
	|ИЗ
	|	Документ.АктПриемки.СоставПоставки КАК АктПриемкиСоставПоставки
	|ГДЕ
	|	АктПриемкиСоставПоставки.Ссылка = &Ссылка
	|
	|СГРУППИРОВАТЬ ПО
	|	АктПриемкиСоставПоставки.Цена";

	ЗапросСуммы.УстановитьПараметр("Ссылка", Ссылка);
	Результат = ЗапросСуммы.Выполнить().Выгрузить();
	ИтогоНетто = Результат.Итог("Сумма");
	Цена1="";
	Поз=0;
	Разделитель="";
	Для Каждого Строка ИЗ Результат Цикл
		Если Поз>0 Тогда
			Разделитель="; ";
		КонецЕсли;
		Цена1=Цена1+Разделитель+Строка.Цена;
		Поз=Поз+1;    		
	КонецЦикла;
	Цены=Цена1;
КонецПроцедуры
Показать
13. Vladimirrr 2 26.10.11 23:11 Сейчас в теме
(12) если реквизит документа "Цены" и это правда код из модуля объекта, то все должно работать. Попробуй отладчиком пройтись до конца записи, может где обнуляется или переменная с таким же именем встречается.
20. Stalnoff 28.10.11 18:48 Сейчас в теме
(12) Drizer2000,
Такой запрос собирает старую информацию из базы данных, до записи в нее новых данных документа. Отсюда и такое поведение: при повторной записи запрос читает данные, записанные в первый раз, и по этому все нормально.
10. Drizer2000 14 26.10.11 22:42 Сейчас в теме
Я так и делаю, использую процедуру в модуле объекта. Какой-то мелкий затык есть, но ни как не найду где подвох.
11. megaandr 26.10.11 22:53 Сейчас в теме
14. megaandr 26.10.11 23:14 Сейчас в теме
Конечно в этом затык.Обращаешся к старым данным.

Сделай так

Цены = СоставПоставки.Итог("Цена");


а еще лучше выгружай табличную часть в таблицу значений и используй ее в качестве источника данных в запросе
15. megaandr 26.10.11 23:22 Сейчас в теме
Замени свой код на следующий:

 
   ТЗ = СоставПоставки.Выгрузить();

   ЗапросСуммы = Новый Запрос;
   ЗапросСуммы.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
   ЗапросСуммы.Текст = "ВЫБРАТЬ * ПОМЕСТИТЬ ТЗ ИЗ &ТЗ КАК ТЗ";
   ЗапросСуммы.УстановитьПараметр("ТЗ", ТЗ);
   ЗапросСуммы.Выполнить();

   ЗапросСуммы.Текст =    
   "ВЫБРАТЬ
   |СУММА(АктПриемкиСоставПоставки.МассаБрутто - АктПриемкиСоставПоставки.Партия.МассаТары) КАК Сумма,
   |АктПриемкиСоставПоставки.Цена
   |ИЗ
   |   ТЗ КАК АктПриемкиСоставПоставки
   |
   |СГРУППИРОВАТЬ ПО
   |   АктПриемкиСоставПоставки.Цена";

   Результат = ЗапросСуммы.Выполнить().Выгрузить();
   ИтогоНетто = Результат.Итог("Сумма");
   Цена1="";
   Поз=0;
   Разделитель="";
   Для Каждого Строка ИЗ Результат Цикл
      Если Поз>0 Тогда
         Разделитель="; ";
      КонецЕсли;
      Цена1=Цена1+Разделитель+Строка.Цена;
      Поз=Поз+1;          
   КонецЦикла;
   Цены=Цена1;
КонецПроцедуры
Показать
16. megaandr 26.10.11 23:37 Сейчас в теме
Или вот так:

ИтогоНетто = 0;
Цены = "";
Для Каждого стр Из СоставПоставки Цикл
    ИтогоНетто = ИтогоНетто +(стр.МассаБрутто - стр.Партия.МассаТары);
    Цены = Цены + стр.Цена + ";";
КонецЦикла

Показать
17. Drizer2000 14 26.10.11 23:59 Сейчас в теме
(16) megaandr, огромное спасибо за помощь, реально выручил. Еще спасибо за код, любопытно для меня использование ТЗ в запросах, эту тему мне тоже нужно копать. Переделал по своему , все теперь работает:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
 	ИтогоНетто1=0;
	Для каждого СтрокаТЗ ИЗ СоставПоставки Цикл
		Партия=СтрокаТЗ.Партия;
		ИтогоНетто1=ИтогоНетто1+(СтрокаТЗ.МассаБрутто-Партия.МассаТары); 		
	КонецЦикла;	
	ИтогоНетто=ИтогоНетто1;
	ТЗ=СоставПоставки.Выгрузить(,"Цена");
	ТЗ.Свернуть("Цена");
	Цена1="";
	Разделитель="";
	Поз=0;
	Для каждого Строка ИЗ ТЗ Цикл
		Если Строка.Цена>0 Тогда
			Если Поз>0 Тогда
				Разделитель="; ";
			КонецЕсли;
			Цена1=Цена1+Разделитель+Строка.Цена;
			Поз=Поз+1;
		Конецесли;
	КонецЦикла;
	Цены=Цена1;
КонецПроцедуры
Показать

Надо же было так ступить, ведь даже не смотрел на то,что у меня в запросе творится. нужно учить матчасть.
18. megaandr 27.10.11 00:01 Сейчас в теме
19. rustamsmax 89 28.10.11 16:28 Сейчас в теме
Для отобравжение дополнительные данные в списках в обычном у элемента Таб. приложение есть Событие ПриВыводеСтроки

1. Надо добавить доп. колонку в таб.
2. в Процедуры ПриВыводеСтроки надо писать коды

ЗначениеДоп = "";
ОформлениеСтроки.Ячейки.ИмяДобКолонки.УстановитьТекст(ЗначениеДоп);
и все
21. user1195285 25.12.23 10:32 Сейчас в теме
Пишу слишком поздно для этой темы, но все же может кто-то гуглит решение и в данный момент)

В частных случаях можно в обработчике "Перед записью" модуля объекта передать свойство через структуру ДополнительныеСвойства, так как она позволяет передать данные между обработчиками событий, например и заполнить свой реквизит сразу в этом обработчике, например:
Если не ОрдераСозданы Тогда
ДополнительныеСвойства.Вставить("СоздатьОрдера",Истина);
ОрдераСозданы = Истина;
КонецЕсли;


А уже в обработчике "При записи" проверять наличие этого свойства в этой структуре:

Если ДополнительныеСвойства.Свойство("СоздатьОрдера") Тогда
//Свой код
КонецЕсли;


Если вернет истину, то можно выполнять по условию какие-либо свои действия
BenDigget; +1 Ответить
Оставьте свое сообщение

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