Двойная запись

1. Emiliya_Emili 17.05.15 09:58 Сейчас в теме
Помогите решить проблему с двойной записью

если строку не закомментировать то происходит двойная запись, если закомментировать документ состояние абонемента не проводится

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)

	Если Объект.Единицы=Истина Тогда 
		 ПередЗаписьюНаСервере(Отказ, ПараметрыЗаписи);
	Иначе
		
	КонецЕсли;

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

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ПараметрыЗаписи)
	
	Абонемент = Объект.Клиент.ТекущийАбонемент;

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

Показать


код модуля объекта
Процедура ОбработкаПроведения(Отказ, Режим)
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ПродажаТоваров.Товар,
		|	СУММА(ПродажаТоваров.Количество) КАК Количество,
		|	МАКСИМУМ(ЕСТЬNULL(ТоварооборотОстатки.КоличествоОстаток, 0)) КАК КоличествоОстаток
		|ИЗ
		|	Документ.ПродажаТоваровИУслуг.Товары КАК ПродажаТоваров
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Товарооборот.Остатки(&МоментВремени) КАК ТоварооборотОстатки
		|		ПО ПродажаТоваров.Товар = ТоварооборотОстатки.Товар
		|ГДЕ
		|	ПродажаТоваров.Ссылка = &Ссылка
		|
		|СГРУППИРОВАТЬ ПО
		|	ПродажаТоваров.Товар";
	
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
	РезультатЗапроса = Запрос.Выполнить();
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	Движения.Товарооборот.Записывать=Истина;
	
	
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		ЕСЛИ ВыборкаДетальныеЗаписи.Количество>ВыборкаДетальныеЗаписи.КоличествоОстаток Тогда
			Сообщить("Недостаточное количество товара " + ВыборкаДетальныеЗаписи.Товар+" необходимо "
			+ВыборкаДетальныеЗаписи.Количество+". В наличии "+ВыборкаДетальныеЗаписи.КоличествоОстаток);
			Отказ=Истина;
			Движения.Товарооборот.Записывать=Ложь;
		КонецЕсли;
		Если Отказ тогда
			Продолжить;
		КонецЕсли;
		
		СуммаПоДокументу1 = 0;
		 Для Каждого ТекСтрокаТовары Из Товары Цикл
			СуммаПоДокументу1 = СуммаПоДокументу1+ТекСтрокаТовары.Сумма;
		КонецЦикла;
		
		СуммаПоДокументу2 = 0;
		 Для Каждого ТекСтрокаУслугиИАбонементы Из УслугиИАбонементы Цикл
			СуммаПоДокументу2 = СуммаПоДокументу2+ТекСтрокаУслугиИАбонементы.Сумма;
		КонецЦикла;

			Движение=Движения.Товарооборот.Добавить();
			Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
			Движение.Период=Дата;
			Движение.Товар=ВыборкаДетальныеЗаписи.Товар;
			Движение.Количество=ВыборкаДетальныеЗаписи.Количество;
			Движение.Сумма= СуммаПоДокументу1+СуммаПоДокументу2;
	КонецЦикла;
	
	
///////////////////////////////////////////////////////////
	
	
	// регистр ПродажиКлиентам 
	Движения.ПродажиКлиентам.Записывать = Истина;
	Для Каждого ТекСтрокаУслугиИАбонементы Из УслугиИАбонементы Цикл
		Движение = Движения.ПродажиКлиентам.Добавить();
		Движение.Период = Дата;
		Движение.Товар = ТекСтрокаУслугиИАбонементы.Услуга;
		Движение.Количесвто = ТекСтрокаУслугиИАбонементы.Количество;
		Движение.Сумма = Сумма;
		Движение.СуммаЕди = СуммаЕд;
		Движение.Клиент = Клиент;
		Движение.Сотрудник = Сотрудник;
	КонецЦикла;
	Для Каждого ТекСтрокаТовары Из Товары Цикл
		Движение = Движения.ПродажиКлиентам.Добавить();
		Движение.Период = Дата;
		Движение.Товар = ТекСтрокаТовары.Товар;
		Движение.Количесвто = ТекСтрокаТовары.Количество;
		Движение.Сумма = Сумма;
		Движение.СуммаЕди = СуммаЕд;
		Движение.Клиент = Клиент;
		Движение.Сотрудник = Сотрудник;
	КонецЦикла;
КонецПроцедуры
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Salavat 13 17.05.15 10:17 Сейчас в теме
(1) Emiliya_Emili, ес-но - если ПередЗаписью записывать.
вобще удивляюсь - как переполнения не вышло.
13. ИНТЕГРА 25 17.05.15 19:34 Сейчас в теме
(1) Emiliya_Emili, архитектура - жуть. Помочь просто нечем. Пишите ТЗ, тогда может помогут добрые люди.
14. ture 606 17.05.15 19:59 Сейчас в теме
(13) ИНТЕГРА, почему жуть? Да. Это не по шаблону из книжке. Да. Еще многое надо изменить, зато скоро придет понимание как решать подобные задачи, на собственных стараниях
15. ИНТЕГРА 25 18.05.15 07:27 Сейчас в теме
(14) ture, шаблон нужно брать не из книжки, а разрабатывать под каждую конкретную задачу самостоятельно. Он-же паттерн. А потом уже код под него писать. А тут явно какая-то путаница - при записи одного документа проводить другой - это ни в какие ворота.
vovan_victory; +1 Ответить
27. ture 606 18.05.15 11:06 Сейчас в теме
(15) Здесь все правильно написано о шаблоне или паттерне (надо бы вообще на большее количество языков переводить одно слово, всегда прокатывает много раз сказать одно слово , но на разных языках).

