Необъяснимое поведение 1С (7.7)

Новая тема
Показывать по 10 20 40 сообщений
"Первоначально
> ТовЦена=Товар.Розн_Цена.Получить(ПолучитьТА()); :
> {Документ.РасходнаяДолг.Форма.Модуль(256)}: Значение не представляет
> агрегатный объект (Получить)

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

Если у вас нет, то может например был сбой при обновлении ,слетела периодичность у реквизита.
"
"Да ничего там не слетало... поскольку обновления не было, конфигурация у нас почти самописная и от 1С обновлений не берём, правим все сами.
Сейчас пример по пробую.

Модуль документа, предопределенная процедура ПриЗакрытии() (чисто синтетический тест!)
Товар.ИспользоватьДату(ПолучитьТА()); ТовЦена=Товар.Розн_Цена.Получить(ПолучитьТА());

Далее после проведения документа в момент его закрытия - "коврик" с текстом "Ошибка при выполнении модуля! Закрыть?" и в табло (копирую через буфер обмена)
ТовЦена=Товар.Розн_Цена.Получить(ПолучитьТА());
{Документ.РасходнаяДолг.Форма.Модуль(263)}: Значение не представляет агрегатный объект (Получить)

Далее идём в Монитор и видим событие:
Событие: Ошибка времени выполнения
Категория: Ошибка
Комментарий: ТовЦена=Товар.Розн_Цена.Получить(ПолучитьТА()); : {Документ.РасходнаяДолг.Форма.Модуль(263)}: Значение не представляет агрегатный объект (Получить)

Подобная же строчка:
В одном из отчётов (работает как часы)
Цена=Запрос.Товар.Розн_Цена.Получить(Запрос.КонецПериода());
и в другом документе (введено за сегодня 16 документов данного типа, без ошибок)
СтарЦена=Товар.Розн_Цена.Получить(ДатаДок);"
а товар у которого вычисляется Розн_Цена всё время из одного и того же справочника? и пустых строк в документе нет? в смысле, без выбранного товара
"Да, товар из одного и того же справочника. Наличие пустых строк проверяется еще при поптыке проведения.
Пока тестирую метод:
Если ТипЗначенияСтр(Товар.Розн_Цена)="Число"  Тогда
ТовЦена=Товар.Розн_Цена;
Иначе
ТовЦена=Товар.Розн_Цена.Получить(ПолучитьТА());
КонецЕсли;
но документов с необходимым условием пока в рабочей базе ни кто не создавал, а в тренировочной пашет на ура."
Если ТипЗначенияСтр(Товар.Розн_Цена)="Число"  Тогда
= тут всегда будет число, потому что тип значения, заданный в конфигураторе не изменить.
просто нужна внимательность при анализе ошибки. сколько было ситуаций, когда "грешили" на движок 1с, а потом оказывалось, что всё логично и ошибка в вычислении появлялась закономерно. можно попытаться в "попытка-исключение" кинуть в сообщение или номер документа или номер товара, чтобы проанализировать отличие сбойного значения от нормальных.
"Приняв к сведению пост Thorvardr 07.11.2007 22:59
> обычно это бывает если где то по алгоритму перед этим вызывалось:
> Товар.ИспользоватьДату(КакаяТоДата);
> после этого к цене надо образаться не Товар.Розн_Цена.Получить(КакаяТоДата); , а просто Товар.Розн_Цена

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

И про "грешить" на движок 1С... переполнение  ***  видели? Обработка из ~550 строк - загрузка документа в базу с созданием дополнительных единиц измерения, элементов починенных справочников, с участием 4 справочников (во всех 4 при необходимости могут создаваться новые элементы, повторяя иерархию из другой базы, если они не найдены в справочнике), объекта Перечисление. И наконец создание приходного документа с расчётом цены продажи на основе цены покупки из файла переноса данных и установленной наценки на товар."
Оно то можно конечно обернуть в защищённый блок (Попытка...) но, что будет правильней по отношению к системе? "Тихое" исключение и его обработка или тривиальное получение типа объекта?

="обернуть" только для того, чтоб вытащить объект, на котором вызывается сбой. проанализировать, где скрыта ошибка и уже потом программно обработать ситуацию, приводящую к этой ошибке. а "использовать дату" я обычно использовал при создании новых элементов. и этот метод предназначен как раз для созд. новых. может я ошибаюсь - поправьте
определить признак периодичности реквизита легко в дереве конфигурации )
В конфигурации реквизит Розн_Цена - периодический! Но при использованном методе ИспользоватьДату в где-то в процедуре проведения (там мрак... писали до меня) выдаёт ошибку при обращении Товар.Розн_Цена.Получить(ПолучитьТА())

Из Отладчика:
Тест номер 1:
ТипЗначенияСтр(Товар.Розн_Цена) = "НеизвестныйОбъект"
Товар.Розн_Цена = НеизвестныйОбъект
Товар.Розн_Цена.Получить(ПолучитьТА()) = 1024
Тест номер 2:
ТипЗначенияСтр(Товар.Розн_Цена) = "Число"
Товар.Розн_Цена = 1024
Товар.Розн_Цена.Получить(ПолучитьТА()) = Ошибка в выражении!

Готично?
можешь прислать в архиве md-шник или просто текст модуля документа, где возникает ошибка? может найду время в выходные глянуть )) a.potapov@tolcom.ru
Отправил, смотрите :)
Читают тему
(гостей: 1)

Быстрый переход