Имя: Пароль:
1C
1C 7.7
v7: Ошибка Переменная не определена, как исправить
0 Irina3gger
 
29.06.17
15:39
Доброго времени.
Подскажите пожалуйста из за чего появляется ошибка Переменная не определена, что на нее влияет?
это значит что она не прописана в таблице значений или в запросе не прописана? или может просто не правильно прописана?
1 Волшебник
 
модератор
29.06.17
15:40
Нужно изучить понятие "контекст" и области видимости переменных.
2 Остап Сулейманович
 
29.06.17
15:47
(1) Нужно начать с более основных основ ))).

Например вот такая конструкция :

Функция ТестВыбораИзСписка()
  Список = СоздатьОбъект("СписокЗначений");
  Список.ДобавитьЗначение("Первое значение");
  Список.ДобавитьЗначение("Второе значение");
  Список.ДобавитьЗначение("Третье значение");

  Если Список.ВыбратьЗначение(ВыбранноеЗначение,"Тест",,,1) = 1 Тогда
    Возврат ВыбранноеЗначение;
  КонецЕсли;
  Возврат 0;
КонецФункции

Упадет. Несмотря на то, что в 1С имеется неявное объявление переменных. Все переменные в одной области видимости. И в контексте одной функции.
3 Волшебник
 
модератор
29.06.17
15:48
(2) ВыбранноеЗначение не объявлено
4 Остап Сулейманович
 
29.06.17
15:50
(3) Таки да.
5 Irina3gger
 
29.06.17
15:51
Вот начало кода
Процедура Сформировать()
    
    сз                   = СоздатьОбъект("СписокЗначений");
    ТабЗначВсего       = СоздатьОбъект("ТаблицаЗначений");
    ТабЗначОбъект    = СоздатьОбъект("ТаблицаЗначений");
    ТабЗначИтогРайон = СоздатьОбъект("ТаблицаЗначений");
    ТабОбъект        = СоздатьОбъект("ТаблицаЗначений");
    ТабЗначЗаказчик     = СоздатьОбъект("ТаблицаЗначений");
    ТЗ                  = СоздатьОбъект("ТаблицаЗначений");
    
    ТабОбъект.НоваяКолонка("с1");
    ТабОбъект.НоваяКолонка("с2");
    ТабОбъект.НоваяКолонка("с3");
    ТабОбъект.НоваяКолонка("с4");

    
    ТабЗначВсего.НоваяКолонка("с1","Число");
    ТабЗначВсего.НоваяКолонка("с2","Число");
    ТабЗначВсего.НоваяКолонка("с3","Число");

    ТабЗначИтогРайон.НоваяКолонка("с1","Число");
    ТабЗначИтогРайон.НоваяКолонка("с2","Число");
    ТабЗначИтогРайон.НоваяКолонка("с3","Число");
    
    ТабЗначЗаказчик.НоваяКолонка("с1","Число");
    ТабЗначЗаказчик.НоваяКолонка("с2","Число");
    ТабЗначЗаказчик.НоваяКолонка("с3","Число");
    
    
    Таб = СоздатьОбъект("Таблица");
    RS  = СоздатьОбъект("ODBCRecordset");
    RS.УстБД1С();
    ТекстЗапроса =
    "
    |SELECT
    |   Жур.IDDoc             as [Док $Документ],
    |   Жур.IDDocDef        as Док_вид,
    |    Спр.Code as Код,
    |   Спр.Descr as Наименование,
    |    $Док.Объект          as [Объект $Справочник.Объект],
    |    $Док.Сумма          as Сумма,
    |    $Док.ДолгПоОплате  as ДолгПоОплате,
    |    $Док.ПризнакПодпис as [ПризнакПодпис $Перечисление.Признак],
    |    $Док.ВидАкта        as [ВидАкта $Справочник.ВидАкт],
    |    $Спр.Заказчик        as [Заказчик $Справочник.Заказчик],
    |    $Спр.Район         as [Район $Справочник.Области],
    |    $Спр.ИстФин        as [ИстФин $Справочник.ИстФин]
    |FROM
    |   _1SJourn as Жур
    |INNER JOIN
    |    $Документ.АктОбъемаРабот as Док ON Док.IDDoc = Жур.IDDoc
    |INNER JOIN
    |    $Справочник.Объект as Спр ON Спр.ID = $Док.Объект
    |
    |WHERE    
    |   Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
    |    AND Жур.Closed & 1 = 1
    |    AND $Док.ВидАкта <> :ВидАктов
    |    AND $Док.ДолгПоОплате <> 0
    |    AND $Спр.Заказчик = :ТекЗаказчик
    |"

я как понимаю он не выполняется потому что не определяет переменную Спр.ИстФин
6 Irina3gger
 
29.06.17
15:53
не могу понять почему, ведь Спр.Заказчик и Район работаю
и в Справочнике объектов есть ИстФин.
До ужаса туплю, столько литературы за сегодня начитала, что уже мозги пухнут
7 Остап Сулейманович
 
29.06.17
15:56
(5) Почему решила, что "не определяет переменную Спр.ИстФин"?
Текст ошибки добровольно показывать не будешь?
8 Irina3gger
 
29.06.17
16:03
Отчет формируется но пишет, дословно сообщаю

Переменная не определена (Спр)
Спр<<?>>.ИстФин.ТекущийЭлемент()

Если я все верно понимаю, то говорит о том что в макете таблице, в колонке ИстФин, не верно указана переменная
9 Остап Сулейманович
 
29.06.17
16:06
(8) Вот такой строки Спр.ИстФин.ТекущийЭлемент() в коде из (5) нет.
Вы здесь специально КВН устраиваите?
10 Irina3gger
 
29.06.17
16:08
нет, играет большую роль не опытность и усталость, поэтому прошу прощение за невнимательность и отсутствие конкретики
11 h-sp
 
29.06.17
16:10
(8) вообще у вас здесь нигде нет переменной Спр.
12 пипец
 
29.06.17
16:14
(9) даже если нет ))) Спр.ИстФин.ТекущийЭлемент() две точки на объект )))
13 Irina3gger
 
29.06.17
16:16
Я пыталась сделать так чтоб в таблицу в нужную мне колонку подтягивался справочник, и делала по примерам

но в итоге ни чего не вышло

и это выражение Спр.ИстФин.ТекущийЭлемент() я ставила в саму таблицу

но Спр.ИстФин есть в запросе
14 пипец
 
29.06.17
16:22
(13) в запросе и при обходе - разные вещи ...
ЗЫ полный текст тогда
15 Irina3gger
 
29.06.17
16:25
вот полный текст
Перем Таблица;

//======================================================================

