Перезапись объекта

1. Emiliya_Emili 14.05.15 21:59 Сейчас в теме
Подскажите, почему привыполнении кода на сервере появляется ошибка
{ОбщийМодуль.СерверныеФункции.Модуль(22)}: Поле объекта недоступно для записи (Состояние)
Абонемент.Состояние=Перечисления.СостояниеАбонемента.Недействителен;
Процедура Абонемент () Экспорт
	Абонемент=Документы.СостояниеАбонемента.Выбрать();
	
	Пока Абонемент.Следующий()Цикл
		Если Абонемент.Состояние=Перечисления.СостояниеАбонемента.Действителен Тогда
			Если Абонемент.СрокДействия<ТекущаяДата() Тогда
				 Абонемент.Состояние=Перечисления.СостояниеАбонемента.Недействителен;
			 ИначеЕсли Абонемент.Единицы = 0  Тогда
				// Абонемент.Состояние=Перечисления.СостояниеАбонемента.Недействителен;
			 КонецЕсли;
	 КонецЕсли;
	КонецЦикла;
КонецПроцедуры
Показать


выполнение кода происходит автоматически при запуске системы
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Aerisdef 14.05.15 22:24 Сейчас в теме
(1) Emiliya_Emili, Ты получаешь выборку документов, она только для чтения. Чтобы получить документ-объект, тебе нужно писать Абонемент.Ссылка.ПолучитьОбъект() и не забудь потом его записать.
3. Emiliya_Emili 15.05.15 08:58 Сейчас в теме
(2) Aerisdef, я написала в ответ получаю {ОбщийМодуль.СерверныеФункции.Модуль(18)}: Значение не является значением объектного типа (ПолучитьОбъект)
Абонемент.Ссылка.ПолучитьОбъект();

и попробовала другой вариант
ДокСсылка=Абонемент.Ссылка();
	ДокОбъект=ДокСсылка.ПолучитьОбъект();
	ДокОбъект.Записать();

в этом случаи получаю {ОбщийМодуль.СерверныеФункции.Модуль(20)}: Метод объекта не обнаружен (Ссылка)
ДокСсылка=Абонемент.Ссылка();
4. AlexInqMetal 77 15.05.15 09:06 Сейчас в теме
(3) Emiliya_Emili, просто вот так написать
АбонементОбъект = Абонемент.ПолучитьОбъект(); 
АбонементОбъект.Состояние=Перечисления.СостояниеАбонемента.Недействителен;
АбонементОбъект.Записать(РежимЗаписиДокумента.Запись);
5. Emiliya_Emili 15.05.15 09:22 Сейчас в теме
(4) AlexInqMetal, сделала и вновь ошибка

{ОбщийМодуль.СерверныеФункции.Модуль(20)}: Ошибка при вызове метода контекста (ПолучитьОбъект)
АбонементОбъект = Абонемент.ПолучитьОбъект();
по причине:
Элемент не выбран!
6. dj_serega 392 15.05.15 09:24 Сейчас в теме
(5) Emiliya_Emili, это значит что "Абонемент" = Абонемент.Пустая(). Что есть Абонемент - пустой документ или не найденная ссылка.
7. Emiliya_Emili 15.05.15 09:37 Сейчас в теме
(6) dj_serega, а как это исправить? может какая-нибудь проверка?
8. dj_serega 392 15.05.15 09:42 Сейчас в теме
(7) Emiliya_Emili,
Если Абонемент = Абонемент.Пустая() Тогда
// Документа нет. Правда непонятно как такое могло получиться :)
Иначе
// Можно получать для редактирования
КонецЕсли;
10. Emiliya_Emili 15.05.15 09:49 Сейчас в теме
(8) dj_serega, в ответ на проверку пишет
{ОбщийМодуль.СерверныеФункции.Модуль(19)}: Метод объекта не обнаружен (Пустая)
Если Абонемент = Абонемент.Пустая() Тогда
11. PetroP 15.05.15 09:51 Сейчас в теме
(10) Emiliya_Emili, откройте наконец отладчик и посмотрите тип значения "Абонемент".
21. ture 606 15.05.15 11:27 Сейчас в теме
(1) Ясное дело, это ж ссылка, а не объект.
22. Emiliya_Emili 15.05.15 11:30 Сейчас в теме
(21) ture, с этим уже разобрались
9. vasyak319 150 15.05.15 09:44 Сейчас в теме
То ли вы очень смелая, то ли у вас указом по предприятию ограничено количество различных идентификаторов, которые можно использовать в программе. Я бы вот забоялся испытывать судьбу на предмет того, всегда ли 1С поймёт, что имеется в виду именно переменная Абонемент, а не процедура Абонемент.
12. ditp 91 15.05.15 09:56 Сейчас в теме
Процедура Абонемент () Экспорт
    Абонемент=Документы.СостояниеАбонемента.Выбрать();
    
    Пока Абонемент.Следующий()Цикл
        Если Абонемент.Состояние=Перечисления.СостояниеАбонемента.Действителен Тогда
            Если Абонемент.СрокДействия<ТекущаяДата() Тогда
                 АбонементОбъект = Абонемент.ПолучитьОбъект();
                 АбонементОбъект.Состояние=Перечисления.СостояниеАбонемента.Недействителен;
                 АбонементОбъект.Записать();
             ИначеЕсли Абонемент.Единицы = 0  Тогда
                // Абонемент.Состояние=Перечисления.СостояниеАбонемента.Недействителен;
             КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
Показать
13. Emiliya_Emili 15.05.15 10:02 Сейчас в теме
(12) ditp, спасибо теперь все работает
14. Emiliya_Emili 15.05.15 10:19 Сейчас в теме
подскажите, написала код , но появляются ошибки
нужно если пользователь нажимает галочку заблокировать, спросить его уверен ли он в этом и если выбрал до тогда аннулировать абонемент

&НаКлиенте
Процедура ЗаблокироватьПолностьюПриИзменении(Элемент)
	ЗаблокироватьПолностьюПриИзмененииНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаблокироватьПолностьюПриИзмененииНаСервере()
	Ответ = Вопрос("Вы действительно хотите заблокировать абонемент?", РежимДиалогаВопрос.ДаНет);
	Если Ответ = КодВозвратаДиалога.Да Тогда
	    Объект.Состояние=Перечисления.СостояниеАбонемента.Недействителен;
	Объект.Единицы=0;
	КонецЕсли;
КонецПроцедуры
Показать
15. ditp 91 15.05.15 10:22 Сейчас в теме
На сервере нельзя задавать вопросы ))
&НаКлиенте
Процедура ЗаблокироватьПолностьюПриИзменении(Элемент)
    Ответ = Вопрос("Вы действительно хотите заблокировать абонемент?", РежимДиалогаВопрос.ДаНет);
    Если Ответ = КодВозвратаДиалога.Да Тогда
        ЗаблокироватьПолностьюПриИзмененииНаСервере();
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ЗаблокироватьПолностьюПриИзмененииНаСервере()
    Объект.Состояние=Перечисления.СостояниеАбонемента.Недействителен;
    Объект.Единицы=0;
КонецПроцедуры
Показать
16. pavelyar 15.05.15 10:49 Сейчас в теме
ДокОбъект.Записать(Ложь); может так?
17. ditp 91 15.05.15 10:50 Сейчас в теме
18. Emiliya_Emili 15.05.15 10:51 Сейчас в теме
как организовать при покупке клиентом абонемента автоматическое создание документа СостояниеАбонемента, то есть если на клиента уже записан документ СостояниеАбонемента с такими же наименованием и клиентом, то мы продлеваем его, если нет то создаем новый документ

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

	Если  ТекущийДанные.Услуга= Абонемент Тогда
		Сообщить("все хорошо");
		Если Объект.Клиент=Клиент Тогда
			Если ТекущийДанные.Услуга=Абонемент1 Тогда			
				Если Статус="Действитлен" Тогда
					СрокДействия=СрокДействия+СрокДействия1;
				Иначе
					СоздатьДокументСостояниеАбонемента();
				КонецЕсли;	
			Иначе
				СоздатьДокументСостояниеАбонемента();
			КонецЕсли;
		Иначе
			СоздатьДокументСостояниеАбонемента();
		КонецЕсли;

СрокДействия1=Абонемент();  /////Из справочника абонементы извлечь реквизит КоличествоМесяцев и добавитьего к реквизиту документа срок действия, тем самым его увеличив
КонецПроцедуры

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


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

	НовыйОбъект = Документы.СостояниеАбонемента.СоздатьДокумент();
	НовыйОбъект.Клиент=Объект.Клиент;
	//НовыйОбъект.Абонемент=ТекущийДанные.Услуга;
	НовыйОбъект.СрокДействия=СрокДействия1+ТекущаяДата();
	НовыйОбъект.Состояние="Действителен";
					
	НовыйОбъект.Записать();
КонецПроцедуры


Функция Абонемент()	
	Абонемент = Справочники.Абонементы.Выбрать();
	//АбонементОбъект = Абонемент.ПолучитьОбъект();
	Возврат Абонемент;
