Имя: Пароль:
1C
1С v8
Значение не является значением объектного типа
0 pnamik
 
05.04.15
13:11
Добрый день
8.0.18.2, конфа самописная

Добавил в модуль формы Приходной накладной в процедуру ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) проверку заполнения цены поступления и наценки следующим способом

ТекСтрока = ЭлементыФормы.Накладная.ТекущиеДанные;
Если ТекСтрока.ЦенаПоступления = 0 Тогда
  Предупреждение ("Цена поступления должна больше нуля");
  Отказ = Истина;
  Возврат;
КонецЕсли;

Если ТекСтрока.ЦенаПоступления = ТекСтрока.РозничнаяЦена Тогда
  Предупреждение ("Цена поступления не может быть равна розничной цене");
  Отказ = Истина;
  Возврат;
КонецЕсли;

Если ТекСтрока.РозничнаяНаценка < 30 Тогда
  Режим = РежимДиалогаВопрос.ДаНет;
        Текст = "Действительно ли наценка меньше 30%?";
        Ответ = Вопрос(Текст, Режим, 0);  
        Если Ответ = КодВозвратаДиалога.Нет Тогда
            Отказ = Истина;
  КонецЕсли;
КонецЕсли;

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

{Документ.ПриходнаяНакладная.Форма.ФормаДокумента(342)}: Значение не является значением объектного типа (ЦенаПоступления)
Если ТекСтрока.ЦенаПоступления = 0 Тогда

или же ругается на розничную наценку, что Значение не является значением объектного типа (Розничная наценка)

Как устранить ошибку? как сделать так, чтобы для пустой накладной эти проверки не имели силу, а имели действия при заполненных строках приходной накладной?
1 ДенисЧ
 
05.04.15
13:18
Что в отладчик про тип и значение ТекСтрока?
наверняка Неопределено...
2 GROOVY
 
05.04.15
13:24
Перед записью... там может текущих данных и не быть.
3 pnamik
 
05.04.15
13:26
(1) ТекСтрока выражение неопределено, действительно
4 GROOVY
 
05.04.15
13:27
У документа, что, всегда одна строка в ТЧ?
5 ДенисЧ
 
05.04.15
13:28
(3) А об этом в книжках всегда пишется...
6 pnamik
 
05.04.15
13:30
(4) убрал текущиеданные выдал ошибку

Поле объекта не обнаружено (ЦенаПоступления)
или Поле объекта не обнаружено (РозничнаяНаценка)

у документа приходная накладная может быть сколько угодно строк (позиций), ошибки (значение не является значением) возникает при сохранении пустой накладной
7 GROOVY
 
05.04.15
13:31
(6)  Тебе строки перебрать надо (и вот тут либо вопросительный, либо восклицательный знак, в зависимости от ответа на вопрос в посте №4)
8 GROOVY
 
05.04.15
13:32
Все строки проверять надо?
9 ДенисЧ
 
05.04.15
13:33
:wall:
10 pnamik
 
05.04.15
13:35
(7) при непустых строках в приходной накладной проверка по всем трем параметрам проходит нормально. ошибка появляется, когда приходная накладная не имеет ни одной строки, и пытаешься сохранить накладную
11 GROOVY
 
05.04.15
13:37
Все строки проверять надо ?
12 pnamik
 
05.04.15
13:37
(11) да
13 GROOVY
 
05.04.15
13:39
(12) Перебирай их в цикле "Для каждого из". В цикл не попадешь, если строк нет.
14 pnamik
 
05.04.15
13:41
(13) щас попробую сочинить, хотя сложновато для меня, надеюсь получится
15 GROOVY
 
05.04.15
13:46
Для каждого ТекСтрока из Накладная Цикл
16 pnamik
 
05.04.15
13:46
Сделал так:

Для Каждого ТекСтрока Из ДокументОбъект.Накладная Цикл
        Если ТекСтрока.Номенклатура = Справочники.Номенклатура.ПустаяСсылка() Тогда
            Продолжить;
    ТекСтрока = ЭлементыФормы.Накладная;
    Если ТекСтрока.ЦенаПоступления = 0 Тогда
        Предупреждение ("Цена поступления должна больше нуля");
        Отказ = Истина;
        Возврат;
    КонецЕсли;
    Если ТекСтрока.ЦенаПоступления = ТекСтрока.РозничнаяЦена Тогда
        Предупреждение ("Цена поступления не может быть равна розничной цене");
        Отказ = Истина;
        Возврат;
    КонецЕсли;
    Если ТекСтрока.РозничнаяНаценка < 30 Тогда
        Режим = РежимДиалогаВопрос.ДаНет;
        Текст = "Действительно ли наценка меньше 30%?";
        Ответ = Вопрос(Текст, Режим, 0);  
        Если Ответ = КодВозвратаДиалога.Нет Тогда
            Отказ = Истина;
        КонецЕсли;
    КонецЕсли;
    КонецЕсли;
     КонецЦикла;

Ошибка исчезла, и больше никакая проверка не идет. а нужно чтобы проверка была по всем трем параметрам
17 ДенисЧ
 
05.04.15
13:49
Какая ДокументОбъект, если документ ещё не записан?
18 pnamik
 
05.04.15
13:51
Получилось так

Для Каждого ТекСтрока Из ДокументОбъект.Накладная Цикл
          ТекСтрока = ЭлементыФормы.Накладная.ТекущиеДанные;
19 pnamik
 
05.04.15
13:53
Всем спасибо, особенно (15)
20 rphosts
 
05.04.15
13:53
(16) один из КонецЕсли нужно перенести в строку сразу после Продолжить...

хотя строки с неуказаной номенклатурой тоже как правило неправильно
21 pnamik
 
05.04.15
13:58
не хочу создавать еще одну тему с примерно такой же ошибкой. поэтому может в этой теме поможете разобраться?!

в той же приходной накладной после удаления последней строки (т.е. когда ни одной позиции не остаются в табличной части накладной), в процедуре НакладнаяПриАктивизацииСтроки(Элемент) появляется ошибка

{Документ.ПриходнаяНакладная.Форма.ФормаДокумента(422)}: Значение не является значением объектного типа (Номенклатура)
Отбор = Новый Структура("Номенклатура,Склад",ТекСтрока.Номенклатура,Склад);

http://prntscr.com/6psv0t
Если информации мало, могу привести процедуру полностью
22 ДенисЧ
 
05.04.15
14:00
(21) А у тебя та же проблема. Ты не проверяешь входящие данные.
23 pnamik
 
05.04.15
14:06
(22) действительно так.
24 User_Agronom
 
05.04.15
14:19