Человек верно делает, что пробует все. Отличие 1С в том, что отработанный пример в 1С нельзя дополнить до идеала, надо все либо куда-то переносить либо удалять все и писать снова и по другому. В любом ООП таких шаблонов не найти. Нельзя в 1С вылезать решение, если не там написал. Шаблон как бог в 1С, утром встаешь и молишься на него. Увы.
87. ИНТЕГРА 25 19.05.15 03:53 Сейчас в теме
(27) ture,
Здесь все правильно написано о шаблоне или паттерне (надо бы вообще на большее количество языков переводить одно слово, всегда прокатывает много раз сказать одно слово , но на разных языках).

Это я для того чтоб всякий понял, что речь именно о паттернах проектирования, ибо термин "шаблон" может пониматься как угодно.

Человек верно делает, что пробует все. Отличие 1С в том, что отработанный пример в 1С нельзя дополнить до идеала, надо все либо куда-то переносить либо удалять все и писать снова и по другому. В любом ООП таких шаблонов не найти. Нельзя в 1С вылезать решение, если не там написал. Шаблон как бог в 1С, утром встаешь и молишься на него. Увы.

Тут стоит заменить "1С" на "1Сник", и тогда я подпишусь под каждым твоим словом :)
Не хочу конечно выглядеть бешанным фанатом 1С, но сколько уже можно на нее сваливать свои косяки. 1Сники почему-то считают, что им не нужно знать премудростей теории программирования, а потом обвиняют ее-же в своих бедах.
88. dj_serega 392 19.05.15 08:05 Сейчас в теме
(87) ИНТЕГРА,
1Сники почему-то считают...
я бы написал так "80% (а то и 90%) 1Сников почему-то считают..."
:)
ИНТЕГРА; +1 Ответить
17. vovan_victory 63 18.05.15 09:34 Сейчас в теме
(1) Emiliya_Emili,
если строку не закомментировать то происходит двойная запись


Абонемент = Объект.Клиент.ТекущийАбонемент;

// На 1 абонемент не может быть создано 2 документа  СостояниеАбонемента???
// Например абонемент открыт и абонемент закрыт!!  
18. Emiliya_Emili 18.05.15 09:51 Сейчас в теме
(17) vovan_victory, он дважды проводит документ продажи, поэтому у меня дважды вычитается посещения у клиента
19. vovan_victory 63 18.05.15 10:00 Сейчас в теме
(18) Emiliya_Emili, а если

Движения.ПродажиКлиентам.Записывать = Истина;
Движения.ПродажиКлиентам.Очистить();
21. Emiliya_Emili 18.05.15 10:18 Сейчас в теме
23. vovan_victory 63 18.05.15 10:32 Сейчас в теме
(21) Emiliya_Emili, а так

Абонемент = Объект.Клиент.ТекущийАбонемент;

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

 Документ=Результат.Выбрать();
 Пока Документ.Следующий() Цикл
       
            ДокументОбъект = Документ.ПолучитьОбъект();
            Если ДокументОбъект.Единицы>=Объект.СуммаЕд Тогда
                ДокументОбъект.Единицы=ДокументОбъект.Единицы-Объект.СуммаЕд;
                ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
            КонецЕсли;
КонецЦикла;

Показать
24. Emiliya_Emili 18.05.15 10:52 Сейчас в теме
(23) vovan_victory, пишет что не задано значение параметра абонемент
25. Emiliya_Emili 18.05.15 10:58 Сейчас в теме
(23) vovan_victory, и опять ошибка
{(1)}: Значение не является значением объектного типа

в другом запросе из-за этого же ничего не работает
26. vovan_victory 63 18.05.15 11:05 Сейчас в теме
(25) Emiliya_Emili,что выдает?

Сообщить(ТипЗнч(Объект.Клиент.ТекущийАбонемент));
32. Emiliya_Emili 18.05.15 11:21 Сейчас в теме
(26) vovan_victory, Состояние абонемента
33. vovan_victory 63 18.05.15 12:01 Сейчас в теме
(32) Emiliya_Emili,Состояние абонемента - это что? документСссылка?
34. Emiliya_Emili 18.05.15 12:10 Сейчас в теме
(33) vovan_victory, это то что вывело сообщение в результате этой строки
Сообщить(ТипЗнч(Объект.Клиент.ТекущийАбонемент));
35. vovan_victory 63 18.05.15 12:13 Сейчас в теме
(34) Emiliya_Emili, а в отладчике точнее можете посмотреть?
36. Emiliya_Emili 18.05.15 12:19 Сейчас в теме
(35) vovan_victory, в отладчике он показывает ссылку на документ состояние абонемента
28. vovan_victory 63 18.05.15 11:09 Сейчас в теме
(25) Emiliya_Emili, и еще что выдает

Сообщить(ТипЗнч(Объект.Клиент));
3. Salavat 13 17.05.15 10:20 Сейчас в теме
или это всёже разные документы?
перед записью одного - нужно провести другой. выбранный.

чтото запутанно, както.
4. Emiliya_Emili 17.05.15 10:26 Сейчас в теме
5. Salavat 13 17.05.15 10:36 Сейчас в теме
(4) Emiliya_Emili, прежде чем есть - лучше знать, что есть собирается.
иначе - отравление можно получить.
7. Emiliya_Emili 17.05.15 10:40 Сейчас в теме
(5) Salavat, вот эта строка "ДокументОбъект.Единицы=ДокументОбъект.Единицы-Объект.СуммаЕд;" вычитает кол-во посещений которое хранится в документе состояние абонемента, следом за ней я пытаюсь провести документ состояние абонемента, чтобы сохранить ихменения
8. Salavat 13 17.05.15 10:42 Сейчас в теме
(7) Emiliya_Emili, насколько я понял - это один и тот же документ.
тогда - ПриЗаписи ничего записывать/проводить ненужно. оно и так записывается (если Отказ = Ложь, конечно).
9. Emiliya_Emili 17.05.15 10:50 Сейчас в теме
(8) Salavat, процедура пере записью хранится в документе продажи, а записываю я документ состояние абонемента
10. Salavat 13 17.05.15 10:54 Сейчас в теме
(9) Emiliya_Emili, тогда, нужно расшифровать дальше - что/где/как. ну и Провести точно надо будет.
6. Salavat 13 17.05.15 10:37 Сейчас в теме
и - лучше всёже, чёрный хлеб есть.
чем чтото навороченное.

для результативности - я имею ввиду.
11. Salavat 13 17.05.15 10:56 Сейчас в теме
только подозреваю - лучше всёже - ПослеЗаписи проводить другой документ.
зависит - от взаимосвязей нужных/имеющихся - что завязано на чём.
12. Emiliya_Emili 17.05.15 13:17 Сейчас в теме
(11) Salavat, а как мне быть с параметрами, в процедуре после записи не отказа,
Иначе
	Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " ед. осталось " + ДокументОбъект.Единицы + ".");
	Отказ=Истина;
КонецЕсли;
16. vovan_victory 63 18.05.15 09:23 Сейчас в теме
По моему, в обработке проведения можно было использовать новую методику проведения по регистру накопления "Товарооборот". Сначала делаем движения в регистр, потом запросом получаем остатки товара по которому ушли в минус.Если такие строки есть, Отказ = Истина. Так же , для правильности ,перед списанием, не плохо было бы установить блокировки на то, что списываем.
20. Fox-trot 158 18.05.15 10:04 Сейчас в теме
может индексация исправит положение, если у тя там бардак в базе
22. Emiliya_Emili 18.05.15 10:18 Сейчас в теме
(20) Fox-trot, а можно поподробнее
29. ditp 91 18.05.15 11:10 Сейчас в теме
Я вот одного понять не могу.

Зачем городить невесть что для того, чтобы получить Объект документа, ссылка на который известна?

Если ЗначениеЗаполнено(Объект.Клиент.ТекущийАбонемент) Тогда
    Документ = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект()
Иначе
    // нет абонемента
КонецЕсли;
30. vovan_victory 63 18.05.15 11:12 Сейчас в теме
(29) ditp, я вот например тоже не пойму зачем получать все документы

Документ=Документы.СостояниеАбонемента.Выбрать();
    Пока Документ.Следующий() Цикл


но у автора видать какая то своя идея
31. ture 606 18.05.15 11:13 Сейчас в теме
(29) ditp, это ведь риторический вопрос? вы ведь не серьезно?

Просто пока каша в голове.
Данные можно опрашивать через объектную модель и запросами. Одновременно. И это пока не отложилось в голове.
37. vovan_victory 63 18.05.15 12:22 Сейчас в теме
Emiliya_Emili, а почему Вы не хотите сделать как вам рекомендовал (29)ditp?


ДокументОбъект= Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
 Если ДокументОбъект.Единицы>=Объект.СуммаЕд Тогда
ДокументОбъект.Единицы=ДокументОбъект.Единицы - Объект.СуммаЕд;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
ОбъекткЛ.Записать();
            Иначе
                Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " ед. осталось " + ДокументОбъект.Единицы + ".");
                Отказ=Истина;
            КонецЕсли;
Показать
38. Emiliya_Emili 18.05.15 12:41 Сейчас в теме
(37) vovan_victory, при попытке провести документ получаю следующее

{Документ.ПродажаТоваровИУслуг.Форма.ФормаДокумента.Форма(372)}: Ошибка при вызове метода контекста (Выполнить)
Результат = Запрос.Выполнить();
по причине:
{(1, 92)}: Не задано значение параметра "Абонемент"
ВЫБРАТЬ Документ.Ссылка ИЗ Документ.СостояниеАбонемента КАК Документ ГДЕ Документ.Ссылка = <<?>>&Абонемент И Документ.Проведен И НЕ Документ.По
39. vovan_victory 63 18.05.15 12:44 Сейчас в теме
(38) Emiliya_Emili, если Вы используете вариант ditp, то ни какого там запроса не нужно. Используйте только то, что написано в предыдущем посте
41. Emiliya_Emili 18.05.15 12:48 Сейчас в теме
(39) vovan_victory, у меня возникает одна интересная ошибка, если клиент новый и он только покупает новый абонемент то вот что выдает программа
{Документ.ПродажаТоваровИУслуг.Форма.ФормаДокумента.Форма(377)}: Ошибка при вызове метода контекста (ПолучитьОбъект)
			ДокументОбъект= Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
по причине:
Элемент не выбран!



что с этим делать
42. vovan_victory 63 18.05.15 12:52 Сейчас в теме
(41) Emiliya_Emili,
Если ЗначениеЗаполнено(Объект.Клиент.ТекущийАбонемент) Тогда
    ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект()
Иначе
    ДокументОбъект = Документы.СостояниеАбонемента.СоздатьДокумент(); 
    //Нужно заполнить реквизиты нового документа
..........................
   ДокументОбъект.Записать();
КонецЕсли; 
Показать
43. Emiliya_Emili 18.05.15 13:05 Сейчас в теме
(42) vovan_victory, может мне не создавать документ а ссылаться на процедуру создания?

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

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Абонементы.Ссылка
		|ИЗ
		|	Справочник.Абонементы КАК Абонементы";
	
	ВыборкаДетальныеЗаписи1 = Запрос.Выполнить().Выбрать();
	
	Один=0;
	Пока  ВыборкаДетальныеЗаписи.Следующий()Цикл
		Пока  ВыборкаДетальныеЗаписи1.Следующий()Цикл
			Если ВыборкаДетальныеЗаписи.Услуга=ВыборкаДетальныеЗаписи1.Ссылка Тогда
				Один=1; //да
				Прервать;
			Иначе
				Один=2; //нет
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	Возврат Один;
КонецФункции
 

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


у меня если клиент покупает абонемент то он либо продлевается либо создается новый
ну или скопировать эту часть

  Документ = Документы.СостояниеАбонемента.СоздатьДокумент();
		Документ.Дата=ТекущаяДата();
        Документ.Клиент=Клиент;
        Документ.Абонемент=Абонемент;
		Документ.СрокДействия=ДобавитьМесяц(ТекущаяДата(), Срок);
	    Документ.Состояние=Перечисления.СостояниеАбонемента.Действителен;
	    Документ.Единицы = Документ.Единицы + КолвоЕдиниц;
	    ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
		ОбъекткЛ.ТекущийАбонемент=Выборка.Ссылка;
		ОбъекткЛ.КоличествоЕдиницВНаличии=Документ.Единицы;
		ОбъекткЛ.Записать();
	    Документ.Записать(РежимЗаписиДокумента.Проведение);
Показать
44. vovan_victory 63 18.05.15 13:23 Сейчас в теме
(43) Emiliya_Emili, конечно оптимально использовать уже готовый код(если он есть). А задвоения у существующего документа пропали? Вопрос то по теме закрыт?
46. Emiliya_Emili 18.05.15 13:33 Сейчас в теме
(44) vovan_victory, я хотела для проверки создать нового клиента но ошибочка вылезла
48. vovan_victory 63 18.05.15 13:36 Сейчас в теме
(46) Emiliya_Emili, что за ошибка то?В какой момент появляется? Новый клиент - это кто?
51. Emiliya_Emili 18.05.15 13:38 Сейчас в теме
(48) vovan_victory, сообщение (41)
54. vovan_victory 63 18.05.15 13:42 Сейчас в теме
(51) Emiliya_Emili, у Вас во тут
ЗначениеЗаполнено(Объект.Клиент.ТекущийАбонемент)


что получается?
55. Emiliya_Emili 18.05.15 13:44 Сейчас в теме
(54) vovan_victory, значение истина тип булево
56. vovan_victory 63 18.05.15 13:48 Сейчас в теме
(55) Emiliya_Emili,

одна интересная ошибка, если клиент новый и он только покупает новый абонемент


если это новый документ, то должны перейти в "иначе"

пробуем так


    ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект()
Если ДокументОбъект  = неопределено Тогда

    ДокументОбъект = Документы.СостояниеАбонемента.СоздатьДокумент(); 
    //Нужно заполнить реквизиты нового документа
..........................
   ДокументОбъект.Записать();
КонецЕсли; 
57. Emiliya_Emili 18.05.15 13:52 Сейчас в теме
(56) vovan_victory, это ответ на сообщение 48, хотела проверить код который скинули
58. vovan_victory 63 18.05.15 13:55 Сейчас в теме
(57) Emiliya_Emili,да. Наверно все таки так будет работать. Пытаемся получить объект по ссылке. Если ссылка пустая, то вернет значение НЕОПРЕДЕЛЕНО иначе вернет документОбъект
59. Emiliya_Emili 18.05.15 13:59 Сейчас в теме
(58) vovan_victory, у меня с созданием ничего не выйдет, так как мне нужно знать какой абонемент покупает человек а при покупки товара я это не узнаю, может будет лучше вывести сообщение о том что для начала нужно купить абонемент? тогда человек покупает абонемент и все работает
60. vovan_victory 63 18.05.15 14:03 Сейчас в теме
(59) Emiliya_Emili,я дума, что как Вам дальше поступить - это Вы должны выбрать сами. Если в случае отсутствия документа Вы хотите прервать выполнение процедуры, то
 
Если ДокументОбъект  = неопределено Тогда
Сообщение = Новый  СообщениеПользователю;
Сообщение.Текст = "......";
Сообщение.Сообщить();
Возврат;
КонецЕсли;
61. Emiliya_Emili 18.05.15 14:20 Сейчас в теме
(60) vovan_victory, попыталась но он просто игнорирует код, провел документ и все

			Если ЗначениеЗаполнено(Объект.Клиент.ТекущийАбонемент) Тогда
    			ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
				Если ДокументОбъект.Единицы>=Объект.СуммаЕд Тогда
					ДокументОбъект.Единицы=ДокументОбъект.Единицы - Объект.СуммаЕд;
					ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
					ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
					ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
					ОбъекткЛ.Записать();
	            Иначе
	                Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " ед. осталось " + ДокументОбъект.Единицы + ".");
	                Отказ=Истина;
	            КонецЕсли;
			Иначе
				//ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
				Если ДокументОбъект  = Неопределено Тогда
					Сообщение = Новый  СообщениеПользователю;
					Сообщение.Текст = "У клиента отсутствует абонемент, необходимо его приобрести. ";
					Сообщение.Сообщить();
					Возврат;
				КонецЕсли;
			КонецЕсли; 