КонецФункции

Функция Абонемент1()	
	Абонемент = Документы.СостояниеАбонемента.Выбрать();
	Возврат Абонемент;
КонецФункции

Функция Клиент()	
	Клиент = Документы.СостояниеАбонемента.Выбрать();
	Возврат Клиент;
КонецФункции
Показать
19. ditp 91 15.05.15 11:06 Сейчас в теме
(18) Не то что бы лень было копаться в коде, но лучше сменить архитектуру.

Регистр сведений, содержащий абонемент, клиента и сроки действия был бы лучшим решением.
20. Emiliya_Emili 15.05.15 11:24 Сейчас в теме
(19) ditp, ну код потихоньку упрощается,сейчас я пытаюсь сделать следующее
если клиент еще не покупал абонемент то создается новый документ "СостояниеАбонемента", если абонемент клиента по каким либо причинам недействителен или у него нет абонемента данного типа, то опять же создается новый документ, если у клиента есть абонемент и он рабочий то мы просто его продлеваем и увеличиваем количество единиц(посещений)


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

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


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

	НовыйОбъект = Документы.СостояниеАбонемента.СоздатьДокумент();
	НовыйОбъект.Клиент=Объект.Клиент;
	//НовыйОбъект.Абонемент=ТекущийДанные.Услуга;
	НовыйОбъект.СрокДействия=СрокДействия1+ТекущаяДата();
	НовыйОбъект.Состояние="Действителен";
					
	НовыйОбъект.Записать();
КонецПроцедуры

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



суть либо созать новый документ либо продлить старый
24. ditp 91 15.05.15 11:45 Сейчас в теме
(20) Emiliya_Emili, прошу прощения, но там у вас кошмары.
Впрочем, вот:

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

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    ЗаполнитьАбонемент(НужныйКлиент, НужныйТипАбонемента, КолвоЕдиниц, Срок)
КонецПроцедуры
Показать
25. Emiliya_Emili 15.05.15 11:56 Сейчас в теме
(24) ditp, а мне заменять НужныйКлиент и НужныйАбонемент в строках и на что программа их не понимает

Запрос.УстановитьПараметры("НужныйКлиент", НужныйКлиент);
Запрос.УстановитьПараметры("НужныйАбонемент", НужныйАбонемент);


ошибка
{Документ.ПродажаТоваровИУслуг.Форма.ФормаДокумента.Форма(267)}: Метод объекта не обнаружен (УстановитьПараметры)
    Запрос.УстановитьПараметры("НужныйКлиент", Объект.Клиент);
23. Emiliya_Emili 15.05.15 11:44 Сейчас в теме
подскажите а на клиенте можно вызвать функцию? как?
ВыборкаДетальныеЗаписи = Абонемент();

таким образом возникает ошибка
26. ditp 91 15.05.15 12:00 Сейчас в теме
Это параметры функции ЗаполнитьАбонемент (см. картинку).

Что туда подставить при вызове функции, вам виднее.