Процедура Сформировать()
    
    сз                   = СоздатьОбъект("СписокЗначений");
    ТабЗначВсего       = СоздатьОбъект("ТаблицаЗначений");
    ТабЗначОбъект    = СоздатьОбъект("ТаблицаЗначений");
    ТабЗначИтогРайон = СоздатьОбъект("ТаблицаЗначений");
    ТабОбъект        = СоздатьОбъект("ТаблицаЗначений");
    ТабЗначЗаказчик     = СоздатьОбъект("ТаблицаЗначений");
    ТЗ                  = СоздатьОбъект("ТаблицаЗначений");
    
    ТабОбъект.НоваяКолонка("с1");
    ТабОбъект.НоваяКолонка("с2");
    ТабОбъект.НоваяКолонка("с3");
    ТабОбъект.НоваяКолонка("с4");

    
    ТабЗначВсего.НоваяКолонка("с1","Число");
    ТабЗначВсего.НоваяКолонка("с2","Число");
    ТабЗначВсего.НоваяКолонка("с3","Число");

    ТабЗначИтогРайон.НоваяКолонка("с1","Число");
    ТабЗначИтогРайон.НоваяКолонка("с2","Число");
    ТабЗначИтогРайон.НоваяКолонка("с3","Число");
    
    ТабЗначЗаказчик.НоваяКолонка("с1","Число");
    ТабЗначЗаказчик.НоваяКолонка("с2","Число");
    ТабЗначЗаказчик.НоваяКолонка("с3","Число");
    
    
    Таб = СоздатьОбъект("Таблица");
    RS  = СоздатьОбъект("ODBCRecordset");
    RS.УстБД1С();
    ТекстЗапроса =
    "
    |SELECT
    |   Жур.IDDoc             as [Док $Документ],
    |   Жур.IDDocDef        as Док_вид,
    |    Спр.Code as Код,
    |   Спр.Descr as Наименование,
    |    $Док.Объект          as [Объект $Справочник.Объект],
    |    $Док.Сумма          as Сумма,
    |    $Док.ДолгПоОплате  as ДолгПоОплате,
    |    $Док.ПризнакПодпис as [ПризнакПодпис $Перечисление.Признак],
    |    $Док.ВидАкта        as [ВидАкта $Справочник.ВидАкт],
    |    $Спр.Заказчик        as [Заказчик $Справочник.Заказчик],
    |    $Спр.Район         as [Район $Справочник.Области],
    |    $Спр.ИстФин        as [ИстФин $Справочник.ИстФин]
    |FROM
    |   _1SJourn as Жур
    |INNER JOIN
    |    $Документ.АктОбъемаРабот as Док ON Док.IDDoc = Жур.IDDoc
    |INNER JOIN
    |    $Справочник.Объект as Спр ON Спр.ID = $Док.Объект
    |
    |WHERE    
    |   Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
    |    AND Жур.Closed & 1 = 1
    |    AND $Док.ВидАкта <> :ВидАктов
    |    AND $Док.ДолгПоОплате <> 0
    |    AND $Спр.Заказчик = :ТекЗаказчик
    |"
    ;
    Таб.ВывестиСекцию("ШапкаОсновная");
    Таб.ВывестиСекцию("Шапка");    
    ТекЗаказчик = "";
    Номер = 1;
    СпрРайон = СоздатьОбъект("Справочник.Области");
    СпрРайон.ПорядокКодов();
    СпрРайон.ВыбратьЭлементы();
    Пока СпрРайон.ПолучитьЭлемент() = 1 Цикл
        Таб.ВывестиСекцию("Район");
                                    
        СпрЗаказчик = СоздатьОбъект("Справочник.Заказчик");
        СпрЗаказчик.ВыбратьЭлементы();  
        Пока СпрЗаказчик.ПолучитьЭлемент() = 1 Цикл
            Если СпрЗаказчик.Район = СпрРайон.ТекущийЭлемент() Тогда
                
                RS.УстановитьТекстовыйПараметр("НачДата", НачПер);
                RS.УстановитьТекстовыйПараметр("КонДата", ОконПер);
                RS.УстановитьТекстовыйПараметр("ОстМеньше", ОстМеньше);
                
                спрВидАкта = СоздатьОбъект("Справочник.ВидАкт");
                Если спрВидАкта.НайтиПоКоду(2) = 1 Тогда
                    RS.УстановитьТекстовыйПараметр("ВидАктов", спрВидАкта.ТекущийЭлемент());
                КонецЕсли;
                
                RS.УстановитьТекстовыйПараметр("ТекЗаказчик",СпрЗаказчик.ТекущийЭлемент());
                ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);
                
                
                ТЗ.ВыбратьСтроки();
                Пока ТЗ.ПолучитьСтроку() = 1 Цикл
                    СуммаНеПодпис  = 0;
                    СуммаПодпис    = 0;
                    ДолгЭкспертизы = 0;
                    
                    Если Число(ТЗ.ВидАкта.Код) = Число(4) Тогда
                        ДолгЭкспертизы = ТЗ.ДолгПоОплате;
                    Иначе
                        Если ТЗ.ПризнакПодпис = Перечисление.Признак.Нет Тогда
                            СуммаНеПодпис = ТЗ.ДолгПоОплате;
                        ИначеЕсли ТЗ.ПризнакПодпис = Перечисление.Признак.Да Тогда    
                            СуммаПодпис = ТЗ.ДолгПоОплате;
                        КонецЕсли;     
                КонецЕсли;    
                    
                    ТабОбъект.НоваяСтрока();
                    ТабОбъект.с1 = ТЗ.Объект;
                    ТабОбъект.с2 = СуммаНеПодпис;
                    ТабОбъект.с3 = СуммаПодпис;
                    ТабОбъект.с4 = ДолгЭкспертизы;
                КонецЦикла;
                
                ТабОбъект.Свернуть("с1","с2,с3,с4");
            
                
                Если (ТабОбъект.Итог("с2") > ОстМеньше) или (ТабОбъект.Итог("с3") > ОстМеньше) или (ТабОбъект.Итог("с4") > ОстМеньше) Тогда
                    Таб.ВывестиСекцию("Заказчик");
                КонецЕсли;
                            
                ТабОбъект.ВыбратьСтроки();
                Пока ТабОбъект.ПолучитьСтроку() = 1 Цикл
                    Если (ТабОбъект.с2 > ОстМеньше) или (ТабОбъект.с3 > ОстМеньше) или (ТабОбъект.с4 > ОстМеньше)   Тогда
                        сз.УдалитьВсе();
                        сз.ДобавитьЗначение(ТабОбъект.с1.Код);
                        
                СпрИстФин = СоздатьОбъект("Справочник.ИстФин");
                СпрИстФин.ПорядокКодов();
                СпрИстФин.ВыбратьЭлементы();  
                Пока СпрИстФин.ПолучитьЭлемент() = 1 Цикл  
                    КонецЦикла;
                        
                        Таб.ВывестиСекцию("Объект");    
                
                        Номер = Номер + 1;
                        
                        ТабЗначЗаказчик.НоваяСтрока();
                        ТабЗначЗаказчик.с1 = ТабОбъект.с2;
                        ТабЗначЗаказчик.с2 = ТабОбъект.с3;
                        ТабЗначЗаказчик.с3 = ТабОбъект.с4;
                    КонецЕсли;
                КонецЦикла;
                ТабОбъект.УдалитьСтроки();
                
                Если (ТабЗначЗаказчик.Итог("с1") > ОстМеньше) или (ТабЗначЗаказчик.Итог("с2") > ОстМеньше) или (ТабЗначЗаказчик.Итог("с3") > ОстМеньше) Тогда
                    Таб.ВывестиСекцию("Итого");
                КонецЕсли;
                
                ТабЗначИтогРайон.НоваяСтрока();
                ТабЗначИтогРайон.с1 = ТабЗначЗаказчик.Итог("с1");
                ТабЗначИтогРайон.с2 = ТабЗначЗаказчик.Итог("с2");
                ТабЗначИтогРайон.с3 = ТабЗначЗаказчик.Итог("с3");
                
                ТабЗначЗаказчик.УдалитьСтроки();
            КонецЕсли;
        КонецЦикла;
        Если (ТабЗначИтогРайон.Итог("с1") > ОстМеньше) или (ТабЗначИтогРайон.Итог("с2") > ОстМеньше) или (ТабЗначИтогРайон.Итог("с3") > ОстМеньше) Тогда
            Таб.ВывестиСекцию("ИтогоРайон");
        КонецЕсли;
        
        ТабЗначВсего.НоваяСтрока();
        ТабЗначВсего.с1 = ТабЗначИтогРайон.Итог("с1");
        ТабЗначВсего.с2 = ТабЗначИтогРайон.Итог("с2");
        ТабЗначВсего.с3 = ТабЗначИтогРайон.Итог("с3");
        
        ТабЗначИтогРайон.УдалитьСтроки();
    КонецЦикла;
    Таб.ВывестиСекцию("Всего");
    
    
    Таб.Опции(0,1,9);                              
    Таб.ПараметрыСтраницы(1,,,0,0,0,10,0,10,1,0);
    Таб.ТолькоПросмотр(1);
    Таб.Показать();
    