Показать
62. ditp 91 18.05.15 14:25 Сейчас в теме
(61) Emiliya_Emili, в ветке
            Иначе
                //ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
                Если ДокументОбъект  = Неопределено Тогда
                    Сообщение = Новый  СообщениеПользователю;
                    Сообщение.Текст = "У клиента отсутствует абонемент, необходимо его приобрести. ";
                    Сообщение.Сообщить();
                    Возврат;
                КонецЕсли;
            КонецЕсли;
Показать

проверка
Если ДокументОбъект  = Неопределено Тогда
не нужна.
65. Emiliya_Emili 18.05.15 14:50 Сейчас в теме
(62) ditp, только надо добавить Отказ=Истина, а то он все равно проведет,
только теперь то же сообщение появляется при покупке абонемента
63. vovan_victory 63 18.05.15 14:29 Сейчас в теме
(61) Emiliya_Emili,

ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();//Пытаемся получить объект по ссылке

Сообщение = Новый  СообщениеПользователю;
Сообщение.Текст = "";

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

Если ЗначениеЗаполнено(Сообщение.Текст) Тогда
	Сообщение.Текст = Текст;
	Сообщение.Сообщить();
КонецЕсли; 
Показать
64. Emiliya_Emili 18.05.15 14:47 Сейчас в теме
(63) vovan_victory, и вот что я получаю, если пытаюсь провести документ а у клиента нет абонемента

{Документ.ПродажаТоваровИУслуг.Форма.ФормаДокумента.Форма(355)}: Ошибка при вызове метода контекста (ПолучитьОбъект)
ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();//Пытаемся получить объект по ссылке
по причине:
Элемент не выбран!
66. vovan_victory 63 18.05.15 14:54 Сейчас в теме
(64) Emiliya_Emili,еще раз .. вот это

Объект.Клиент.ТекущийАбонемент 

в отладчике чему равно и какой тип ????

Выделаяем в отладчике Объект.Клиент.ТекущийАбонемент. Потом Шифт+Ф9. Сделайте скрин
68. Emiliya_Emili 18.05.15 15:00 Сейчас в теме
(66) vovan_victory,
Прикрепленные файлы:
69. vovan_victory 63 18.05.15 15:04 Сейчас в теме
(68) Emiliya_Emili, вот при таком значении как на скрине

ЗначениеЗаполнено(Объект.Клиент.ТекущийАбонемент)
47. Emiliya_Emili 18.05.15 13:34 Сейчас в теме
(44) vovan_victory, все еще списывает в два раза больше чем нужно
45. Emiliya_Emili 18.05.15 13:32 Сейчас в теме
(42) vovan_victory, как мне получить сведения какой абонемент покупает клиент если я не могу получить текущие данные?
50. vovan_victory 63 18.05.15 13:38 Сейчас в теме
(45) Emiliya_Emili, вот тут я даже не знаю что Вам ответить. Я не знаю как изначально у Вас все работает.
53. Emiliya_Emili 18.05.15 13:40 Сейчас в теме
(50) vovan_victory, да вроде все просто, клиент купил товар, и пытается оплачивать уже имеющимися на счету деньгами, эти деньги хранятся в документе состояние абонемента
40. vovan_victory 63 18.05.15 12:47 Сейчас в теме
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ПараметрыЗаписи)
ДокументОбъект= Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
 Если ДокументОбъект.Единицы>=Объект.СуммаЕд Тогда
 ДокументОбъект.Единицы=ДокументОбъект.Единицы - Объект.СуммаЕд;
 ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
 ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
 ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
 ОбъекткЛ.Записать();
    Иначе
   Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " ед. осталось " + ДокументОбъект.Единицы + ".");
   Отказ=Истина;
 КонецЕсли;
КонецПроцедуры
Показать
49. Emiliya_Emili 18.05.15 13:37 Сейчас в теме
может быть режим записи причиной проблемы?

ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
52. vovan_victory 63 18.05.15 13:39 Сейчас в теме
(49) Emiliya_Emili, ошибку покажите
67. Emiliya_Emili 18.05.15 14:57 Сейчас в теме
как получить данные для заполнения абонемента
на клиенте через текущие данные а на сервере?

Если ЗначениеЗаполнено(Объект.Клиент.ТекущийАбонемент) Тогда
	    ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
		   Если ДокументОбъект.Единицы>=Объект.СуммаЕд Тогда
			      ДокументОбъект.Единицы=ДокументОбъект.Единицы - Объект.СуммаЕд;
			      ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
			      ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
			      ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
			      ОбъекткЛ.Записать();
	   		 Иначе
			      Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " ед. осталось " + ДокументОбъект.Единицы + ".");
			      Отказ=Истина;
			 КонецЕсли;
	 Иначе
		АбонементОбъект=Абонемент();
		Если АбонементОбъект=1 Тогда
	        Клиент=Объект.Клиент;
			Абонемент=ТекущийДанные.Услуга;
			КолвоЕдиниц =ПолучитьЗначениеРеквизита(ТекущийДанные.Услуга,"КолвоЕд");
			Срок=ПолучитьЗначениеРеквизита(ТекущийДанные.Услуга,"Срок");
			ЗаполнитьАбонемент(Клиент, Абонемент, КолвоЕдиниц, Срок);
		ИначеЕсли АбонементОбъект=2 Тогда
			Сообщение = Новый  СообщениеПользователю;
			Сообщение.Текст = "У клиента отсутствует/не выбран абонемент, необходимо его приобрести/выбрать. ";
			Сообщение.Сообщить();
			Отказ=Истина;
			Возврат;
		КонецЕсли;
	КонецЕсли; 