И да, я ошибся, не Запрос.УстановитьПараметры(, а Запрос.УстановитьПараметр(, без "ы".
Прикрепленные файлы:
27. Emiliya_Emili 15.05.15 12:17 Сейчас в теме
(26) ditp, подскажите к какой строке кода он выдает ошибку?
{Документ.ПродажаТоваровИУслуг.Форма.ФормаДокумента.Форма(283)}: Ошибка при вызове метода контекста (Записать)
Документ.Записать();
по причине:
Значение поля "Дата" не может быть пустой датой


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

Написано же, дата документа должна быть заполнена.

Документ.Дата = ТекущаяДата();
29. Aerisdef 15.05.15 12:22 Сейчас в теме
(27) Emiliya_Emili,

К этой строке и относится. Видимо поле "дата" является обязательным для этого документа, а она у вас пустая. При записи документа он это проверяет и выдает ошибку.
30. ditp 91 15.05.15 12:23 Сейчас в теме
Ответ очевиден: Дата при создании документа не задана.
Добавьте что то вроде док.дата=текущаядата().
31. Emiliya_Emili 15.05.15 12:28 Сейчас в теме
ясно, код проверила, новый документ создает
попыталась продлить а он мне новый создал, похоже он не находит нужный документ

подозреваю что ошибка в этой строке

	|СостояниеАбонемента.Состояние = ""Действителен""

у меня состояние это перечисление, так надо записывать или иначе
32. ditp 91 15.05.15 12:29 Сейчас в теме
Там проверка на состояние, а состояние - строка.
Проверяйте, что именно в документе и в запросе.
И лучше на перечисление переделать.
33. Emiliya_Emili 15.05.15 12:32 Сейчас в теме
(32) ditp, состояние и есть перечисление
написала вот так, кажется работает


Запрос.УстановитьПараметр("Состояние", Перечисления.СостояниеАбонемента.Действителен);



есть один недочет, документы записываются но не проводятся
34. ditp 91 15.05.15 12:34 Сейчас в теме
Просто раньше
 НовыйОбъект.Состояние="Действителен";

проскальзывало в вашем коде, вот я и запутался.

док.Записать(РежимЗаписиДокумента.Проведение) не?
35. Emiliya_Emili 15.05.15 12:59 Сейчас в теме
а как теперь добавить в справочник клиенты в реквизит текущий абонемент ссылку на документ, который только что создали или изменили, из регистра сведений
а можно ли ссылаться на регистратор в общем модуле, как?

Функция ПолучитьПоследнийАбонемент(АктуальнаяДата, ЭлементКлиенты) Экспорт
Отбор = Новый Структура("Клиенты", ЭлементКлиенты);
ЗначенияРесурсов=РегистрыСведений.СостояниеАбонемента.ПолучитьПоследнее(АктуальнаяДата, Отбор);
Возврат ЗначенияРесурсов.Регистратор;	
КонецФункции
36. Aerisdef 15.05.15 13:12 Сейчас в теме
(35) Emiliya_Emili,

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


Неправильно изменять справочник при проведении документа. Если необходимо отображать какую-то информацию, то достаточно держать ее где-нибудь, например, в регистре сведений и отображать на форме. Иначе у Вас может случится так, что кто-то открыл справочник клиента, а другой пользователь, проводя какой-то документ, пытается изменить реквизит открытого элемента. Это нехорошая ситуация.
37. Emiliya_Emili 15.05.15 13:20 Сейчас в теме
(36) Aerisdef, у меня данной системой будут пользоваться только администратор
38. Aerisdef 15.05.15 13:47 Сейчас в теме
(37) Emiliya_Emili,

Все равно стоит привыкать делать хорошо. К тому же даже один пользователь может открыть элемент справочника, а затем провести документ.
Если честно, не очень вдавался в подробности вашей реализации. Но, насколько, понимаю у Вас уже есть РС, где регистраторы записывают состояние абонементов. У вас даже есть функция, которая возвращает текущий абонемент. Все, что вам требуется - это в форме элемента справочника создать реквизит "ПоследнийДокумент" с составным типом Ваших регистраторов, а в событии "при чтении на сервере" написать код вида:

ПоследнийДокумент = НазваниеВашегоМодуля.ПолучитьПоследнийАбонемент(ТекущаяДата(), Объект.Ссылка)


Но стоит доделать функцию, т.к. если в Вашем регистре не окажется данных об этом клиенте, то у Вас будет ошибка "Поле Регистратор не обнаружено".
Доделать примерно так:

Функция ПолучитьПоследнийАбонемент(АктуальнаяДата, ЭлементКлиенты) Экспорт
Отбор = Новый Структура("Клиенты", ЭлементКлиенты);
ЗначенияРесурсов=РегистрыСведений.СостояниеАбонемента.ПолучитьПоследнее(АктуальнаяДата, Отбор);
Если ЗначениеРесурсов = Неопределено Тогда
Возврат Неопределено;
Иначе
Возврат ЗначенияРесурсов.Регистратор;    
КонецЕсли;
КонецФункции
Показать
Emiliya_Emili; +1 Ответить
39. Emiliya_Emili 15.05.15 13:55 Сейчас в теме
(38) Aerisdef, спасибо все заработало
я бы с радостью делала по правилам, но у меня осталось слишком мало времени, всего неделя, а я проблемы с расписанием так и не решила
40. Emiliya_Emili 15.05.15 14:16 Сейчас в теме
подскажите, почему появляется ошибка
Ошибка при исполнении запроса набора данных
по причине:
{(13, 31)}: Не задано значение параметра "Клиент"
СостояниеАбонемента.Клиент = <<?>>&Клиент


В запросе (настройка динамического списка в табличной части справочника клиенты)
ВЫБРАТЬ
	СостояниеАбонемента.Ссылка,
	СостояниеАбонемента.СрокДействия,
	СостояниеАбонемента.Абонемент,
	СостояниеАбонемента.Состояние,
	СостояниеАбонемента.Единицы
ИЗ
	Документ.СостояниеАбонемента КАК СостояниеАбонемента
ГДЕ
	СостояниеАбонемента.Клиент = &Клиент
Показать
41. ditp 91 15.05.15 15:04 Сейчас в теме
(40) Emiliya_Emili,
&НаСервере
Процедура ПриСозданииНаСервере()
	<Список>.Параметры.УстановитьЗначениеПараметра("Клиент", <Клиент>);
КонецПроцедуры


вместо <...> подставить нужное.
44. Emiliya_Emili 15.05.15 15:13 Сейчас в теме
(41) ditp, спасибо, абсолютно об этом забыла
можете помочь с этим?(42)
48. ditp 91 15.05.15 15:23 Сейчас в теме
(44) Emiliya_Emili,
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
    Если ВыборкаДетальныеЗаписи.ТекущийАбонемент=Документ.Ссылка Тогда
        Если Объект.КоличествоЕдиниц>Документ.Единицы Тогда
            Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.КоличествоЕдиниц + " осталось " + Документ.Единицы + ".");
        Иначе
            Документ.Единицы=Документ.Единицы-Объект.КоличествоЕдиниц;
            Сообщить("Списание прошло успешно!");
        КонецЕсли;
    КонецЕсли;
Иначе
    // запрос пустой почему-то, и что делать непонятно.
            Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.КоличествоЕдиниц + " осталось " + Документ.Единицы + ".");
