Гость
Форумы / [игнор отключен] [закрыт для гостей] / Регистры накопления. / 22 сообщений из 22, страница 1 из 1
24.07.2013, 23:49
    #38342972
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
Добрый день! Существует регистр накопления (Платформа 8.2) БронированиеТоваров . Был создан другой регистр накопления СвободныеОстатки . Соответственно, требуется при увеличении забронированного товара в регистре БронированиеТоваров уменьшить на такую же величину позиций в свободном остатке в регистре СвободныеОстатки , и наоборот.
Добавил в модуль объекта документа ПродажаТоваров инверсную копию движения по брони.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
Процедура ВыполнитьБронирование()  экспорт
	//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
	
	Записать();
	// регистр БронированиеТоваров Приход
	Для Каждого ТекСтрокаТовары Из Товары Цикл
		Движение = Движения.БронированиеТоваров.Добавить();
		Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
		Движение.Период = Дата;
		Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
		Движение.Склад = Склад;
		Движение.КоличествоЗабронированного = ТекСтрокаТовары.Количество;
	КонецЦикла;
	
	Движения.БронированиеТоваров.Записать();
	
	//зачистка старых движений
	Движения.СвободныеОстатки.Очистить();
	
	//инверсная копия движения по брони
	Для каждого ТекущЗапись Из Движения.БронированиеТоваров Цикл
	     НоваяЗапись = Движения.СвободныеОстатки.Добавить();
		 ЗаполнитьЗначенияСвойств(НоваяЗапись,ТекущЗапись);
		 //инверсия
		 Если НоваяЗапись.ВидДвижения = ВидДвиженияНакопления.Приход Тогда
		 	НоваяЗапись.ВидДвижения = ВидДвиженияНакопления.Расход
		 Иначе
		    НоваяЗапись.ВидДвижения = ВидДвиженияНакопления.Приход
		 КонецЕсли;
		    НоваяЗапись.КоличествоВСвободномОстатке = ТекущЗапись.КоличествоЗабронированного;
	КонецЦикла; 
	//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры


В итоге при отладке создаю новый документ реализации, бронирую товар. По регистру БронированиеТоваров движение есть, а по регистру СвободныеОстатки движений нет.
Не подскажете, что не доделал? Конфигурация разрабатывается на учебном курсе. Спасибо!
...
Рейтинг: 0 / 0
25.07.2013, 00:29
    #38342998
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
alexander4321,

вы записываете только движения по бронированию.
...
Рейтинг: 0 / 0
25.07.2013, 02:22
    #38343056
SashaM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
А вы записывайте движения

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Процедура ВыполнитьБронирование()  экспорт
	//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
	
	Записать();

	// Так же необходимо добавить очистку старых движений.
	Движения.БронированиеТоваров.Очистить();

	// регистр БронированиеТоваров Приход
	Для Каждого ТекСтрокаТовары Из Товары Цикл
		Движение = Движения.БронированиеТоваров.Добавить();
		Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
		Движение.Период = Дата;
		Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
		Движение.Склад = Склад;
		Движение.КоличествоЗабронированного = ТекСтрокаТовары.Количество;
	КонецЦикла;
	
	Движения.БронированиеТоваров.Записать();
	
	//зачистка старых движений
	Движения.СвободныеОстатки.Очистить();
	
	//инверсная копия движения по брони
	Для каждого ТекущЗапись Из Движения.БронированиеТоваров Цикл
	     НоваяЗапись = Движения.СвободныеОстатки.Добавить();
		 ЗаполнитьЗначенияСвойств(НоваяЗапись,ТекущЗапись);
		 //инверсия
		 Если НоваяЗапись.ВидДвижения = ВидДвиженияНакопления.Приход Тогда
		 	НоваяЗапись.ВидДвижения = ВидДвиженияНакопления.Расход
		 Иначе
		    НоваяЗапись.ВидДвижения = ВидДвиженияНакопления.Приход
		 КонецЕсли;
		    НоваяЗапись.КоличествоВСвободномОстатке = ТекущЗапись.КоличествоЗабронированного;
	Коне[FIXED][/FIXED]цЦикла;

	// А вот здесь запишем движения.
	Движения.СвободныеОстатки.Записать();

	//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
