Имя: Пароль:
1C
1С v8
Как проверить на существование СтрокаТабличнойЧасти?
,
0 sapravka
 
30.12.14
03:17
Здравствуйте.
В форму документа в табличную часть добавил два реквизита: плотность и литры.
И возник вопрос  в общем модуле в обработке табличных частей:

Процедура РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти, ДокументОбъект, ЗначениеПустогоКоличества = 0) Экспорт
        
    СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Цена * ?(СтрокаТабличнойЧасти.Количество = 0, ЗначениеПустогоКоличества, СтрокаТабличнойЧасти.Количество);
    
КонецПроцедуры // РассчитатьСуммуТабЧасти()

Как там проверить на существование данных табличных частей?
Примерно думаю сделать так, но ни как не пойму что написать в проверку, что бы получилось что то типа этого:

Если (СтрокаТабличнойЧасти.Плотность И СтрокаТабличнойЧасти.Литры) существуют Тогда
    Сообщить("Существует")
Иначе
    Сообщить("Не существует")
КонецЕсли;
1 sapravka
 
30.12.14
03:21
Просто там где нет данных табличных частей выходит ошибки на подобии:

{ОбщийМодуль.ОбработкаТабличныхЧастей.Модуль(52)}: Поле объекта не обнаружено (Литры)
    е = СтрокаТабличнойЧасти.Литры;
2 Andrewww123
 
30.12.14
03:21
(0) Проверить заполнены ли эти реквизиты?
Если да, то
"Если ЗначениеЗаполнено(СтрокаТабличнойЧасти.Плотность) Тогда"
3 Andrewww123
 
30.12.14
03:23
(1) "РассчитатьСуммуТабЧасти()" вызывается из формы документа или из модуля?
4 SeraFim
 
30.12.14
03:28
Если СтрокаТабличнойЧасти = Неопределено Тогда
    Возврат;
КонецЕсли;
5 sapravka
 
30.12.14
03:31
(3) формы документа

(4)Пробывал так:

Если СтрокаТабличнойЧасти.Литры = Неопределено Тогда

но выскакивала ошибка:

{ОбщийМодуль.ОбработкаТабличныхЧастей.Модуль(52)}: Поле объекта не обнаружено (Литры)
    е = СтрокаТабличнойЧасти.Литры;
6 Andrewww123
 
30.12.14
03:35
(5) Форма управляемая?
7 sapravka
 
30.12.14
03:38
(6) нет
БП 2.0
8 Andrewww123
 
30.12.14
03:40
(7) А на форму вывел плотность и литры?
9 sapravka
 
30.12.14
03:47
(8) вывел, НО

там условие  еще есть

вот ни как не пойму, как прописать условие в
Процедура РассчитатьСуммуТабЧасти
10 SeraFim
 
30.12.14
03:53
11 GreyK
 
30.12.14
03:55
(9) А зачем тебе "Процедура РассчитатьСуммуТабЧасти"? Тебе не нужна такая процедура, тебе нужен покой :)
12 Andrewww123
 
30.12.14
03:58
(9) Тогда куда-то не туда добавил реквизиты :)
13 SeraFim
 
30.12.14
03:59
Иди проспись лучше
14 Web00001
 
30.12.14
04:06
ты случайно не про функцию

Функция ЕстьРеквизитТабЧастиДокумента(ИмяРеквизита, МетаданныеДокумента, ИмяТабЧасти) Экспорт

    ТабЧасть = МетаданныеДокумента.ТабличныеЧасти.Найти(ИмяТабЧасти);
    Если ТабЧасть = Неопределено Тогда // Нет такой таб. части в документе
        Возврат Ложь;
    Иначе
        Если ТабЧасть.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
            Возврат Ложь;
        Иначе
            Возврат Истина;
        КонецЕсли;
    КонецЕсли;

КонецФункции // ЕстьРеквизитТабЧастиДокумента()
15 Andrewww123
 
30.12.14
04:09
А.. В форму добавил реквизиты, а у объекта метаданных не добавил, а в процедуру приходит СтрокаТабличнойЧасти - это именно строка объекта, а не таблицы формы. Так что ли?
16 Andrewww123
 
30.12.14
04:16
+ (15) Даже так: "ЭлементыФормы.Товары.ТекущиеДанные" там используются, а в дереве метаданных у документа реквзитов "плотность" и "литры" нет. Угадал же?
Кто-то спрашивал как мозг разминать по утрам, вот лучшая разминка - гадать, почти не имея информации :)
17 anaed
 
30.12.14
06:37
(14) тоже про нее подумал, ТС она кстати в общем модуле ОбщегоНазначения. А то ведь догадаешься свою написать :)

(0) Если проблема в том что изменения для одного документа в общем модуле приводят к ошибкам, когда обрабатываются те документы где новых реквизитов нет, то можно пойти двумя путям:

а) по тупому - проверять в общем модуле тип документа и в зависимости от типа работать с реквизитами табличной части

б) по православному - проверять наличие реквизита через метаданные, т.е. использовать функцию из (14)
18 sapravka
 
30.12.14
08:51
Утром вечером мудренее, решил в общем модуле ничего не трогать, а сделать все в  форме документ:

Процедура ТоварыЦенаПриИзменении(Элемент)

    СтрокаТабличнойЧасти = ЭлементыФормы.Товары.ТекущиеДанные;

    // Рассчитать реквизиты табличной части.
    Если СтрокаТабличнойЧасти.Литры = NULL Или СтрокаТабличнойЧасти.Литры = 0 Тогда
                СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Цена * ?(СтрокаТабличнойЧасти.Количество = 0, ЗначениеПустогоКоличества, СтрокаТабличнойЧасти.Количество);
        Иначе
                СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Цена * СтрокаТабличнойЧасти.Литры;
    КонецЕсли;
            
    ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(СтрокаТабличнойЧасти, ЭтотОбъект);

КонецПроцедуры // ТоварыЦенаПриИзменении()

но тогда при проверке выходит ошибка:

{Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента.Форма(1764,101)}: Переменная не определена (ЗначениеПустогоКоличества)
                СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Цена * ?(СтрокаТабличнойЧасти.Количество = 0, <<?>>ЗначениеПустогоКоличества, СтрокаТабличнойЧасти.Количество); (Проверка: Толстый клиент (обычное приложение))
19 Любопытная
 
30.12.14
08:52
А что такое "ЗначениеПустогоКоличества"?
20 Фокусник
 
30.12.14
09:23
(18) "Утром вечером мудренее"
Правильно так: "Утро вечера мудренее" ;)


Процедура ТоварыЦенаПриИзменении(Элемент)

    СтрокаТабличнойЧасти = ЭлементыФормы.Товары.ТекущиеДанные;

    // Не нужны тут проверки на пустую сумму, пересчет ведь стоит делать и в случае изменения цены при заполненной сумме, правильно? :)
    СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Цена * СтрокаТабличнойЧасти.Литры;

ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(СтрокаТабличнойЧасти, ЭтотОбъект);


КонецПроцедуры // ТоварыЦенаПриИзменении()
21 anaed
 
30.12.14
09:28
(0) А какой смысл литрами пытаться подменить количество? Для чего?
22 Serg_1960
 
30.12.14
09:30
(18) Ответ на вопрос (0):

Если ЭлементыФормы.Товары.ТекущаяСтрока = Неопределено Тогда
23 Serg_1960
 
30.12.14
09:33
(18) Проще проверять типа так:

Если   ЗначениеЗаполнено(СтрокаТабличнойЧасти.Литры)
     И ЗначениеЗаполнено(СтрокаТабличнойЧасти.Цена)
     И ЗначениеЗаполнено(СтрокаТабличнойЧасти.Количество) Тогда
24 ktvladimir
 
30.12.14
09:36
(22,23) не совсем так. Насколько я понимаю ТС добавил новые реквизиты в ТЧ, при этом в ОБЩЕЙ процедуре добавляет проверки на эти реквизиты. В остальных документах, использующих эти же процедуры естественно этих реквизитов нет, отсюда и конфликт. Отсюда смотри (14) там уже все указано т.е. проверка следующая
Если ЕстьРеквизитТабЧастиДокумента("Литры", МетаданныеДокумента, ИмяТабЧасти) И ЕстьРеквизитТабЧастиДокумента("Плотность", МетаданныеДокумента, ИмяТабЧасти) Тогда
  Если ЗначениеЗаполнено(СтрокаТабличнойЧасти.Литры) ....
КонецЕсли;


те сперва тебе нужно проверить есть ли вообще в тч такие реквизиты и если они есть то уже с ними работать
25 Фокусник
 
30.12.14
09:37
(22) Ему нужно было проверить наличие реквизита в метаданных, т.к. пытался в общей процедуре забубенить частную доработку :)

Отловить ситуацию, когда в СтрокаТабличнойЧасти НЕ существует реквизит "Литры".
26 Serg_1960
 
30.12.14
09:39
(22) Метаданные тут ни при чём.

Две фразы автора "В форму документа в табличную часть добавил два реквизита: плотность и литры."(0) и строка алгоритма "... = ЭлементыФормы.Товары.ТекущиеДанные" - не совместимы между собой.

Значения элементов формы объекта могут быть не связаны с данными объекта (и соответственно отсутствовать в метаданных объекта).
27 anaed
 
30.12.14
09:48
(22) см (1) там именно с метаданными косяк, а то что пишет автор совсем не то что ему нужно :)
28 Serg_1960
 
30.12.14
09:53
(27) я несколько об другом :(

Если автор только добавил реквизиты на форму(!) и не связал их с данными документа (или вообще не добавлял их в ТЧ документа), то проверять их наличие в ОбщийМодуль.ОбработкаТабличныхЧастей не имеет смысла - они отсутствуют по определению.
29 anaed
 
30.12.14
09:56
(28) ну тогда вердикт один:

тс пригласите специалиста :)
30 Serg_1960
 
30.12.14
10:04
Вот как это могло бы сработать в УПП:
ИмяТабличнойЧасти = ОбщегоНазначения.ПолучитьИмяТабличнойЧастиПоСсылкеНаСтроку(СтрокаТабличнойЧасти);

    МетаданныеДокумента = ДокументОбъект.Метаданные();

    Если ОбщегоНазначения.ЕстьРеквизитТабЧастиДокумента("Литры", МетаданныеДокумента, ИмяТабличнойЧасти) Тогда
31 DrZombi
 
гуру
30.12.14
10:45
(1) Самый Быстрый способ, проверять через "Попытку"
Самый медленный, через "СтрокаТЗ.Владелец()". И далее анализируешь структуру таблицы, чт ов сущности Медленно и для 1С неважно. Рекомендую использовать "Попытку" :)
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.