КонецЕсли;
Показать
50. ture 606 15.05.15 15:27 Сейчас в теме
(48) ну тогда уж и "Первые 1" пиши. Ну чтоб совсем по взрослому было.
51. AlexO 135 15.05.15 15:32 Сейчас в теме
(48) ditp, (42) Emiliya_Emili,
Документ=Документы.СостояниеАбонемента.ПолучитьСсылку();
Что это за новый способ получать ссылку текущего документа? ))
54. Emiliya_Emili 15.05.15 15:35 Сейчас в теме
(51) AlexO, а что так нельзя? как тогда правильно?
55. ture 606 15.05.15 15:41 Сейчас в теме
(54) Если выборка и нет ограничения количества записей, то странно выглядит проверка
Если ВыборкаДетальныеЗаписи.ТекущийАбонемент=Документ.Ссылка Тогда

Это нельзя по политическим причинам в запрос пихнуть?

Если ждете одну запись то пишите "первые 1", чтоб сервер "прочувствовал заботу"
57. Emiliya_Emili 15.05.15 15:44 Сейчас в теме
(55) ture, в результате выполнения запроса я получаю лишь один документ, потом я сравниванию этот документ с документами СостояниеАбонемента, а когда нахожу совпадение то выполняю операцию с ним
60. ture 606 15.05.15 15:48 Сейчас в теме
(57) ну вот, видите, все сразу встало на места!
Вы спросили как не пишут? В 1С так принято говорить часто. Так вот принято не писать проверку содержания выборки, а сразу выбирать нужные данные.
Впрочем, я не цепляюсь, я еще не такое видел. Вы еще молодец!
62. AlexO 135 15.05.15 15:51 Сейчас в теме
(60) ture,
В 1С так принято говорить часто. Так вот принято не писать проверку содержания выборки, а сразу выбирать нужные данные.
Как раз в 1С это очень часто затруднительно сделать, а порой и просто невозможно )
И нужна постобработка результата запроса.
63. ture 606 15.05.15 15:55 Сейчас в теме
(62) Постобработка всех строк выборки. Я ж хочу сказать, что важно не выбирать лишние строки, чтоб потом их не тянуть и не обрабатывать.
Весьма важно не забывать, что объем может оказаться большим.
61. AlexO 135 15.05.15 15:50 Сейчас в теме
(57) Emiliya_Emili,
потом я сравниванию этот документ с документами СостояниеАбонемента
Осталось выяснить - а как получаете вот эти "документы СостояниеАбонемента". Вторую часть марлезонского балета вашего сравнения.
58. AlexO 135 15.05.15 15:46 Сейчас в теме
(54) Emiliya_Emili, использовать ЭтотОбъект.
53. AlexO 135 15.05.15 15:34 Сейчас в теме
(48) ditp,
Если ВыборкаДетальныеЗаписи.ТекущийАбонемент=Документ.Ссылка Тогда
Если кто не понял - в Документ.Ссылка содержится ссылка на совершенно новый, даже несохраненный, документ.
56. Emiliya_Emili 15.05.15 15:41 Сейчас в теме
(53) AlexO, не совсем так, в этой строке
Если ВыборкаДетальныеЗаписи.ТекущийАбонемент=Документ.Ссылка Тогда

мне нужно чтобы документ указанный у клиента совпадал с документом из которого я буду вычитать единицы, документ не новый
59. AlexO 135 15.05.15 15:48 Сейчас в теме
(56) Emiliya_Emili,
мне нужно чтобы документ указанный у клиента совпадал с документом из которого я буду вычитать единицы
ну, тогда я не знаю, откуда вы получаете Документ.Ссылка. Что это за документ. Каким образом он "попадает" к вам.
документ не новый
а у вас-то новый.
ДокументОбъект.Ссылка - это не новый. Это ссылка на ДокументОбъект.
А ПолучитьСсылку() - это не "аналогия" ПолучитьОбъект() в 1С.
42. Emiliya_Emili 15.05.15 15:10 Сейчас в теме
подскажите что исправить в запросе?


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

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



при отладке пишет "ошибка чтения запроса" ошибка начинается с этой строки

ВыборкаДетальныеЗаписи.ТекущийАбонемент
45. ture 606 15.05.15 15:20 Сейчас в теме
(42) в конструктор загоните запрос, а потом нажмите ОК.
47. AlexO 135 15.05.15 15:23 Сейчас в теме
(45) ture,
в конструктор загоните запрос, а потом нажмите ОК.
Ага, и будем 5 страниц выяснять, что она не задала нужные параметры, которые генерируются в "живом" запросе ))
49. ture 606 15.05.15 15:25 Сейчас в теме
(47) Я давно в сомнение о количестве страниц. Ну пусть будет 5.
Много новичков, а они о запросах вообще не знают. Пусть лучше в конструкторе живут.
46. AlexO 135 15.05.15 15:22 Сейчас в теме
(42) Emiliya_Emili,
при отладке пишет "ошибка чтения запроса"
Нет такой ошибки в 1С.
Есть "Ошибка выполнения запроса". И начинается она с "РезультатЗапроса = Запрос.Выполнить();" в вашем случае.
Либо "ошибка чтения значения в запросе". Тогда да - может на "ВыборкаДетальныеЗаписи.ТекущийАбонемент" ругаться.
Тогда - ставьте стоп на "РезультатЗапроса = Запрос.Выполнить().Выгрузить()", и смотрите, что вам запрос возвращает, и почему платформе не нравятся поля результата запроса.
52. Emiliya_Emili 15.05.15 15:33 Сейчас в теме
(46) AlexO, вот скрин
(47) AlexO, запрос работает это точно
Прикрепленные файлы:
65. Aerisdef 15.05.15 16:10 Сейчас в теме
(42) Emiliya_Emili,
подскажите что исправить в запросе?


Вы выполняете запрос и получаете выборку. Выборку можно себе представить как набор записей, которые получил запрос. Но одновременно можно считывать только одну запись. Чтобы сделать обход по записям, как правило, использует конструкцию
Пока ВыборкаДетальныеЗаписи.Следующий()  Цикл
...
КонецЦикла;


Вы же не спозиционировались на какую-либо запись выборки. Поэтому у Вас не получается обратиться к полям записи. В (48) вам подсказали верно, но на скрине из(52) видно, что Вы не исправили эту ошибку.
72. Emiliya_Emili 15.05.15 16:20 Сейчас в теме
(65) Aerisdef, сделала только опять возникла проблема
Документ=Документы.СостояниеАбонемента.Выбрать();
ДокументОбъект=Документ.Ссылка.ПолучитьОбъект();


{Документ.ПосещенияКлиента.Форма.ФормаДокумента.Форма(28)}: Значение не является значением объектного типа (ПолучитьОбъект)
ДокументОбъект=Документ.Ссылка.ПолучитьОбъект();
74. Aerisdef 15.05.15 16:24 Сейчас в теме
(72) Emiliya_Emili,

При использовании
Документ=Документы.СостояниеАбонемента.Выбрать();


Ситуация такая же, как и с запросом... это выборка и по ней надо перемещаться:


Документ=Документы.СостояниеАбонемента.Выбрать();
Пока Документ.Следующий() Цикл
ДокументОбъект = Документ.ПолучитьОбъект();
КонецЦикла;
75. ture 606 15.05.15 16:31 Сейчас в теме
(74) объектная модель была неотъемлемой частью в 77, пока не пришли запросы.
Платформа объявляет курсор, но при первом обращение запрос курсора должен выполниться. И это было тяжко.
В 1с8 решили так не делать и дали нам запросы. Мы за них ухватились обеими руками, т.к. нагрузку они умеют давать ниже.
Как же тяжело давать пространные ответы!
76. Aerisdef 15.05.15 16:38 Сейчас в теме
(75) ture,