Показать
70. vovan_victory 63 18.05.15 15:10 Сейчас в теме
(67) Emiliya_Emili, а где они хранятся?
71. Emiliya_Emili 18.05.15 15:49 Сейчас в теме
(70) vovan_victory, кто хранится? абонементы?
72. Emiliya_Emili 18.05.15 15:53 Сейчас в теме
(70) vovan_victory, данные об абонементах хранятся в справочнике абонементы
73. vovan_victory 63 18.05.15 15:55 Сейчас в теме
(72) Emiliya_Emili,Вы из справочника хотите брать данные для заполнения абоненмента?
75. Emiliya_Emili 18.05.15 16:00 Сейчас в теме
(73) vovan_victory, у меня данные об абонементах хранятся в справочнике, и из этого справочника я пытаюсь получить данные
74. Emiliya_Emili 18.05.15 15:58 Сейчас в теме
(70) vovan_victory, вот в этой части кода я пытаюсь списывать деньги со счета клиента

Если ЗначениеЗаполнено(Объект.Клиент.ТекущийАбонемент) Тогда
	    ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
		   Если ДокументОбъект.Единицы>=Объект.СуммаЕд Тогда
			      ДокументОбъект.Единицы=ДокументОбъект.Единицы - Объект.СуммаЕд;
			      ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
			      ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
			      ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
			      ОбъекткЛ.Записать();
	   		 Иначе
			      Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " ед. осталось " + ДокументОбъект.Единицы + ".");
			      Отказ=Истина;
			 КонецЕсли;
	 Иначе
Показать


но если этого счета нету, то об этом появляется сообщение что нужно его приобрести, хотя при покупке есть исключение если человек собирается покупать абонемент(деньги на счет), то запускается процедура создания и вот с ней как раз возникает проблема, так как мне нужно выяснить какой абонемент решил купить клиент, а эти данные на клиенте, а не на сервере

	 Иначе
		АбонементОбъект=Абонемент();
		Если АбонементОбъект=1 Тогда
	        Клиент=Объект.Клиент;
			Абонемент=Объект.УслугиИАбонементы.Услуга;
			КолвоЕдиниц =ПолучитьЗначениеРеквизита(Объект.УслугиИАбонементы.Услуга,"КолвоЕд");
			Срок=ПолучитьЗначениеРеквизита(Объект.УслугиИАбонементы.Услуга,"Срок");
			ЗаполнитьАбонемент(Клиент, Абонемент, КолвоЕдиниц, Срок);
		ИначеЕсли АбонементОбъект=2 Тогда
			Сообщение = Новый  СообщениеПользователю;
			Сообщение.Текст = "У клиента отсутствует/не выбран абонемент, необходимо его приобрести/выбрать. ";
			Сообщение.Сообщить();
			Отказ=Истина;
			Возврат;
		КонецЕсли;
	КонецЕсли; 
Показать
76. ditp 91 18.05.15 16:04 Сейчас в теме
(74) Emiliya_Emili,
Перем ТипАбонемента;
Если ВвестиЗначение(ТипАбонемента, "Выберите тип абонемента", Тип("СправочникСсылка.{ТипыАбонементов}")) Тогда
    СоздатьАбонементаСервере(ТипАбонемента)
КонецЕсли;


{ТипыАбонементов} на свое замените.

P.S. Надеюсь, телепатограмму принял правильно.
78. Emiliya_Emili 18.05.15 16:12 Сейчас в теме
(76) ditp, у меня есть процедура создания абонемента и я ее уже использовала, проблема в том что она использовалась на клиенте

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
	/////////////////////////////////////////////////
	Если Объект.Рубли=Истина Тогда
		ТекущийДанные=Элементы.УслугиИАбонементы.ТекущиеДанные;
		СчетчикПомеченных=Счетчик();		
			
		Если СчетчикПомеченных > 0 Тогда
			АбонементОбъект=Абонемент();
			Если АбонементОбъект=1 Тогда
					Клиент=Объект.Клиент;
					Абонемент=ТекущийДанные.Услуга;
					КолвоЕдиниц =ПолучитьЗначениеРеквизита(ТекущийДанные.Услуга,"КолвоЕд");
					Срок=ПолучитьЗначениеРеквизита(ТекущийДанные.Услуга,"Срок");
					ЗаполнитьАбонемент(Клиент, Абонемент, КолвоЕдиниц, Срок);
			ИначеЕсли АбонементОбъект=2 Тогда
				////
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	 ///////////////////////////////
 КонецПроцедуры
Показать