...
Рейтинг: 0 / 0
25.07.2013, 07:13
    #38343108
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
SashaM // А вот здесь запишем движения.
Движения.СвободныеОстатки.Записать();
Спасибо! Заработало.
...
Рейтинг: 0 / 0
25.07.2013, 22:42
    #38344438
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
Выше была создана запись движения в регистре СвободныеОстатки при бронировании из самого документа продажи (в модуле документа ПродажаТоваров). Но в созданной конфигурации предусмотрена еще возможность бронирования товара по документу снаружи (не из самого документа). Данная процедура описана в модуле менеджера, вот ее код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Процедура ВыполнитьБронировать(ТекДок)   экспорт

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

		 
		 КонецЦикла;
КонецПроцедуры


Не совсем хорошо представляю, где находится этот модуль менеджера. Как видно из приведенного кода, то запись в регистр БронированиеТоваров здесь происходит без строки кода
Код: sql
1.
Движения.БронированиеТоваров.Записать();

, как было в модуле документа ПродажаТоваров . Более того, из модуля менеджера не могу обратиться к свойству Движения. .
Попробовал собрать код наподобие того, что получилось в модуле документа ПродажаТоваров .
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
НабЗап = РегистрыНакопления.СвободныеОстатки.СоздатьНаборЗаписей();
		 НабЗап.Отбор.Регистратор.Установить(ТекДок);
		 
		 Для каждого ТекСтр  Из ТекДок.Товары Цикл
		 
		 	 Движение = НабЗап.Добавить();
			 ЗаполнитьЗначенияСвойств(Движение,ТекСтр);
			 
			 Если Движение.ВидДвижения = ВидДвиженияНакопления.Приход Тогда
			      Движение.ВидДвижения = ВидДвиженияНакопления.Расход
			 иначе 
			 	  Движение.ВидДвижения = ВидДвиженияНакопления.Приход			 
			 КонецЕсли; 
		    
		 КонецЦикла; 


Вставил этот код в конец процедуры в модуле менеджера. При выполнении бронирования снаружи этот код не производит записи в регистр СвободныеОстатки . Как можно исправить это? Спасибо!
...
Рейтинг: 0 / 0
26.07.2013, 01:17
    #38344516
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
alexander4321,
Не совсем хорошо представляю, где находится этот модуль менеджера
Если проводить аналогию с ООП, то модуль менеджера - это модуль класса документа, а модуль объекта - это модуль конкретного экземпляра документа. Таким образом, в модуле менеджера не доступен контекст объекта. Там размещаются статические методы, общие для всех экземпляров документов. Поэтому свойство "Движения" там недоступно, как и все остальное, связанное с конкретным документом.
Как видно из приведенного кода, то запись в регистр БронированиеТоваров здесь происходит без строки кода
покажите где происходит запись, если вам видно
...
Рейтинг: 0 / 0
26.07.2013, 15:48
    #38345456
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
javapeckerпокажите где происходит запись, если вам видно
Вот код, который преподаватель добавлял в модуль менеджера
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Процедура ВыполнитьБронировать(ТекДок)   экспорт

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

		 
		 КонецЦикла;
КонецПроцедуры


В коде действительно нет строки с командой Записать . Вспомнил, что он создавал отдельную команду и назвал ее ЗабронироватьСнаружи . Предполагаю, что эта команда и запускала на исполнение приведенный код. Если так, то, по всей видимости, мне нужно, чтобы эта же команда запускала исполнение дописанного мной кода? Вечером дома покопаюсь. Иной раз доходит как до утки - на третьи сутки.
...
Рейтинг: 0 / 0
26.07.2013, 16:07
    #38345516
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
alexander4321,
область видимости никто не отменял, после выхода из процедуры "ВыполнитьБронировать(ТекДок)" набор записей будет уничтожен. И ничего записано не будет.
...
Рейтинг: 0 / 0
26.07.2013, 17:13
    #38345701
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
javapecker, поковыряюсь еще вечером, может что-нибудь увижу. Код преподавателя из модуля менеджера же исполнялся каким-то образом. Если ничего не получится, то буду в понедельник на консультации узнавать, как нужно было делать.
...
Рейтинг: 0 / 0
26.07.2013, 18:02
    #38345814
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
alexander4321,
Код преподавателя из модуля менеджера же исполнялся каким-то образом
вы на 100% в этом уверены? У вас есть конфигурация, в которой этот код выполняется?
...
Рейтинг: 0 / 0
26.07.2013, 21:11
    #38346077
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
javapecker, могу отправить выгрузку. Работает, только что проверял. Напишите, если нужна выгрузка.
...
Рейтинг: 0 / 0
26.07.2013, 22:00
    #38346099
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
В документе ПродажаТоваров была создана команда ЗабронироватьСнаружи .

В модуле этой команде ЗабронироватьСнаружи присутствуют следующие процедуры:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	
	ВызватьБронирование(ПараметрКоманды);
	
КонецПроцедуры


&НаСервере
Процедура ВызватьБронирование(МассивДок)
        Для каждого СсылкаНаДок Из МассивДок Цикл
		      Документы.ПродажаТоваров.ВыполнитьБронировать(СсылкаНаДок);
		КонецЦикла; 
КонецПроцедуры // ВызватьБронирование()



Получается, что при нажатии кнопки ЗабронироватьСнаружи исполняется процедура на клиенте, которая вызывает процедуру на сервере модуля команды, а та в свою очередь вызывает процедуру ВыполнитьБронирование модуля документа ПродажаТоваров . Еще раз привожу процедуру модуля документа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
Процедура ВыполнитьБронирование()  экспорт
	//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
	
	Записать();
	// регистр БронированиеТоваров Приход
	Для Каждого ТекСтрокаТовары Из Товары Цикл
		Движение = Движения.БронированиеТоваров.Добавить();
		Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
		Движение.Период = Дата;
		Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
		Движение.Склад = Склад;
		Движение.КоличествоЗабронированного = ТекСтрокаТовары.Количество;
	КонецЦикла;
	
	Движения.БронированиеТоваров.Записать();
	
	//зачистка старых движений
	Движения.СвободныеОстатки.Очистить();
	
	//инверсная копия движения по брони
	Для каждого ТекущЗапись Из Движения.БронированиеТоваров Цикл
		 НоваяЗапись = Движения.СвободныеОстатки.Добавить();
		 ЗаполнитьЗначенияСвойств(НоваяЗапись,ТекущЗапись);
		 //инверсия
		 Если НоваяЗапись.ВидДвижения = ВидДвиженияНакопления.Приход Тогда
		 	НоваяЗапись.ВидДвижения = ВидДвиженияНакопления.Расход
		 Иначе
			НоваяЗапись.ВидДвижения = ВидДвиженияНакопления.Приход
		 КонецЕсли;
			НоваяЗапись.КоличествоВСвободномОстатке = ТекущЗапись.КоличествоЗабронированного;
		КонецЦикла; 
		Движения.СвободныеОстатки.Записать();
	//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры



Насколько я понял, движения по регистрам БронированиеТоваров и СвободныеОстатки как раз и записывает процедура модуля объекта ПродажаТоваров ВыполнитьБронирование , только при бронировании из документа продажи эта процедура вызывается непосредственно, а при бронировании снаружи процедура вызывается из модуля команды ЗабронироватьСнаружи .
Но у меня при запуске конфигурации получается, что, если забронировать товар изнутри документа, то процедура нормально отрабатывает, и движения правильно записываются в оба регистра СвободныеОстатки и БронированиеТоваров . Но, когда эту же процедуру вызываю из модуля команды ЗабронироватьСнаружи , то ничего не пишется в регистры.
Не понимаю, как так может быть. Могу отправить выгрузку базы. Спасибо!
...
Рейтинг: 0 / 0
26.07.2013, 23:11
    #38346125
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
alexander4321,
а при бронировании снаружи процедура вызывается из модуля команды ЗабронироватьСнаружи. Но, когда эту же процедуру вызываю из модуля командыснаружи вызывается другая процедура, а не та же самая. У них имена разные, и находятся они в разных местах. Процедура, которая работает, находится в модуле объекта, и называется ВыполнитьБронирование(). Процедура, которая не работает, находится в модуле менеджера, и называется ВыполнитьБронировать(ТекДок). Вот в ней наборы записей нужно записывать, а они у вас не записываются.
...
Рейтинг: 0 / 0
26.07.2013, 23:40
    #38346134
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
javapeckerВыполнитьБронировать(ТекДок)
Точно, невнимательно смотрел.
Получается, записал неправильно код в процедуре ВыполнитьБронировать . Вот оригинальный код (то, что преподаватель написал):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Процедура ВыполнитьБронировать(ТекДок)   экспорт

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

		 
		 КонецЦикла; 
	
	//запись набора записей в регистр
	     НаборЗаписей.Записать();
	