Я полностью согласен, что выборка документов как метод не нужен вообще, но человек ясно дал понять: нужно, чтобы работало и не важно как быстро оно работает. Так что и пытаюсь советовать как исправить текущую ситуацию, чтобы работало, не особо обращая внимание насколько это правильно.
77. ture 606 15.05.15 16:45 Сейчас в теме
(76) Да это вариант. Надо знать все тонкости языка, чтобы их использовать или знать что написано.
43. ture 606 15.05.15 15:12 Сейчас в теме
лучше лишний раз не вызывать сервер да еще с директивой НаСервере.
НаСервереБезКонтекста быстрее отработает
64. Emiliya_Emili 15.05.15 16:09 Сейчас в теме
кто-нибудь подскажет что делать с этими строчками
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

и как исправить ошибку?
66. ture 606 15.05.15 16:11 Сейчас в теме
ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать(); 
67. ture 606 15.05.15 16:12 Сейчас в теме
68. ture 606 15.05.15 16:13 Сейчас в теме
и Клиенты.ТекущийАбонемент=&Абонемент
69. ture 606 15.05.15 16:14 Сейчас в теме
Запрос.УстановитьПараметр("Абонемент", Абонемент);
70. ture 606 15.05.15 16:15 Сейчас в теме
тогда уж можно оставить
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
71. ture 606 15.05.15 16:17 Сейчас в теме
Пишите как можете, но стремитесь к краткости и простоте восприятия.
73. Aerisdef 15.05.15 16:21 Сейчас в теме
Пожалуйста, обратите еще внимание на то, что в этой теме уже говорилось
Документы.СостояниеАбонемента.ПолучитьСсылку();
Вернет новую ссылку(которой в базе данных совершенно точно нет). Поэтому когда Вы ставите условие
Если ВыборкаДетальныеЗаписи.ТекущийАбонемент=Документ.Ссылка Тогда
. То это абсолютная бессмыслица, т.к. это условие не отработает никогда, т.к. в Документ.Ссылка будет содержаться ссылка нового документа, которой в базе данных быть не может. К тому же, если и делать такое условие, то писать не Документ.Ссылка, а просто Документ, т.к. это уже и сама Ссылка.

И еще один момент... ПередЗаписьюНаСервере - это стандартное событие формы объекта. Т.е. не нужно вызывать эту процедуру в событии ПередЗаписью. Можно сделать код в событии ПередЗаписьюНаСервере.
78. Emiliya_Emili 15.05.15 17:03 Сейчас в теме
подскажите почему не происходит списание вроде все проверила

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



теперь долно списывать при покупке товара
80. ditp 91 15.05.15 17:08 Сейчас в теме
(78) Emiliya_Emili,
&НаСервере
Процедура ПередЗаписьюНаСервере()
    Абонемент = Объект.Клиент.ТекущийАбонемент;
    Если ЗначениеЗаполнено(Абонемент) Тогда
        ДокументОбъект = Абонемент.ПолучитьОбъект();
        Если Объект.СуммаЕд>ДокументОбъект.Единицы Тогда
            Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " осталось " + Документ.Единицы + ".");
        Иначе
            ДокументОбъект.Единицы=ДокументОбъект.Единицы-Объект.СуммаЕд;
            ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
            ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
            ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
            ОбъекткЛ.Записать();
        КонецЕсли;
    Иначе
        Сообщить("Абонемент не найден");
    КонецЕсли;
КонецПроцедуры
Показать
82. Emiliya_Emili 15.05.15 17:13 Сейчас в теме
(80) ditp, не получится мне надо вычитать из документа, а не справочника
85. ditp 91 15.05.15 17:15 Сейчас в теме
(82) Emiliya_Emili,
А если подумать, что у меня написано и сравнить с тем что вы пытались написать?
86. ture 606 15.05.15 17:16 Сейчас в теме
(82) Предлагаю задуматься о подписке на события или обработке проведения.
81. Aerisdef 15.05.15 17:09 Сейчас в теме
(78) Emiliya_Emili,

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


Т.е. результат не такой как Вы ожидаете, т.к. работаете с неизвестным документом(последним из выборки).
83. ture 606 15.05.15 17:14 Сейчас в теме
(81)
Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Клиенты.ТекущийАбонемент
        |ИЗ
        |    Справочник.Клиенты КАК Клиенты
        |ГДЕ
        |    Клиенты.Ссылка = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", Объект.Клиент);
    ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();
Показать


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


оч весело!

Давайте уж тогда еще проверим на заполнение.
88. Emiliya_Emili 15.05.15 17:17 Сейчас в теме
(81) Aerisdef, эту проблемку я нашла, как перебирать ДокументОбъект, мне надо чтобы он перебирал документы а не выборку
79. ture 606 15.05.15 17:07 Сейчас в теме
Документ=Документы.СостояниеАбонемента.Выбрать();
    Пока Документ.Следующий() Цикл
        ДокументОбъект = Документ.ПолучитьОбъект();
    КонецЦикла;


