Подскажите, почему привыполнении кода на сервере появляется ошибка
{ОбщийМодуль.СерверныеФункции.Модуль(22)}: Поле объекта недоступно для записи (Состояние)
Абонемент.Состояние=Перечисления.СостояниеАбонемента.Недействителен;
выполнение кода происходит автоматически при запуске системы
{ОбщийМодуль.СерверныеФункции.Модуль(22)}: Поле объекта недоступно для записи (Состояние)
Абонемент.Состояние=Перечисления.СостояниеАбонемента.Недействителен;
Процедура Абонемент () Экспорт
Абонемент=Документы.СостояниеАбонемента.Выбрать();
Пока Абонемент.Следующий()Цикл
Если Абонемент.Состояние=Перечисления.СостояниеАбонемента.Действителен Тогда
Если Абонемент.СрокДействия<ТекущаяДата() Тогда
Абонемент.Состояние=Перечисления.СостояниеАбонемента.Недействителен;
ИначеЕсли Абонемент.Единицы = 0 Тогда
// Абонемент.Состояние=Перечисления.СостояниеАбонемента.Недействителен;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показатьвыполнение кода происходит автоматически при запуске системы
По теме из базы знаний
- Проведение/снятие с проведения документов/очистки движений не проведенных, перезаписи ссылочных объектов с отборами для баз 1С 8.1-8.3 УТ 10.3/11, БП 2/3, КА 1.1/2, УНФ 1.6, ЗУП 3
- Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов
- Тонкости настройки Истории данных
- Защита объектов от изменения обменом
- Конвертация JSON в Объект 1С
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2) Aerisdef, я написала в ответ получаю {ОбщийМодуль.СерверныеФункции.Модуль(18)}: Значение не является значением объектного типа (ПолучитьОбъект)
Абонемент.Ссылка.ПолучитьОбъект();
и попробовала другой вариант
в этом случаи получаю {ОбщийМодуль.СерверныеФункции.Модуль(20)}: Метод объекта не обнаружен (Ссылка)
ДокСсылка=Абонемент.Ссылка();
Абонемент.Ссылка.ПолучитьОбъект();
и попробовала другой вариант
ДокСсылка=Абонемент.Ссылка();
ДокОбъект=ДокСсылка.ПолучитьОбъект();
ДокОбъект.Записать();
в этом случаи получаю {ОбщийМодуль.СерверныеФункции.Модуль(20)}: Метод объекта не обнаружен (Ссылка)
ДокСсылка=Абонемент.Ссылка();
То ли вы очень смелая, то ли у вас указом по предприятию ограничено количество различных идентификаторов, которые можно использовать в программе. Я бы вот забоялся испытывать судьбу на предмет того, всегда ли 1С поймёт, что имеется в виду именно переменная Абонемент, а не процедура Абонемент.
Процедура Абонемент () Экспорт
Абонемент=Документы.СостояниеАбонемента.Выбрать();
Пока Абонемент.Следующий()Цикл
Если Абонемент.Состояние=Перечисления.СостояниеАбонемента.Действителен Тогда
Если Абонемент.СрокДействия<ТекущаяДата() Тогда
АбонементОбъект = Абонемент.ПолучитьОбъект();
АбонементОбъект.Состояние=Перечисления.СостояниеАбонемента.Недействителен;
АбонементОбъект.Записать();
ИначеЕсли Абонемент.Единицы = 0 Тогда
// Абонемент.Состояние=Перечисления.СостояниеАбонемента.Недействителен;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
подскажите, написала код , но появляются ошибки
нужно если пользователь нажимает галочку заблокировать, спросить его уверен ли он в этом и если выбрал до тогда аннулировать абонемент
нужно если пользователь нажимает галочку заблокировать, спросить его уверен ли он в этом и если выбрал до тогда аннулировать абонемент
&НаКлиенте
Процедура ЗаблокироватьПолностьюПриИзменении(Элемент)
ЗаблокироватьПолностьюПриИзмененииНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаблокироватьПолностьюПриИзмененииНаСервере()
Ответ = Вопрос("Вы действительно хотите заблокировать абонемент?", РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Да Тогда
Объект.Состояние=Перечисления.СостояниеАбонемента.Недействителен;
Объект.Единицы=0;
КонецЕсли;
КонецПроцедуры
Показать
На сервере нельзя задавать вопросы ))
&НаКлиенте
Процедура ЗаблокироватьПолностьюПриИзменении(Элемент)
Ответ = Вопрос("Вы действительно хотите заблокировать абонемент?", РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Да Тогда
ЗаблокироватьПолностьюПриИзмененииНаСервере();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаблокироватьПолностьюПриИзмененииНаСервере()
Объект.Состояние=Перечисления.СостояниеАбонемента.Недействителен;
Объект.Единицы=0;
КонецПроцедуры
Показать
как организовать при покупке клиентом абонемента автоматическое создание документа СостояниеАбонемента, то есть если на клиента уже записан документ СостояниеАбонемента с такими же наименованием и клиентом, то мы продлеваем его, если нет то создаем новый документ
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
///////////////////////////////////////
ТекущийДанные=Элементы.УслугиИАбонементы.ТекущиеДанные;
Абонемент = Абонемент();
Абонемент1 = Абонемент1();
Клиент=Клиент();
Статус= ПолучитьЗначениеРеквизита(Объект.УслугиИАбонементы.Услуга,"Состояние");
Если ТекущийДанные.Услуга= Абонемент Тогда
Сообщить("все хорошо");
Если Объект.Клиент=Клиент Тогда
Если ТекущийДанные.Услуга=Абонемент1 Тогда
Если Статус="Действитлен" Тогда
СрокДействия=СрокДействия+СрокДействия1;
Иначе
СоздатьДокументСостояниеАбонемента();
КонецЕсли;
Иначе
СоздатьДокументСостояниеАбонемента();
КонецЕсли;
Иначе
СоздатьДокументСостояниеАбонемента();
КонецЕсли;
СрокДействия1=Абонемент(); /////Из справочника абонементы извлечь реквизит КоличествоМесяцев и добавитьего к реквизиту документа срок действия, тем самым его увеличив
КонецПроцедуры
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
КонецПроцедуры
Процедура СоздатьДокументСостояниеАбонемента()
СрокДействия= ПолучитьЗначениеРеквизита(Объект.УслугиИАбонементы.Услуга,"Срок");
КолвоЕд= ПолучитьЗначениеРеквизита(Объект.УслугиИАбонементы.Услуга,"КолвоЕд");
Статус= ПолучитьЗначениеРеквизита(Объект.УслугиИАбонементы.Услуга,"Состояние");
НовыйОбъект = Документы.СостояниеАбонемента.СоздатьДокумент();
НовыйОбъект.Клиент=Объект.Клиент;
//НовыйОбъект.Абонемент=ТекущийДанные.Услуга;
НовыйОбъект.СрокДействия=СрокДействия1+ТекущаяДата();
НовыйОбъект.Состояние="Действителен";
НовыйОбъект.Записать();
КонецПроцедуры
Функция Абонемент()
Абонемент = Справочники.Абонементы.Выбрать();
//АбонементОбъект = Абонемент.ПолучитьОбъект();
Возврат Абонемент;
КонецФункции
Функция Абонемент1()
Абонемент = Документы.СостояниеАбонемента.Выбрать();
Возврат Абонемент;
КонецФункции
Функция Клиент()
Клиент = Документы.СостояниеАбонемента.Выбрать();
Возврат Клиент;
КонецФункции
Показать
(19) ditp, ну код потихоньку упрощается,сейчас я пытаюсь сделать следующее
если клиент еще не покупал абонемент то создается новый документ "СостояниеАбонемента", если абонемент клиента по каким либо причинам недействителен или у него нет абонемента данного типа, то опять же создается новый документ, если у клиента есть абонемент и он рабочий то мы просто его продлеваем и увеличиваем количество единиц(посещений)
суть либо созать новый документ либо продлить старый
если клиент еще не покупал абонемент то создается новый документ "СостояниеАбонемента", если абонемент клиента по каким либо причинам недействителен или у него нет абонемента данного типа, то опять же создается новый документ, если у клиента есть абонемент и он рабочий то мы просто его продлеваем и увеличиваем количество единиц(посещений)
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
//////////////////////////////////////
ТекущийДанные=Элементы.УслугиИАбонементы.ТекущиеДанные;
Абонемент = Абонемент();
Клиент=Абонемент();
Статус= ПолучитьЗначениеРеквизита(ТекущийДанные.Услуга,"Состояние");
СрокДействия1=Абонемент(); /////Из справочника абонементы извлечь реквизит КоличествоМесяцев и добавитьего к реквизиту документа срок действия, тем самым его увеличив
КоличествоЕдиницИзАбонемента=ПолучитьЗначениеРеквизита(ТекущийДанные.Услуга, "КолвоЕд");
Если Объект.Клиент=Клиент Тогда
Если ТекущийДанные.Услуга=Абонемент Тогда
Если Статус="Действитлен" Тогда
СрокДействия=СрокДействия+СрокДействия1;
Единицы=Единицы+КоличествоЕдиницИзАбонемента;
Иначе
СоздатьДокументСостояниеАбонемента();
КонецЕсли;
Иначе
СоздатьДокументСостояниеАбонемента();
КонецЕсли;
Иначе
СоздатьДокументСостояниеАбонемента();
КонецЕсли;
КонецПроцедуры
Процедура СоздатьДокументСостояниеАбонемента()
СрокДействия= ПолучитьЗначениеРеквизита(Объект.УслугиИАбонементы.Услуга,"Срок");
КолвоЕд= ПолучитьЗначениеРеквизита(Объект.УслугиИАбонементы.Услуга,"КолвоЕд");
Статус= ПолучитьЗначениеРеквизита(Объект.УслугиИАбонементы.Услуга,"Состояние");
СрокДействия1=Абонемент();
НовыйОбъект = Документы.СостояниеАбонемента.СоздатьДокумент();
НовыйОбъект.Клиент=Объект.Клиент;
//НовыйОбъект.Абонемент=ТекущийДанные.Услуга;
НовыйОбъект.СрокДействия=СрокДействия1+ТекущаяДата();
НовыйОбъект.Состояние="Действителен";
НовыйОбъект.Записать();
КонецПроцедуры
Функция Абонемент()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СостояниеАбонемента.Ссылка,
| СостояниеАбонемента.Клиент,
| СостояниеАбонемента.Абонемент,
| СостояниеАбонемента.СрокДействия,
| СостояниеАбонемента.Состояние,
| СостояниеАбонемента.Единицы
|ИЗ
| Документ.СостояниеАбонемента КАК СостояниеАбонемента";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Возврат ВыборкаДетальныеЗаписи;
КонецФункции
Показатьсуть либо созать новый документ либо продлить старый
(20) Emiliya_Emili, прошу прощения, но там у вас кошмары.
Впрочем, вот:
Впрочем, вот:
&НаСервере
Процедура ЗаполнитьАбонемент(НужныйКлиент, НужныйАбонемент, КолвоЕдиниц, Срок)
Запрос = Новый Запрос("ВЫБРАТЬ
| СостояниеАбонемента.Ссылка,
| СостояниеАбонемента.Клиент,
| СостояниеАбонемента.Абонемент,
| СостояниеАбонемента.СрокДействия,
| СостояниеАбонемента.Состояние,
| СостояниеАбонемента.Единицы
|ИЗ
| Документ.СостояниеАбонемента КАК СостояниеАбонемента
|ГДЕ СостояниеАбонемента.Клиент=&НужныйКлиент
| И СостояниеАбонемента.Абонемент= &НужныйАбонемент
| И СостояниеАбонемента.Состояние = ""Действителен""
|");
Запрос.УстановитьПараметры("НужныйКлиент", НужныйКлиент);
Запрос.УстановитьПараметры("НужныйАбонемент", НужныйАбонемент);
выб = Запрос.выполнить().выбрать();
Если выб.Следующий() Тогда
док = выб.Ссылка.ПолучитьОбъект()
Иначе
док = Документы.СостояниеАбонемента.СоздатьДокумент();
док.Клиент=НужныйКлиент;
док.Абонемент=НужныйАбонемент;
КонецЕсли;
док.СрокДействия=Срок + ТекущаяДата();
док.Состояние="Действителен";
док.Единицы = док.Единицы + КолвоЕдиниц;
док.Записать();
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ЗаполнитьАбонемент(НужныйКлиент, НужныйТипАбонемента, КолвоЕдиниц, Срок)
КонецПроцедуры
Показать
(24) ditp, а мне заменять НужныйКлиент и НужныйАбонемент в строках и на что программа их не понимает
ошибка
Запрос.УстановитьПараметры("НужныйКлиент", НужныйКлиент);
Запрос.УстановитьПараметры("НужныйАбонемент", НужныйАбонемент);
Запрос.УстановитьПараметры("НужныйАбонемент", НужныйАбонемент);
ошибка
{Документ.ПродажаТоваровИУслуг.Форма.ФормаДокумента.Форма(267)}: Метод объекта не обнаружен (УстановитьПараметры)
Запрос.УстановитьПараметры("НужныйКлиент", Объект.Клиент);
(26) ditp, подскажите к какой строке кода он выдает ошибку?
{Документ.ПродажаТоваровИУслуг.Форма.ФормаДокумента.Форма(283)}: Ошибка при вызове метода контекста (Записать)
Документ.Записать();
по причине:
Значение поля "Дата" не может быть пустой датой
Документ.Записать();
по причине:
Значение поля "Дата" не может быть пустой датой
Запрос = Новый Запрос("ВЫБРАТЬ
| СостояниеАбонемента.Ссылка,
| СостояниеАбонемента.Клиент,
| СостояниеАбонемента.Абонемент,
| СостояниеАбонемента.СрокДействия,
| СостояниеАбонемента.Состояние,
| СостояниеАбонемента.Единицы
|ИЗ
| Документ.СостояниеАбонемента КАК СостояниеАбонемента
|ГДЕ
| СостояниеАбонемента.Состояние = ""Действителен""
| И СостояниеАбонемента.Клиент = &Клиент
| И СостояниеАбонемента.Абонемент = &Абонемент");
Запрос.УстановитьПараметр("Клиент", Клиент);
Запрос.УстановитьПараметр("Абонемент", Абонемент);
Выборка = Запрос.выполнить().выбрать();
Если Выборка.Следующий() Тогда
Документ = Выборка.Ссылка.ПолучитьОбъект();
Документ.СрокДействия=ДобавитьМесяц(Документ.СрокДействия, Срок);
Документ.Состояние="Действителен";
Документ.Единицы = Документ.Единицы + КолвоЕдиниц;
Документ.Записать();
Иначе
Документ = Документы.СостояниеАбонемента.СоздатьДокумент();
Документ.Клиент=Клиент;
Документ.Абонемент=Абонемент;
Документ.СрокДействия=ДобавитьМесяц(ТекущаяДата(), Срок);
Документ.Состояние="Действителен";
Документ.Единицы = Документ.Единицы + КолвоЕдиниц;
Документ.Записать();
КонецЕсли;
Показать
ясно, код проверила, новый документ создает
попыталась продлить а он мне новый создал, похоже он не находит нужный документ
подозреваю что ошибка в этой строке
у меня состояние это перечисление, так надо записывать или иначе
попыталась продлить а он мне новый создал, похоже он не находит нужный документ
подозреваю что ошибка в этой строке
|СостояниеАбонемента.Состояние = ""Действителен""
у меня состояние это перечисление, так надо записывать или иначе
а как теперь добавить в справочник клиенты в реквизит текущий абонемент ссылку на документ, который только что создали или изменили, из регистра сведений
а можно ли ссылаться на регистратор в общем модуле, как?
а можно ли ссылаться на регистратор в общем модуле, как?
Функция ПолучитьПоследнийАбонемент(АктуальнаяДата, ЭлементКлиенты) Экспорт
Отбор = Новый Структура("Клиенты", ЭлементКлиенты);
ЗначенияРесурсов=РегистрыСведений.СостояниеАбонемента.ПолучитьПоследнее(АктуальнаяДата, Отбор);
Возврат ЗначенияРесурсов.Регистратор;
КонецФункции
(35) Emiliya_Emili,
Неправильно изменять справочник при проведении документа. Если необходимо отображать какую-то информацию, то достаточно держать ее где-нибудь, например, в регистре сведений и отображать на форме. Иначе у Вас может случится так, что кто-то открыл справочник клиента, а другой пользователь, проводя какой-то документ, пытается изменить реквизит открытого элемента. Это нехорошая ситуация.
а как теперь добавить в справочник клиенты в реквизит текущий абонемент ссылку на документ, который только что создали или изменили, из регистра сведений
Неправильно изменять справочник при проведении документа. Если необходимо отображать какую-то информацию, то достаточно держать ее где-нибудь, например, в регистре сведений и отображать на форме. Иначе у Вас может случится так, что кто-то открыл справочник клиента, а другой пользователь, проводя какой-то документ, пытается изменить реквизит открытого элемента. Это нехорошая ситуация.
(37) Emiliya_Emili,
Все равно стоит привыкать делать хорошо. К тому же даже один пользователь может открыть элемент справочника, а затем провести документ.
Если честно, не очень вдавался в подробности вашей реализации. Но, насколько, понимаю у Вас уже есть РС, где регистраторы записывают состояние абонементов. У вас даже есть функция, которая возвращает текущий абонемент. Все, что вам требуется - это в форме элемента справочника создать реквизит "ПоследнийДокумент" с составным типом Ваших регистраторов, а в событии "при чтении на сервере" написать код вида:
Но стоит доделать функцию, т.к. если в Вашем регистре не окажется данных об этом клиенте, то у Вас будет ошибка "Поле Регистратор не обнаружено".
Доделать примерно так:
Все равно стоит привыкать делать хорошо. К тому же даже один пользователь может открыть элемент справочника, а затем провести документ.
Если честно, не очень вдавался в подробности вашей реализации. Но, насколько, понимаю у Вас уже есть РС, где регистраторы записывают состояние абонементов. У вас даже есть функция, которая возвращает текущий абонемент. Все, что вам требуется - это в форме элемента справочника создать реквизит "ПоследнийДокумент" с составным типом Ваших регистраторов, а в событии "при чтении на сервере" написать код вида:
ПоследнийДокумент = НазваниеВашегоМодуля.ПолучитьПоследнийАбонемент(ТекущаяДата(), Объект.Ссылка)
Но стоит доделать функцию, т.к. если в Вашем регистре не окажется данных об этом клиенте, то у Вас будет ошибка "Поле Регистратор не обнаружено".
Доделать примерно так:
Функция ПолучитьПоследнийАбонемент(АктуальнаяДата, ЭлементКлиенты) Экспорт
Отбор = Новый Структура("Клиенты", ЭлементКлиенты);
ЗначенияРесурсов=РегистрыСведений.СостояниеАбонемента.ПолучитьПоследнее(АктуальнаяДата, Отбор);
Если ЗначениеРесурсов = Неопределено Тогда
Возврат Неопределено;
Иначе
Возврат ЗначенияРесурсов.Регистратор;
КонецЕсли;
КонецФункции
Показать
подскажите, почему появляется ошибка
В запросе (настройка динамического списка в табличной части справочника клиенты)
Ошибка при исполнении запроса набора данных
по причине:
{(13, 31)}: Не задано значение параметра "Клиент"
СостояниеАбонемента.Клиент = <<?>>&Клиент
по причине:
{(13, 31)}: Не задано значение параметра "Клиент"
СостояниеАбонемента.Клиент = <<?>>&Клиент
В запросе (настройка динамического списка в табличной части справочника клиенты)
ВЫБРАТЬ
СостояниеАбонемента.Ссылка,
СостояниеАбонемента.СрокДействия,
СостояниеАбонемента.Абонемент,
СостояниеАбонемента.Состояние,
СостояниеАбонемента.Единицы
ИЗ
Документ.СостояниеАбонемента КАК СостояниеАбонемента
ГДЕ
СостояниеАбонемента.Клиент = &Клиент
Показать
(44) Emiliya_Emili,
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Если ВыборкаДетальныеЗаписи.ТекущийАбонемент=Документ.Ссылка Тогда
Если Объект.КоличествоЕдиниц>Документ.Единицы Тогда
Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.КоличествоЕдиниц + " осталось " + Документ.Единицы + ".");
Иначе
Документ.Единицы=Документ.Единицы-Объект.КоличествоЕдиниц;
Сообщить("Списание прошло успешно!");
КонецЕсли;
КонецЕсли;
Иначе
// запрос пустой почему-то, и что делать непонятно.
Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.КоличествоЕдиниц + " осталось " + Документ.Единицы + ".");
КонецЕсли;
Показать
(54) Если выборка и нет ограничения количества записей, то странно выглядит проверка
Это нельзя по политическим причинам в запрос пихнуть?
Если ждете одну запись то пишите "первые 1", чтоб сервер "прочувствовал заботу"
Если ВыборкаДетальныеЗаписи.ТекущийАбонемент=Документ.Ссылка Тогда
Это нельзя по политическим причинам в запрос пихнуть?
Если ждете одну запись то пишите "первые 1", чтоб сервер "прочувствовал заботу"
(56) Emiliya_Emili,
ДокументОбъект.Ссылка - это не новый. Это ссылка на ДокументОбъект.
А ПолучитьСсылку() - это не "аналогия" ПолучитьОбъект() в 1С.
мне нужно чтобы документ указанный у клиента совпадал с документом из которого я буду вычитать единицы
ну, тогда я не знаю, откуда вы получаете Документ.Ссылка. Что это за документ. Каким образом он "попадает" к вам.
документ не новый
а у вас-то новый.
ДокументОбъект.Ссылка - это не новый. Это ссылка на ДокументОбъект.
А ПолучитьСсылку() - это не "аналогия" ПолучитьОбъект() в 1С.
подскажите что исправить в запросе?
при отладке пишет "ошибка чтения запроса" ошибка начинается с этой строки
ВыборкаДетальныеЗаписи.ТекущийАбонемент
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ПередЗаписьюНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Клиенты.ТекущийАбонемент
|ИЗ
| Справочник.Клиенты КАК Клиенты
|ГДЕ
| Клиенты.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Объект.Клиент);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Документ=Документы.СостояниеАбонемента.ПолучитьСсылку();
Если ВыборкаДетальныеЗаписи.ТекущийАбонемент=Документ.Ссылка Тогда
Если Объект.КоличествоЕдиниц>Документ.Единицы Тогда
Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.КоличествоЕдиниц + " осталось " + Документ.Единицы + ".");
Иначе
Документ.Единицы=Документ.Единицы-Объект.КоличествоЕдиниц;
Сообщить("Списание прошло успешно!");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Показатьпри отладке пишет "ошибка чтения запроса" ошибка начинается с этой строки
ВыборкаДетальныеЗаписи.ТекущийАбонемент
(42) Emiliya_Emili,
Есть "Ошибка выполнения запроса". И начинается она с "РезультатЗапроса = Запрос.Выполнить();" в вашем случае.
Либо "ошибка чтения значения в запросе". Тогда да - может на "ВыборкаДетальныеЗаписи.ТекущийАбонемент" ругаться.
Тогда - ставьте стоп на "РезультатЗапроса = Запрос.Выполнить().Выгрузить()", и смотрите, что вам запрос возвращает, и почему платформе не нравятся поля результата запроса.
при отладке пишет "ошибка чтения запроса"
Нет такой ошибки в 1С.
Есть "Ошибка выполнения запроса". И начинается она с "РезультатЗапроса = Запрос.Выполнить();" в вашем случае.
Либо "ошибка чтения значения в запросе". Тогда да - может на "ВыборкаДетальныеЗаписи.ТекущийАбонемент" ругаться.
Тогда - ставьте стоп на "РезультатЗапроса = Запрос.Выполнить().Выгрузить()", и смотрите, что вам запрос возвращает, и почему платформе не нравятся поля результата запроса.
(42) Emiliya_Emili,
Вы выполняете запрос и получаете выборку. Выборку можно себе представить как набор записей, которые получил запрос. Но одновременно можно считывать только одну запись. Чтобы сделать обход по записям, как правило, использует конструкцию
Вы же не спозиционировались на какую-либо запись выборки. Поэтому у Вас не получается обратиться к полям записи. В (48) вам подсказали верно, но на скрине из(52) видно, что Вы не исправили эту ошибку.
подскажите что исправить в запросе?
Вы выполняете запрос и получаете выборку. Выборку можно себе представить как набор записей, которые получил запрос. Но одновременно можно считывать только одну запись. Чтобы сделать обход по записям, как правило, использует конструкцию
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
...
КонецЦикла;
Вы же не спозиционировались на какую-либо запись выборки. Поэтому у Вас не получается обратиться к полям записи. В (48) вам подсказали верно, но на скрине из(52) видно, что Вы не исправили эту ошибку.
(65) Aerisdef, сделала только опять возникла проблема
Документ=Документы.СостояниеАбонемента.Выбрать();
ДокументОбъект=Документ.Ссылка.ПолучитьОбъект();
{Документ.ПосещенияКлиента.Форма.ФормаДокумента.Форма(28)}: Значение не является значением объектного типа (ПолучитьОбъект)
ДокументОбъект=Документ.Ссылка.ПолучитьОбъект();
ДокументОбъект=Документ.Ссылка.ПолучитьОбъект();
(72) Emiliya_Emili,
При использовании
Ситуация такая же, как и с запросом... это выборка и по ней надо перемещаться:
При использовании
Документ=Документы.СостояниеАбонемента.Выбрать();
Ситуация такая же, как и с запросом... это выборка и по ней надо перемещаться:
Документ=Документы.СостояниеАбонемента.Выбрать();
Пока Документ.Следующий() Цикл
ДокументОбъект = Документ.ПолучитьОбъект();
КонецЦикла;
(74) объектная модель была неотъемлемой частью в 77, пока не пришли запросы.
Платформа объявляет курсор, но при первом обращение запрос курсора должен выполниться. И это было тяжко.
В 1с8 решили так не делать и дали нам запросы. Мы за них ухватились обеими руками, т.к. нагрузку они умеют давать ниже.
Как же тяжело давать пространные ответы!
Платформа объявляет курсор, но при первом обращение запрос курсора должен выполниться. И это было тяжко.
В 1с8 решили так не делать и дали нам запросы. Мы за них ухватились обеими руками, т.к. нагрузку они умеют давать ниже.
Как же тяжело давать пространные ответы!
(75) ture,
Я полностью согласен, что выборка документов как метод не нужен вообще, но человек ясно дал понять: нужно, чтобы работало и не важно как быстро оно работает. Так что и пытаюсь советовать как исправить текущую ситуацию, чтобы работало, не особо обращая внимание насколько это правильно.
Я полностью согласен, что выборка документов как метод не нужен вообще, но человек ясно дал понять: нужно, чтобы работало и не важно как быстро оно работает. Так что и пытаюсь советовать как исправить текущую ситуацию, чтобы работало, не особо обращая внимание насколько это правильно.
Пожалуйста, обратите еще внимание на то, что в этой теме уже говорилось Вернет новую ссылку(которой в базе данных совершенно точно нет). Поэтому когда Вы ставите условие . То это абсолютная бессмыслица, т.к. это условие не отработает никогда, т.к. в Документ.Ссылка будет содержаться ссылка нового документа, которой в базе данных быть не может. К тому же, если и делать такое условие, то писать не Документ.Ссылка, а просто Документ, т.к. это уже и сама Ссылка.
И еще один момент... ПередЗаписьюНаСервере - это стандартное событие формы объекта. Т.е. не нужно вызывать эту процедуру в событии ПередЗаписью. Можно сделать код в событии ПередЗаписьюНаСервере.
Документы.СостояниеАбонемента.ПолучитьСсылку();
Если ВыборкаДетальныеЗаписи.ТекущийАбонемент=Документ.Ссылка Тогда
И еще один момент... ПередЗаписьюНаСервере - это стандартное событие формы объекта. Т.е. не нужно вызывать эту процедуру в событии ПередЗаписью. Можно сделать код в событии ПередЗаписьюНаСервере.
подскажите почему не происходит списание вроде все проверила
теперь долно списывать при покупке товара
&НаСервере
Процедура ПередЗаписьюНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Клиенты.ТекущийАбонемент
|ИЗ
| Справочник.Клиенты КАК Клиенты
|ГДЕ
| Клиенты.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Объект.Клиент);
ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();
Документ=Документы.СостояниеАбонемента.Выбрать();
Пока Документ.Следующий() Цикл
ДокументОбъект = Документ.ПолучитьОбъект();
КонецЦикла;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ВыборкаДетальныеЗаписи.ТекущийАбонемент=ДокументОбъект.Ссылка Тогда
Если Объект.СуммаЕд>ДокументОбъект.Единицы Тогда
Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " осталось " + Документ.Единицы + ".");
Иначе
ДокументОбъект.Единицы=ДокументОбъект.Единицы-Объект.СуммаЕд;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
ОбъекткЛ.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показатьтеперь долно списывать при покупке товара
(78) Emiliya_Emili,
&НаСервере
Процедура ПередЗаписьюНаСервере()
Абонемент = Объект.Клиент.ТекущийАбонемент;
Если ЗначениеЗаполнено(Абонемент) Тогда
ДокументОбъект = Абонемент.ПолучитьОбъект();
Если Объект.СуммаЕд>ДокументОбъект.Единицы Тогда
Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " осталось " + Документ.Единицы + ".");
Иначе
ДокументОбъект.Единицы=ДокументОбъект.Единицы-Объект.СуммаЕд;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
ОбъекткЛ.Записать();
КонецЕсли;
Иначе
Сообщить("Абонемент не найден");
КонецЕсли;
КонецПроцедуры
Показать
(78) Emiliya_Emili,
Т.е. результат не такой как Вы ожидаете, т.к. работаете с неизвестным документом(последним из выборки).
&НаСервере
Процедура ПередЗаписьюНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Клиенты.ТекущийАбонемент
|ИЗ
| Справочник.Клиенты КАК Клиенты
|ГДЕ
| Клиенты.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Объект.Клиент);
ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();
Документ=Документы.СостояниеАбонемента.Выбрать();
Пока Документ.Следующий() Цикл //тут Вы перебираете все документы, которые имеются в базе
ДокументОбъект = Документ.ПолучитьОбъект(); //В переменной ДокументОбъект остается последний документ выборки, причем толком неизвестно какой
КонецЦикла;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл //тут Вы перебираете всех заданных клиентов, причем, вероятно он один Объект.Клиент - это вероятно ссылка на конкретного клиента. Если Вас интересует конкретный клиент, то Вы бы могли писать просто Объект.Клиент.ТекущийАбонемент
Если ВыборкаДетальныеЗаписи.ТекущийАбонемент=ДокументОбъект.Ссылка Тогда //тут вы проверяете
Если Объект.СуммаЕд>ДокументОбъект.Единицы Тогда
Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " осталось " + Документ.Единицы + ".");
Иначе
ДокументОбъект.Единицы=ДокументОбъект.Единицы-Объект.СуммаЕд;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
ОбъекткЛ.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
ПоказатьТ.е. результат не такой как Вы ожидаете, т.к. работаете с неизвестным документом(последним из выборки).
(81)
и
оч весело!
Давайте уж тогда еще проверим на заполнение.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Клиенты.ТекущийАбонемент
|ИЗ
| Справочник.Клиенты КАК Клиенты
|ГДЕ
| Клиенты.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Объект.Клиент);
ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();
Показатьи
Объект.Клиент.ТекущийАбонемент
оч весело!
Давайте уж тогда еще проверим на заполнение.
Документ=Документы.СостояниеАбонемента.Выбрать();
Пока Документ.Следующий() Цикл
ДокументОбъект = Документ.ПолучитьОбъект();
КонецЦикла;
у вас ДокументОбъект станет последним документом, который перезаполнится.
ЗЫ: Да этим можно поразить любого в самое сердце.
Вообще говоря, у Вас, судя по всему, есть документы, которые добавляют единицы клиенту, а есть, которые убавляют. Вам нужно сделать регистр накопления измерение - клиент, ресурс - единицы. И воспользоваться конструктором движений в документах. Там, где будет расход, организовать проверку на отрицательные величины.
(89) ture,
Как не старался пробовать исправить текущую ситуацию, но не могу не согласится. Emiliya_Emili, в (80) Вам предложили верный код, который Вы пытаетесь сделать. Но в действительности с этим работать никто не сможет... Т.к. при каждой записи этого документа списания единиц у вас будут уменьшаться единицы с абонемента. Т.е. каждый раз, когда вы нажимаете кнопку "записать" или "записать и закрыть".
Как не старался пробовать исправить текущую ситуацию, но не могу не согласится. Emiliya_Emili, в (80) Вам предложили верный код, который Вы пытаетесь сделать. Но в действительности с этим работать никто не сможет... Т.к. при каждой записи этого документа списания единиц у вас будут уменьшаться единицы с абонемента. Т.е. каждый раз, когда вы нажимаете кнопку "записать" или "записать и закрыть".
(91) в 1С все усыпано шаблонами.
Так, а нет так! тут, а не здесь! и прочее.
Учет ложится в программу по заранее проработанным подходам.
Чтоб их впитать лучше разок почитать книжку, где учат программировать на 1С.
это позволит Вам тиражировать те куски кода, которые найдете в книге.
Так, а нет так! тут, а не здесь! и прочее.
Учет ложится в программу по заранее проработанным подходам.
Чтоб их впитать лучше разок почитать книжку, где учат программировать на 1С.
это позволит Вам тиражировать те куски кода, которые найдете в книге.
почему он просто игнорирует условие и идет дальше?
Абонемент = Объект.Клиент.ТекущийАбонемент;
Документ=Документы.СостояниеАбонемента.Выбрать();
Если ЗначениеЗаполнено(Абонемент) Тогда
АбОбъект = Абонемент.ПолучитьОбъект();
Пока Документ.Следующий() Цикл
ДокументОбъект = Документ.ПолучитьОбъект();
//////////////////////////////////////////////////////////// //////////////////////
Если АбОбъект=ДокументОбъект.Ссылка Тогда
//////////////////////////////////////////////////////////// ///////////////////////
Если Объект.СуммаЕд>ДокументОбъект.Единицы Тогда
Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " осталось " + Документ.Единицы + ".");
Иначе
ДокументОбъект.Единицы=ДокументОбъект.Единицы-Объект.СуммаЕд;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
ОбъекткЛ.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
Иначе
Сообщить("Абонемент не найден");
КонецЕсли;
Показать
(99) ture, вот такие кода у меня в документах
в этом случаи я вычитаю сумма единиц, и есть странность он вычитает в 2 раза больше чем сама сумма и не выводит сообщения если единиц для покупки не хватает, просто проводя документ
в этом случаи я вычитаю кол-во единиц, только если единиц не хватает то он просто проводит документ и не выводит сообщения об этом
Абонемент = Объект.Клиент.ТекущийАбонемент;
Документ=Документы.СостояниеАбонемента.Выбрать();
Пока Документ.Следующий() Цикл
ДокументОбъект = Документ.ПолучитьОбъект();
Если Абонемент =ДокументОбъект.Ссылка Тогда
Если Объект.СуммаЕд>ДокументОбъект.Единицы Тогда
Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.СуммаЕд + " осталось " + ДокументОбъект.Единицы + ".");
Иначе
ДокументОбъект.Единицы=ДокументОбъект.Единицы-Объект.СуммаЕд;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
ОбъекткЛ.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
Показатьв этом случаи я вычитаю сумма единиц, и есть странность он вычитает в 2 раза больше чем сама сумма и не выводит сообщения если единиц для покупки не хватает, просто проводя документ
Абонемент = Объект.Клиент.ТекущийАбонемент;
Документ=Документы.СостояниеАбонемента.Выбрать();
Пока Документ.Следующий() Цикл
ДокументОбъект = Документ.ПолучитьОбъект();
Если Абонемент =ДокументОбъект.Ссылка Тогда
Если Объект.КоличествоЕдиниц>ДокументОбъект.Единицы Тогда
Сообщить("Недостаточно единиц для списания. Необходимо " + Объект.КоличествоЕдиниц + " осталось " + Документ.Единицы + ".");
Иначе
ДокументОбъект.Единицы=ДокументОбъект.Единицы-Объект.КоличествоЕдиниц;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
ОбъекткЛ = Объект.Клиент.ПолучитьОбъект();
ОбъекткЛ.КоличествоЕдиницВНаличии=ДокументОбъект.Единицы;
ОбъекткЛ.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
Показатьв этом случаи я вычитаю кол-во единиц, только если единиц не хватает то он просто проводит документ и не выводит сообщения об этом
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот