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