КонецПроцедуры


А вот код, который я дописывал в процедуре:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
Процедура ВыполнитьБронировать(ТекДок)   экспорт

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

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


Получается, что преподаватель сделал запись в регистр БронированиеТоваров в одном цикле, а я попытался добавить еще один цикл для записи в регистр СвободныеОстатки . Не подскажете, что не так в коде? Можно ли сделать записи сразу в оба регистра за один цикл? Спасибо!
...
Рейтинг: 0 / 0
27.07.2013, 01:20
    #38346170
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
alexander4321,
вы выкинули самое главное из процедуры преподавателя:
//запись набора записей в регистр
НаборЗаписей.Записать(); Можно ли сделать записи сразу в оба регистра за один цикл?Можно, создайте два набора записей перед циклом, в цикле запишите туда движения, в один регистр приход, в другой расход, после цикла запишите оба набора записей, и желательно это сделать в транзакции
...
Рейтинг: 0 / 0
27.07.2013, 02:02
    #38346178
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
javapecker,

Все работает. Спасибо!
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Процедура ВыполнитьБронировать(ТекДок)   экспорт

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

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

		 
		 КонецЦикла; 
		 НабЗап.Записать();
КонецПроцедуры


Единственное, что лень уже все в один цикл переписывать. Завтра на свежую голову перепишу. Еще раз спасибо!
...
Рейтинг: 0 / 0
28.07.2013, 10:19
    #38346544
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
Добрый день! При бронировании товара требуется также проверять количество товаров в свободном остатке по регистру СвободныеОстатки . Составил запрос с помощью конструктора запросов в процедуре ВыполнитьБронирование (делал по аналогии с тем, как преподаватель делал в процедуре ОбработкаПроведения ). Вот сама процедура:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
Процедура ВыполнитьБронирование()  экспорт
	//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
	
	Записать();
	// регистр БронированиеТоваров Приход
	Для Каждого ТекСтрокаТовары Из Товары Цикл
		Движение = Движения.БронированиеТоваров.Добавить();
		Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
		Движение.Период = Дата;
		Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
		Движение.Склад = Склад;
		Движение.КоличествоЗабронированного = ТекСтрокаТовары.Количество;
	КонецЦикла;
	
	Движения.БронированиеТоваров.Записать();
	
	//зачистка старых движений
	Движения.СвободныеОстатки.Очистить();
	
	//инверсная копия движения по брони
	Для каждого ТекущЗапись Из Движения.БронированиеТоваров Цикл
		 НоваяЗапись = Движения.СвободныеОстатки.Добавить();
		 ЗаполнитьЗначенияСвойств(НоваяЗапись,ТекущЗапись);
		 //инверсия
		 Если НоваяЗапись.ВидДвижения = ВидДвиженияНакопления.Приход Тогда
		 	НоваяЗапись.ВидДвижения = ВидДвиженияНакопления.Расход
		 Иначе
			НоваяЗапись.ВидДвижения = ВидДвиженияНакопления.Приход
		 КонецЕсли;
			НоваяЗапись.КоличествоВСвободномОстатке = ТекущЗапись.КоличествоЗабронированного;
		КонецЦикла; 
		Движения.СвободныеОстатки.Записать();
		
		//Контроль отрицательных свободных остатков
		 	//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ПродажаТоваровТовары.Номенклатура,
		|	ПродажаТоваровТовары.Ссылка.Склад
		|ПОМЕСТИТЬ ВТДок
		|ИЗ
		|	Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
		|ГДЕ
		|	ПродажаТоваровТовары.Ссылка = &Ссылка
		|	И (НЕ ПродажаТоваровТовары.Номенклатура.ВидНоменклатуры = &Услуга)
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ПРЕДСТАВЛЕНИЕ(СвободныеОстаткиОстатки.Номенклатура),
		|	СвободныеОстаткиОстатки.КоличествоВСвободномОстаткеОстаток
		|ИЗ
		|	РегистрНакопления.СвободныеОстатки.Остатки(
		|			,
		|			(Номенклатура, Склад) В
		|				(ВЫБРАТЬ
		|					ВТДок.Номенклатура,
		|					ВТДок.Склад
		|				ИЗ
		|					ВТДок КАК ВТДок)) КАК СвободныеОстаткиОстатки
		|ГДЕ
		|	СвободныеОстаткиОстатки.КоличествоВСвободномОстаткеОстаток < 0";
	Запрос.УстановитьПараметр("Ссылка",Ссылка);
	Запрос.УстановитьПараметр("Услуга",Перечисления.ВидыТоваров.Услуга);

	Результат = Запрос.Выполнить();

	ВыборкаДетальныеЗаписи = Результат.Выбрать();

	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Отказ = Истина;
		  Сообщение = Новый СообщениеПользователю;
		  Нехватка = -ВыборкаДетальныеЗаписи.КоличествоВСвободномОстаткеОстаток;
		  Сообщение.Текст = "В документе продажи "+Номер+" от "+Дата+" не хватает "+Нехватка+"шт. товара "+ВыборкаДетальныеЗаписи.НоменклатураПредставление;
		  Сообщение.Сообщить();
	КонецЦикла;

	//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

		
	//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры


Все прекрасно работает, только не происходит отказ бронирования. В процедуру ОбработкаПроведения передаются два параметра: Отказ, Режим
Код: sql
1.
Процедура ОбработкаПроведения(Отказ, Режим)


А в процедуру ВыполнитьБронирование никакие параметры не передаются
Код: sql
1.
Процедура ВыполнитьБронирование()


Попробовал, конечно, вставить туда эти параметры, но это не сработало. Не подскажете, как можно сделать так, чтобы бронирование все таки не выполнялось при отрицательном количестве свободных остатков? Спасибо!
...
Рейтинг: 0 / 0
28.07.2013, 14:24
    #38346611
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
alexander4321,
Если процедура ВыполнитьБронирование() выполняется из обработки проведения, добавьте в ее определение параметр "Отказ" и передайте в нее параметр "Отказ" обработки проведения. Если внутри процедуры вы установите его в истину, транзакция обработки проведения откатится, и в регистры ничего не запишется. И посмотрите где-нибудь как проверять остатки, ваш запрос вернет только строки, у которых остаток меньше нуля, а таких, по вашим условиям, вообще не должно быть.
...
Рейтинг: 0 / 0
30.07.2013, 07:23
    #38348082
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
javapecker,

не успел я до консультации доделать. Вчера на консультации преподаватель показывал, что действительно нужно было использовать транзакцию. Спасибо!
...
Рейтинг: 0 / 0
30.07.2013, 11:08
    #38348258
AHDP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
alexander4321,

Вложенную транзакцию?
...
Рейтинг: 0 / 0
30.07.2013, 11:18
    #38348283
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
AHDP,
не вложенную, у него там в модуле менеджера есть процедура, о ней речь, вызывается мимо обработки проведения.
...
Рейтинг: 0 / 0
30.07.2013, 11:40
    #38348335
AHDP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регистры накопления.
А в чем прикол делать ещё одну транзакцию, не используя обработку проведения?
...
Рейтинг: 0 / 0
Форумы / [игнор отключен] [закрыт для гостей] / Регистры накопления. / 22 сообщений из 22, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]