а сейчас я пытаюсь сделать то же самое только не знаю как получить данные выбранные пользователем системы

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ПараметрыЗаписи)
	 Иначе
		АбонементОбъект=Абонемент();
		Если АбонементОбъект=1 Тогда
	        Клиент=Объект.Клиент;
			Абонемент=Объект.УслугиИАбонементы.Услуга;
			КолвоЕдиниц =ПолучитьЗначениеРеквизита(Объект.УслугиИАбонементы.Услуга,"КолвоЕд");
			Срок=ПолучитьЗначениеРеквизита(Объект.УслугиИАбонементы.Услуга,"Срок");
			ЗаполнитьАбонемент(Клиент, Абонемент, КолвоЕдиниц, Срок);
		ИначеЕсли АбонементОбъект=2 Тогда
Показать


одна процедура на сервере другая на клиенте, поэтому я не могу использовать текущие данные, что может стать альтернативой?
79. succub1_5 89 18.05.15 16:15 Сейчас в теме
(78) Emiliya_Emili, глобальная переменная, константа.
81. Emiliya_Emili 18.05.15 16:18 Сейчас в теме
(79) succub1_5, а можно пояснить в отношении кода что я скинула?
83. succub1_5 89 18.05.15 16:48 Сейчас в теме
(81) Emiliya_Emili, ой да что заморачиваться -есть же для клиент-сервера
В контексте управляемой формы множество «Объектов переноса данных». Можно выделить системные и определяемые разработчиком.
Системные моделируют на клиенте прикладной объект, в виде одного или несколько элементов данных формы. Создать их вне привязки к реквизитам формы нельзя.

ДанныеФормыСтруктура
ДанныеФормыКоллекция
ДанныеФормыСтруктураСКоллекцией
ДанныеФормыДерево


Преобразование системных объектов переноса данных в прикладные типы и обратно выполняется методами:

ЗначениеВДанныеФормы()
ДанныеФормыВЗначение()
КопироватьДанныеФормы()
ЗначениеВРеквизитФормы()
РеквизитФормыВЗначение()


Часто явное преобразование используется при адаптации существующего решения. Методы могут ожидать (использовать особенности) входные параметры, например ТаблицаЗначений, а не ДанныеФормыКоллекция, или метод был определен в контексте прикладного объекта и стал недоступен для прямого вызова из формы.
Пример 1С v8.1:

// на клиенте в контексте формы
ЗаполнитьКэшПользователей(ПодразделениеСсылка)


Пример 1С v8.2:

// на сервере в контексте формы
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.ЗаполнитьКэшПользователей(ПодразделениеСсылка);
ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект");



Объекты переноса данных, структура которых определяется разработчиком это небольшое подмножество типов доступных и на клиенте и на сервере. Наиболее часто в качестве параметров и результатов методов «огрубленного» интерфейса используются:

Примитивные типы (строка, число, булево)
Структура
Соответствие
Массив
Ссылки на прикладные объекты (уникальный идентификатор и текстовое представление)
77. succub1_5 89 18.05.15 16:11 Сейчас в теме
Насколько я понял, можно сперва не проводить, а только записать, потом 2 документ провести, проверить сколько записей, и провести 1 документ. Если опять дважды спишется, тогда ковырять (а лучше алгоритм нарисовать типа блоксхем) что за чем происходит.
P.S. эта гениальная идея пришла в голову после прочитанных комментариев =)
82. Emiliya_Emili 18.05.15 16:26 Сейчас в теме
(77) succub1_5, у меня нет нигде в коде проведения документа продаж
//проведение документа состояние абонемента
ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

//запись справочника клиенты, списывается также в два раза больше чем положено
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.Записать();
Показать
84. succub1_5 89 18.05.15 16:49 Сейчас в теме
(82) Emiliya_Emili, странно, если реально ничего лишнего не проводиться, то вот костыль, когда данные записываются количество делить на 2 ?
85. Emiliya_Emili 18.05.15 16:56 Сейчас в теме
(84) succub1_5, попробовала не хочет работать
80. Emiliya_Emili 18.05.15 16:16 Сейчас в теме
кто нибудь объяснит почему иногда комбинация срабатывает а иногда выдает ошибку

Объект.УслугиИАбонементы.Услуга
Услуга поясняю реквизит табличной части УслугиИАбонементы
86. Emiliya_Emili 18.05.15 17:53 Сейчас в теме
а может быть проблема в этом коде? и совместно с они и обеспечивают двойное проведение
Процедура ОбработкаПроведения(Отказ, Режим)
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ПродажаТоваров.Товар,
		|	СУММА(ПродажаТоваров.Количество) КАК Количество,
		|	МАКСИМУМ(ЕСТЬNULL(ТоварооборотОстатки.КоличествоОстаток, 0)) КАК КоличествоОстаток
		|ИЗ
		|	Документ.ПродажаТоваровИУслуг.Товары КАК ПродажаТоваров
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Товарооборот.Остатки(&МоментВремени) КАК ТоварооборотОстатки
		|		ПО ПродажаТоваров.Товар = ТоварооборотОстатки.Товар
		|ГДЕ
		|	ПродажаТоваров.Ссылка = &Ссылка
		|
		|СГРУППИРОВАТЬ ПО
		|	ПродажаТоваров.Товар";
	
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
	РезультатЗапроса = Запрос.Выполнить();
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	Движения.Товарооборот.Записывать=Истина;
	
	
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		ЕСЛИ ВыборкаДетальныеЗаписи.Количество>ВыборкаДетальныеЗаписи.КоличествоОстаток Тогда
			Сообщить("Недостаточное количество товара " + ВыборкаДетальныеЗаписи.Товар+" необходимо "
			+ВыборкаДетальныеЗаписи.Количество+". В наличии "+ВыборкаДетальныеЗаписи.КоличествоОстаток);
			Отказ=Истина;
			Движения.Товарооборот.Записывать=Ложь;
		КонецЕсли;
		Если Отказ тогда
			Продолжить;
		КонецЕсли;
		
		СуммаПоДокументу1 = 0;
		 Для Каждого ТекСтрокаТовары Из Товары Цикл
			СуммаПоДокументу1 = СуммаПоДокументу1+ТекСтрокаТовары.Сумма;
		КонецЦикла;
		
		СуммаПоДокументу2 = 0;
		 Для Каждого ТекСтрокаУслугиИАбонементы Из УслугиИАбонементы Цикл
			СуммаПоДокументу2 = СуммаПоДокументу2+ТекСтрокаУслугиИАбонементы.Сумма;
		КонецЦикла;

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

	Для Каждого ТекСтрокаУслугиИАбонементы Из УслугиИАбонементы Цикл
		Движение = Движения.ПродажиКлиентам.Добавить();
		Движение.Период = Дата;
		Движение.Товар = ТекСтрокаУслугиИАбонементы.Услуга;
		Движение.Количесвто = ТекСтрокаУслугиИАбонементы.Количество;
		Движение.Сумма = Сумма;
		Движение.СуммаЕди = СуммаЕд;
		Движение.Клиент = Клиент;
		Движение.Сотрудник = Сотрудник;
	КонецЦикла;

	Для Каждого ТекСтрокаТовары Из Товары Цикл
		Движение = Движения.ПродажиКлиентам.Добавить();
		Движение.Период = Дата;
		Движение.Товар = ТекСтрокаТовары.Товар;
		Движение.Количесвто = ТекСтрокаТовары.Количество;
		Движение.Сумма = Сумма;
		Движение.СуммаЕди = СуммаЕд;
		Движение.Клиент = Клиент;
		Движение.Сотрудник = Сотрудник;
	КонецЦикла;
	

КонецПроцедуры
Показать


&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ПараметрыЗаписи)
	Если ЗначениеЗаполнено(Объект.Клиент.ТекущийАбонемент) Тогда
	    ДокументОбъект = Объект.Клиент.ТекущийАбонемент.ПолучитьОбъект();
		   Если ДокументОбъект.Единицы>=Объект.СуммаЕд Тогда
			      ДокументОбъект.Единицы=ДокументОбъект.Единицы - Объект.СуммаЕд;
			      ДокументОбъект.Записать();
			      ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
			      ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
			      ОбъекткЛ.Записать();
	   		 Иначе
			      Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " ед. осталось " + ДокументОбъект.Единицы + ".");
			      Отказ=Истина;
			 КонецЕсли;
	 Иначе
		АбонементОбъект=Абонемент();
		Если АбонементОбъект=1 Тогда
	        Клиент=Объект.Клиент;
			Абонемент=Объект.УслугиИАбонементы.Услуга;
			КолвоЕдиниц =ПолучитьЗначениеРеквизита(Объект.УслугиИАбонементы.Услуга,"КолвоЕд");
			Срок=ПолучитьЗначениеРеквизита(Объект.УслугиИАбонементы.Услуга,"Срок");
			ЗаполнитьАбонемент(Клиент, Абонемент, КолвоЕдиниц, Срок);
		ИначеЕсли АбонементОбъект=2 Тогда
			Сообщение = Новый  СообщениеПользователю;
			Сообщение.Текст = "У клиента отсутствует/не выбран абонемент, необходимо его приобрести/выбрать. ";
			Сообщение.Сообщить();
			Отказ=Истина;
			Возврат;
		КонецЕсли;
	КонецЕсли; 
КонецПроцедуры
Показать
89. ditp 91 19.05.15 09:37 Сейчас в теме
90. Emiliya_Emili 19.05.15 09:50 Сейчас в теме
(89) ditp, а что именно, я ни где не нашла двойного проведения
91. ditp 91 19.05.15 09:56 Сейчас в теме
(90) Emiliya_Emili,
В отладчике установить точку останова, и посмотреть, сколько раз попадает в процедуру проведения и откуда.
92. Emiliya_Emili 19.05.15 10:43 Сейчас в теме
(91) ditp, а где ее лучше остановить?
93. ditp 91 19.05.15 10:44 Сейчас в теме
(92) Emiliya_Emili,
да прям в первой строчке процедуры ОбработкаПроведения
94. Emiliya_Emili 19.05.15 10:48 Сейчас в теме
(91) ditp, установила, а какая строка покажет нужное?
95. ditp 91 19.05.15 10:51 Сейчас в теме
установили?

теперь проводите документ, и смотрите, сколько раз программа на бряк-понт встанет.

если более одного раза - то где-то беда с лишним вызовом.
откуда этот вызов берется, смотрите в стеке вызовов.
96. Emiliya_Emili 19.05.15 10:56 Сейчас в теме
(95) ditp, а что значат слова бряк-понт и в стеке вызовов и где они находятся
97. ditp 91 19.05.15 11:02 Сейчас в теме
- точка останова
- в конфигураторе "отладка / стек вызовов"
98. Emiliya_Emili 19.05.15 11:11 Сейчас в теме
(97) ditp, сделала, начала проведение документа, он вывел в модуль, потом нажала продолжить и вывелся список документов продаж
Прикрепленные файлы:
Оставьте свое сообщение

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