у вас ДокументОбъект станет последним документом, который перезаполнится.


ЗЫ: Да этим можно поразить любого в самое сердце.
84. Aerisdef 15.05.15 17:14 Сейчас в теме
Вообще говоря, у Вас, судя по всему, есть документы, которые добавляют единицы клиенту, а есть, которые убавляют. Вам нужно сделать регистр накопления измерение - клиент, ресурс - единицы. И воспользоваться конструктором движений в документах. Там, где будет расход, организовать проверку на отрицательные величины.
87. ditp 91 15.05.15 17:17 Сейчас в теме
(84) Aerisdef,
Уже предлагалось насчет архитектуры подумать, но, похоже, из палок и изоленты веселее строить. И как по мне, для пятницы очень ок.
89. ture 606 15.05.15 17:20 Сейчас в теме
(87) Все-таки учетная система строиться должна на регистрах и регистраторах. Я уже даже на биржу монетку сбросил. Регистры накоплений позволят и проводить и распроводить документ и учет будет работать и программа станет читаемой.
90. Aerisdef 15.05.15 17:29 Сейчас в теме
(89) ture,

Как не старался пробовать исправить текущую ситуацию, но не могу не согласится. Emiliya_Emili, в (80) Вам предложили верный код, который Вы пытаетесь сделать. Но в действительности с этим работать никто не сможет... Т.к. при каждой записи этого документа списания единиц у вас будут уменьшаться единицы с абонемента. Т.е. каждый раз, когда вы нажимаете кнопку "записать" или "записать и закрыть".
91. Emiliya_Emili 15.05.15 17:38 Сейчас в теме
(90) Aerisdef, благодаря этим строчкам
Абонемент = Объект.Клиент.ТекущийАбонемент;
ДокументОбъект = Абонемент.ПолучитьОбъект();


списание будет происходить со справочниками а не из документа СостояниеАбонемента, так даже упоминаний этого документа нету
93. ture 606 15.05.15 17:45 Сейчас в теме
(91) в 1С все усыпано шаблонами.
Так, а нет так! тут, а не здесь! и прочее.
Учет ложится в программу по заранее проработанным подходам.
Чтоб их впитать лучше разок почитать книжку, где учат программировать на 1С.
это позволит Вам тиражировать те куски кода, которые найдете в книге.
92. ture 606 15.05.15 17:40 Сейчас в теме
(90) здесь чаще можно поговорить, чем помочь. Вообще болтовня оказывается полезней работы. Личная выгода, какая-то неправильная.
94. Emiliya_Emili 15.05.15 17:47 Сейчас в теме
почему он просто игнорирует условие и идет дальше?

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

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

////////////////////////////////////////////////////////////­//////////////////////
			 Если АбОбъект=ДокументОбъект.Ссылка Тогда
////////////////////////////////////////////////////////////­///////////////////////

				Если Объект.СуммаЕд>ДокументОбъект.Единицы Тогда
					Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " осталось " + Документ.Единицы + ".");
				Иначе
					ДокументОбъект.Единицы=ДокументОбъект.Единицы-Объект.СуммаЕд;
					ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
					ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
					ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
					ОбъекткЛ.Записать();
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	Иначе
        Сообщить("Абонемент не найден");
	КонецЕсли;
Показать
95. ture 606 15.05.15 17:50 Сейчас в теме
(94) объект и ссылка имеют разные типы
96. Emiliya_Emili 15.05.15 18:04 Сейчас в теме
(95) ture, я уброла ссылку и ничего не происходит
97. Emiliya_Emili 15.05.15 18:06 Сейчас в теме
и еще у меня стоит условие что если для покупки требуется больше единиц чем есть, он должен вывести сообщение, а у меня он просто проводит и игнорирует это
99. ture 606 15.05.15 18:07 Сейчас в теме
100. Emiliya_Emili 15.05.15 18:12 Сейчас в теме
(99) ture, вот такие кода у меня в документах

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

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

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


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

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

в этом случаи я вычитаю кол-во единиц, только если единиц не хватает то он просто проводит документ и не выводит сообщения об этом
98. ture 606 15.05.15 18:07 Сейчас в теме
АбОбъект = Абонемент.ПолучитьОбъект();


АбОбъект - это объектный тип

ДокументОбъект.Ссылка
- а это ссылочный тип

это как камень сравнивать со стаканом.
Оставьте свое сообщение

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