КонецПроцедуры
//======================================================================
Процедура ОбработкаЯчейкиТаблицы(список,фл)
    фл=1;
    тип=ТипЗначенияСтр(список);
    Если тип="СписокЗначений" Тогда
        фл=0;
        спрОбъект = СоздатьОбъект("Справочник.Объект");
        Если спрОбъект.НайтиПоКоду(СтрЗаменить(список.ПолучитьЗначение(1),"""","_")) = 1 Тогда
            ОткрытьФормуМодально("Обработка.ЖурналОбъекта", спрОбъект.ТекущийЭлемент());
        КонецЕсли;
    конецЕсли;
КонецПроцедуры
16 Irina3gger
 
29.06.17
16:31
Черт побери я нашла ошибку, почему переменную не определял)) но зато теперь пишет другую ошибку

Поле агрегатного объекта не обнаружено

Это как я понимаю в справочнике нет этого поля?
17 Волшебник
 
модератор
29.06.17
16:33
или поля, или метода
18 h-sp
 
29.06.17
16:39
(16) ну ты же пишешь

               ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);
                
                
                ТЗ.ВыбратьСтроки();
                Пока ТЗ.ПолучитьСтроку() = 1 Цикл


значит результат запроса у тебя пишется в ТЗ

вот у тебя тут поля ТЗ

ТЗ.Объект, ТЗ.ДолгПоОплате и так далее

Твое поле

ТЗ.Инфин


ты же его определила в запросе

Включай уже логику. Если ты подгрузила это поле в запросе, то уже не нужны никакие справочники.
19 Irina3gger
 
29.06.17
16:43
Включай уже логику. Если ты подгрузила это поле в запросе, то уже не нужны никакие справочники.

Я это и имела ввиду,я извиняюсь. за то что могу не правильно говорить терминологию, это все не опытность.

У меня вопрос созрел, если в запросе все 3 СПР есть в Справочник.Объект, но именно ИстФин не подтягивается, то в чем может быть проблема?

или лучше будет написать в запросе через LEFT JOIN?
Ошибка? Это не ошибка, это системная функция.