Необъяснимое поведение 1С (7.7)
08.11.2007
14:13
#11
"Первоначально
> ТовЦена=Товар.Розн_Цена.Получить(ПолучитьТА()); :
> {Документ.РасходнаяДолг.Форма.Модуль(256)}: Значение не представляет
> агрегатный объект (Получить)
Просто в любой обработке попробуете пример (хоть мой пример ) обращения к реквизитам справочника, то увидите разницу в сообщениях. Так что если сбой не у вас, то пусть точно скажут какое сообщение при исполнении.
Если у вас нет, то может например был сбой при обновлении ,слетела периодичность у реквизита.
"
> ТовЦена=Товар.Розн_Цена.Получить(ПолучитьТА()); :
> {Документ.РасходнаяДолг.Форма.Модуль(256)}: Значение не представляет
> агрегатный объект (Получить)
Просто в любой обработке попробуете пример (хоть мой пример ) обращения к реквизитам справочника, то увидите разницу в сообщениях. Так что если сбой не у вас, то пусть точно скажут какое сообщение при исполнении.
Если у вас нет, то может например был сбой при обновлении ,слетела периодичность у реквизита.
"
08.11.2007
14:39
#12
"Да ничего там не слетало... поскольку обновления не было, конфигурация у нас почти самописная и от 1С обновлений не берём, правим все сами.
Сейчас пример по пробую.
Модуль документа, предопределенная процедура ПриЗакрытии() (чисто синтетический тест!)
Товар.ИспользоватьДату(ПолучитьТА()); ТовЦена=Товар.Розн_Цена.Получить(ПолучитьТА());
Далее после проведения документа в момент его закрытия - "коврик" с текстом "Ошибка при выполнении модуля! Закрыть?" и в табло (копирую через буфер обмена)
ТовЦена=Товар.Розн_Цена.Получить(ПолучитьТА());
{Документ.РасходнаяДолг.Форма.Модуль(263)}: Значение не представляет агрегатный объект (Получить)
Далее идём в Монитор и видим событие:
Событие: Ошибка времени выполнения
Категория: Ошибка
Комментарий: ТовЦена=Товар.Розн_Цена.Получить(ПолучитьТА()); : {Документ.РасходнаяДолг.Форма.Модуль(263)}: Значение не представляет агрегатный объект (Получить)
Подобная же строчка:
В одном из отчётов (работает как часы)
Цена=Запрос.Товар.Розн_Цена.Получить(Запрос.КонецПериода());
и в другом документе (введено за сегодня 16 документов данного типа, без ошибок)
СтарЦена=Товар.Розн_Цена.Получить(ДатаДок);"
Сейчас пример по пробую.
Модуль документа, предопределенная процедура ПриЗакрытии() (чисто синтетический тест!)
Товар.ИспользоватьДату(ПолучитьТА()); ТовЦена=Товар.Розн_Цена.Получить(ПолучитьТА());
Далее после проведения документа в момент его закрытия - "коврик" с текстом "Ошибка при выполнении модуля! Закрыть?" и в табло (копирую через буфер обмена)
ТовЦена=Товар.Розн_Цена.Получить(ПолучитьТА());
{Документ.РасходнаяДолг.Форма.Модуль(263)}: Значение не представляет агрегатный объект (Получить)
Далее идём в Монитор и видим событие:
Событие: Ошибка времени выполнения
Категория: Ошибка
Комментарий: ТовЦена=Товар.Розн_Цена.Получить(ПолучитьТА()); : {Документ.РасходнаяДолг.Форма.Модуль(263)}: Значение не представляет агрегатный объект (Получить)
Подобная же строчка:
В одном из отчётов (работает как часы)
Цена=Запрос.Товар.Розн_Цена.Получить(Запрос.КонецПериода());
и в другом документе (введено за сегодня 16 документов данного типа, без ошибок)
СтарЦена=Товар.Розн_Цена.Получить(ДатаДок);"
08.11.2007
21:50
#13
а товар у которого вычисляется Розн_Цена всё время из одного и того же справочника? и пустых строк в документе нет? в смысле, без выбранного товара
09.11.2007
12:31
#14
"Да, товар из одного и того же справочника. Наличие пустых строк проверяется еще при поптыке проведения.
Пока тестирую метод:
Если ТипЗначенияСтр(Товар.Розн_Цена)="Число" Тогда
ТовЦена=Товар.Розн_Цена;
Иначе
ТовЦена=Товар.Розн_Цена.Получить(ПолучитьТА());
КонецЕсли;
но документов с необходимым условием пока в рабочей базе ни кто не создавал, а в тренировочной пашет на ура."
Пока тестирую метод:
Если ТипЗначенияСтр(Товар.Розн_Цена)="Число" Тогда
ТовЦена=Товар.Розн_Цена;
Иначе
ТовЦена=Товар.Розн_Цена.Получить(ПолучитьТА());
КонецЕсли;
но документов с необходимым условием пока в рабочей базе ни кто не создавал, а в тренировочной пашет на ура."
09.11.2007
13:18
#15
Если ТипЗначенияСтр(Товар.Розн_Цена)="Число" Тогда
= тут всегда будет число, потому что тип значения, заданный в конфигураторе не изменить.
просто нужна внимательность при анализе ошибки. сколько было ситуаций, когда "грешили" на движок 1с, а потом оказывалось, что всё логично и ошибка в вычислении появлялась закономерно. можно попытаться в "попытка-исключение" кинуть в сообщение или номер документа или номер товара, чтобы проанализировать отличие сбойного значения от нормальных.
= тут всегда будет число, потому что тип значения, заданный в конфигураторе не изменить.
просто нужна внимательность при анализе ошибки. сколько было ситуаций, когда "грешили" на движок 1с, а потом оказывалось, что всё логично и ошибка в вычислении появлялась закономерно. можно попытаться в "попытка-исключение" кинуть в сообщение или номер документа или номер товара, чтобы проанализировать отличие сбойного значения от нормальных.
09.11.2007
14:55
#16
"Приняв к сведению пост Thorvardr 07.11.2007 22:59
> обычно это бывает если где то по алгоритму перед этим вызывалось:
> Товар.ИспользоватьДату(КакаяТоДата);
> после этого к цене надо образаться не Товар.Розн_Цена.Получить(КакаяТоДата); , а просто Товар.Розн_Цена
и обкотав данную ситуацию было выявлено, что если предварительно использовать метод ИспользоватьДату то ТипЗначенияСтр(Товар.Розн_Цена)="Число". Если же не использовать ИспользоватьДату то отладчик показывает что ТипЗначенияСтр(Товар.Розн_Цена) = "НеизвестныйОбъект" из чего был сделан вывод, что это тип значения - периодический реквизит.
Поэтому если число то - ТовЦена=Товар.Розн_Цена; иначе ТовЦена=Товар.Розн_Цена.Получить(ПолучитьТА());
Оно то можно конечно обернуть в защищённый блок (Попытка...) но, что будет правильней по отношению к системе? "Тихое" исключение и его обработка или тривиальное получение типа объекта?
И про "грешить" на движок 1С... переполнение *** видели? Обработка из ~550 строк - загрузка документа в базу с созданием дополнительных единиц измерения, элементов починенных справочников, с участием 4 справочников (во всех 4 при необходимости могут создаваться новые элементы, повторяя иерархию из другой базы, если они не найдены в справочнике), объекта Перечисление. И наконец создание приходного документа с расчётом цены продажи на основе цены покупки из файла переноса данных и установленной наценки на товар."
> обычно это бывает если где то по алгоритму перед этим вызывалось:
> Товар.ИспользоватьДату(КакаяТоДата);
> после этого к цене надо образаться не Товар.Розн_Цена.Получить(КакаяТоДата); , а просто Товар.Розн_Цена
и обкотав данную ситуацию было выявлено, что если предварительно использовать метод ИспользоватьДату то ТипЗначенияСтр(Товар.Розн_Цена)="Число". Если же не использовать ИспользоватьДату то отладчик показывает что ТипЗначенияСтр(Товар.Розн_Цена) = "НеизвестныйОбъект" из чего был сделан вывод, что это тип значения - периодический реквизит.
Поэтому если число то - ТовЦена=Товар.Розн_Цена; иначе ТовЦена=Товар.Розн_Цена.Получить(ПолучитьТА());
Оно то можно конечно обернуть в защищённый блок (Попытка...) но, что будет правильней по отношению к системе? "Тихое" исключение и его обработка или тривиальное получение типа объекта?
И про "грешить" на движок 1С... переполнение *** видели? Обработка из ~550 строк - загрузка документа в базу с созданием дополнительных единиц измерения, элементов починенных справочников, с участием 4 справочников (во всех 4 при необходимости могут создаваться новые элементы, повторяя иерархию из другой базы, если они не найдены в справочнике), объекта Перечисление. И наконец создание приходного документа с расчётом цены продажи на основе цены покупки из файла переноса данных и установленной наценки на товар."
09.11.2007
15:09
#17
Оно то можно конечно обернуть в защищённый блок (Попытка...) но, что будет правильней по отношению к системе? "Тихое" исключение и его обработка или тривиальное получение типа объекта?
="обернуть" только для того, чтоб вытащить объект, на котором вызывается сбой. проанализировать, где скрыта ошибка и уже потом программно обработать ситуацию, приводящую к этой ошибке. а "использовать дату" я обычно использовал при создании новых элементов. и этот метод предназначен как раз для созд. новых. может я ошибаюсь - поправьте
определить признак периодичности реквизита легко в дереве конфигурации )
="обернуть" только для того, чтоб вытащить объект, на котором вызывается сбой. проанализировать, где скрыта ошибка и уже потом программно обработать ситуацию, приводящую к этой ошибке. а "использовать дату" я обычно использовал при создании новых элементов. и этот метод предназначен как раз для созд. новых. может я ошибаюсь - поправьте
определить признак периодичности реквизита легко в дереве конфигурации )
09.11.2007
15:21
#18
В конфигурации реквизит Розн_Цена - периодический! Но при использованном методе ИспользоватьДату в где-то в процедуре проведения (там мрак... писали до меня) выдаёт ошибку при обращении Товар.Розн_Цена.Получить(ПолучитьТА())
Из Отладчика:
Тест номер 1:
ТипЗначенияСтр(Товар.Розн_Цена) = "НеизвестныйОбъект"
Товар.Розн_Цена = НеизвестныйОбъект
Товар.Розн_Цена.Получить(ПолучитьТА()) = 1024
Тест номер 2:
ТипЗначенияСтр(Товар.Розн_Цена) = "Число"
Товар.Розн_Цена = 1024
Товар.Розн_Цена.Получить(ПолучитьТА()) = Ошибка в выражении!
Готично?
Из Отладчика:
Тест номер 1:
ТипЗначенияСтр(Товар.Розн_Цена) = "НеизвестныйОбъект"
Товар.Розн_Цена = НеизвестныйОбъект
Товар.Розн_Цена.Получить(ПолучитьТА()) = 1024
Тест номер 2:
ТипЗначенияСтр(Товар.Розн_Цена) = "Число"
Товар.Розн_Цена = 1024
Товар.Розн_Цена.Получить(ПолучитьТА()) = Ошибка в выражении!
Готично?
Читают тему
(гостей: 1)