Имя: Пароль:
1C
1С v8
Значение не является значением объектного типа (ЭтоГруппа)
0 pnamik
 
11.08.16
21:57
Добрый вечер.
1С8.2, самописная
отчет по остаткам при формировании дает ошибку
{Форма.Форма.Форма(228)}: Значение не является значением объектного типа (ЭтоГруппа)
        Если Стр.Наименование.ЭтоГруппа = Истина Тогда
Отладчик показывает, что {(1,1)}: Переменная не определена (Наименование). Как устранить ошибку не знаю. Дайте, пожалуйста, подсказку или решение

Спасибо заранее
1 pnamik
 
11.08.16
22:01
Вычисление выражения: Наименование.ЭтоГруппа = {(1,1)}: Переменная не определена (Наименование)
2 hhhh
 
11.08.16
22:01
запрос давай. Похоже наименование путаешь со ссылкой.
3 pnamik
 
11.08.16
22:03
вот функция "сформировать отчет"

Функция СформироватьОтчет()
    ТекстЗапроса = ПолучитьТекстЗапроса();
    ЕстьУсловиеТ = Ложь;
    ЕстьУсловиеОст = Ложь;
    Если Фильтр <> Перечисления.ВидыФильтровОтчетов.ПоВсемТоварам Тогда
        //LKP++ 2015/10/11
        //Всё это лишнее, т.к. запрос идентичен с т.з. окончания и нужного фильтра
        //Если ТипЦен = Перечисления.ТипыЦенДокументов.Розничная Тогда
        //    //ТекстЗапроса = ТекстЗапроса + " ГДЕ ОстаткиТМЦОстатки.Номенклатура В (&Список) И РозничныеЦеныСрезПоследних.Номенклатура В (&Список)";
        //    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ОБЪЕДИНИТЬ",
        //        " ГДЕ ОстаткиТМЦОстатки.Номенклатура В (&Список) И РозничныеЦеныСрезПоследних.Номенклатура В (&Список)
        //        | ОБЪЕДИНИТЬ");
        //    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "СГРУППИРОВАТЬ ПО",
        //        " ГДЕ ОстаткиТМЦОстатки.Номенклатура В (&Список) И РозничныеЦеныСрезПоследних.Номенклатура В (&Список)
        //        | СГРУППИРОВАТЬ ПО");
        //Иначе
        //LKP-- 2015/10/11
            ТекстЗапроса = ТекстЗапроса + " ГДЕ ОстаткиТМЦОстатки.Номенклатура В (&Список)";
        //LKP++ 2015/10/11            
        //КонецЕсли;
        //LKP-- 2015/10/11
        Если МинОстаток+МаксОстаток <> 0 Тогда
            ТекстЗапроса = ТекстЗапроса + " И ОстаткиТМЦОстатки.КоличествоОстаток МЕЖДУ &МинОстаток И &МаксОстаток";
            ЕстьУсловиеОст = Истина;
        КонецЕсли;
        ЕстьУсловиеТ = Истина;
    Иначе    
        Если МинОстаток+МаксОстаток <> 0 Тогда
            ТекстЗапроса = ТекстЗапроса + " ГДЕ ОстаткиТМЦОстатки.КоличествоОстаток МЕЖДУ &МинОстаток И &МаксОстаток";
            ЕстьУсловиеТ = Истина;
            ЕстьУсловиеОст = Истина;
        КонецЕсли;
    КонецЕсли;    
    //LKP++ 2015/10/11    
    Если толькоВПериоде Тогда
        ТекстЗапроса = ТекстЗапроса + ?(ЕстьУсловиеТ ИЛИ ЕстьУсловиеОст," И "," ГДЕ ")+" вт_приходы.ЕстьПриходВПериоде ";
    КонецЕсли;
    //LKP-- 2015/10/11
    Если ТипЦен = Перечисления.ТипыЦенДокументов.Розничная Тогда
        ТекстЗапроса = ТекстЗапроса + " ДЛЯ ИЗМЕНЕНИЯ РегистрНакопления.ОстаткиТМЦ.Остатки, РегистрСведений.РозничныеЦены.СрезПоследних ИТОГИ СУММА(Сумма), СУММА(Остаток) ПО Наименование ТОЛЬКО ИЕРАРХИЯ АВТОУПОРЯДОЧИВАНИЕ";
    Иначе
        ТекстЗапроса = ТекстЗапроса + " ДЛЯ ИЗМЕНЕНИЯ РегистрНакопления.ОстаткиТМЦ.Остатки, РегистрНакопления.ДвиженияПоПартиям.Остатки ИТОГИ СУММА(Сумма), СУММА(Остаток) ПО Наименование ТОЛЬКО ИЕРАРХИЯ АВТОУПОРЯДОЧИВАНИЕ";
    КонецЕсли;

    Список = ПолучитьСписокТоваров();
    
    Запрос = Новый Запрос(ТекстЗапроса);
    Запрос.УстановитьПараметр("ГраницаОстатков",КонецДня(Дата));
    Запрос.УстановитьПараметр("ТекСклад",Склад);
    //LKP++ 2015/10/11
    Запрос.УстановитьПараметр("ПериодПриходаС",ПриходС);
    Запрос.УстановитьПараметр("ПериодПриходаПо",?(ПриходПо=Дата(1,1,1),ПриходПо,КонецДня(ПриходПо)));
    //LKP-- 2015/10/11
    
    Если ЕстьУсловиеТ = Истина Тогда
        Запрос.УстановитьПараметр("Список",Список);    
    КонецЕсли;    
    Если ЕстьУсловиеОст = Истина Тогда
        Запрос.УстановитьПараметр("МинОстаток",МинОстаток);
        Запрос.УстановитьПараметр("МаксОстаток",МаксОстаток);
    КонецЕсли;
    
    Результат = Запрос.Выполнить();
    
    Возврат Результат;
КонецФункции
4 pnamik
 
11.08.16
22:04
еще одна функция

Функция ПолучитьТекстЗапроса()
    //LKP++ 2015/10/11
    ТекстЗапросаПериода=
    "ВЫБРАТЬ
    |    ОстаткиТМЦОстаткиИОбороты.Номенклатура,
    |    Истина КАК ЕстьПриходВПериоде
    |ПОМЕСТИТЬ вт_приходы
    |ИЗ
    |    РегистрНакопления.ОстаткиТМЦ.ОстаткиИОбороты(&ПериодПриходаС, &ПериодПриходаПо, , , Склад = &ТекСклад) КАК ОстаткиТМЦОстаткиИОбороты
    |ГДЕ
    |    ОстаткиТМЦОстаткиИОбороты.КоличествоПриход > 0;";
    //LKP-- 2015/10/11
    Если ТипЦен = Перечисления.ТипыЦенДокументов.Розничная Тогда
        ТекстЗапроса =
        "ВЫБРАТЬ
        |    ОстаткиТМЦОстатки.Номенклатура КАК Наименование,
        //LKP++ 2015/10/11
        |    ЕстьNULL(вт_приходы.ЕстьПриходВПериоде,Ложь) КАК ЕстьПриходВПериоде,
        //LKP-- 2015/10/11
        |    РозничныеЦеныСрезПоследних.РозничнаяЦена КАК Цена,
        |    РозничныеЦеныСрезПоследних.РозничнаяЦена * ОстаткиТМЦОстатки.КоличествоОстаток КАК Сумма,
        |    ОстаткиТМЦОстатки.КоличествоОстаток КАК Остаток
        |ИЗ
        |    РегистрНакопления.ОстаткиТМЦ.Остатки(&ГраницаОстатков, Склад = &ТекСклад) КАК ОстаткиТМЦОстатки
        //LKP++ 2015/10/11
        |        ЛЕВОЕ СОЕДИНЕНИЕ вт_приходы КАК вт_приходы
        |        ПО вт_приходы.Номенклатура = ОстаткиТМЦОстатки.Номенклатура
        //LKP-- 2015/10/11
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РозничныеЦены.СрезПоследних(&ГраницаОстатков, Склад = &ТекСклад) КАК РозничныеЦеныСрезПоследних
        |        ПО РозничныеЦеныСрезПоследних.Номенклатура = ОстаткиТМЦОстатки.Номенклатура
        |            И РозничныеЦеныСрезПоследних.Склад = ОстаткиТМЦОстатки.Склад
        //LKP++ 2015/10/11
        //группировка не нужна. система компоновки сама всё соберет как надо
        |";
        //|
        //|СГРУППИРОВАТЬ ПО
        //|    РозничныеЦеныСрезПоследних.Номенклатура,
        //|    ОстаткиТМЦОстатки.Номенклатура,
        //|    РозничныеЦеныСрезПоследних.РозничнаяЦена,
        //|    ОстаткиТМЦОстатки.КоличествоОстаток";
        //LKP-- 2015/10/11
    Иначе
        ТекстЗапроса =
        "ВЫБРАТЬ
        |    ОстаткиТМЦОстатки.Номенклатура КАК Наименование,
        //LKP++ 2015/10/11
        |    ЕстьNULL(вт_приходы.ЕстьПриходВПериоде,Ложь) КАК ЕстьПриходВПериоде,
        //LKP-- 2015/10/11
        |    ВЫБОР
        |        КОГДА ОстаткиТМЦОстатки.КоличествоОстаток <> 0
        |            ТОГДА ДвиженияПоПартиямОстатки.СуммаОстаток / ОстаткиТМЦОстатки.КоличествоОстаток
        |        ИНАЧЕ 0
        |    КОНЕЦ КАК Цена,
        |    ДвиженияПоПартиямОстатки.СуммаОстаток КАК Сумма,
        |    ОстаткиТМЦОстатки.КоличествоОстаток КАК Остаток
        |ИЗ
        |    РегистрНакопления.ОстаткиТМЦ.Остатки(&ГраницаОстатков, Склад = &ТекСклад) КАК ОстаткиТМЦОстатки
        //LKP++ 2015/10/11
        |        ЛЕВОЕ СОЕДИНЕНИЕ вт_приходы КАК вт_приходы
        |        ПО вт_приходы.Номенклатура = ОстаткиТМЦОстатки.Номенклатура
        //LKP-- 2015/10/11
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДвиженияПоПартиям.Остатки(&ГраницаОстатков, Склад = &ТекСклад) КАК ДвиженияПоПартиямОстатки
        |        ПО ДвиженияПоПартиямОстатки.Номенклатура = ОстаткиТМЦОстатки.Номенклатура
        |            И ДвиженияПоПартиямОстатки.Склад = ОстаткиТМЦОстатки.Склад";
    КонецЕсли;
    //LKP++ 2015/10/11
    ТекстЗапроса=ТекстЗапросаПериода+Символы.ПС+ТекстЗапроса;
    //LKP-- 2015/10/11
    Возврат ТекстЗапроса;    
КонецФункции
5 pnamik
 
11.08.16
22:06
а эта часть кода процедуры Процедура ПоказатьПодчиненные(СтрокаДерева,Уровень=0)


Для Каждого Стр Из СтрокаДерева.Строки Цикл
        Если Стр.Наименование.ЭтоГруппа = Истина Тогда
            Область = Макет.ПолучитьОбласть("УровеньГр"+Строка(Уровень+1));    
        Иначе
            Область = Макет.ПолучитьОбласть("УровеньСт"+Строка(Уровень+1));    
            Область.Параметры.Единица = Стр.Наименование.Единица;
            Область.Параметры.Артикул = СокрЛП(Стр.Наименование.Артикул);
            Область.Параметры.ШтрихКод = СокрЛП(Стр.Наименование.ТекШтрихКод);
            Область.Параметры.ПарамРасшифровки = Стр.Наименование;
        КонецЕсли;
6 pnamik
 
11.08.16
22:07
часть процедуры, где появляется ошибка
7 Fram
 
11.08.16
22:13
(1) а почему в отладчике смотришь Наименование, а не Стр.Наименование ?
8 Fram
 
11.08.16
22:15
И называть ссылочную переменную в 1С Наименованием это, мягко выражаясь, совсем не бест практис.
9 pnamik
 
11.08.16
22:15
(7) вычисление выражения
Стр.Наименование = {(1)}: Значение не является значением объектного типа (Наименование)
10 Fram
 
11.08.16
22:16
(9) ну, Стр смотри значит
11 pnamik
 
11.08.16
22:18
помню, как-то была такая ошибка в базе из-за "объект не найден", знакомый спец зафиксировал ее с помощью
пока .... цикл (?), чтобы временно отчет формировался.
12 pnamik
 
11.08.16
22:19
(10) стр = Неопределено
13 Zamestas
 
11.08.16
22:20
(12) Результирующий запрос в студию не?
14 ВРедная
 
11.08.16
22:22
(11) Ты там кем вообще?
выполни запрос в консоли, или в отладчике выгрузи результат в таблицу и смотри, почему у тебя номенклатура = неопределено
15 hhhh
 
11.08.16
22:28
(11) откуда вызыается эта функцтя ПоказатьПодчиненные?? Нигде ведь нет ее.
16 pnamik
 
11.08.16
22:32
(15) вот эта процедура

Процедура ПоказатьПодчиненные(СтрокаДерева,Уровень=0)
    //LKP++ 2015/10/11    
    НужноВыделение=НЕ толькоВПериоде и (ЗначениеЗаполнено(ПриходС) ИЛИ ЗначениеЗаполнено(ПриходПо));
    //LKP-- 2015/10/11    
    Для Каждого Стр Из СтрокаДерева.Строки Цикл
        Если Стр.Наименование.ЭтоГруппа = Истина Тогда
            Область = Макет.ПолучитьОбласть("УровеньГр"+Строка(Уровень+1));    
        Иначе
            Область = Макет.ПолучитьОбласть("УровеньСт"+Строка(Уровень+1));    
            Область.Параметры.Единица = Стр.Наименование.Единица;
            Область.Параметры.Артикул = СокрЛП(Стр.Наименование.Артикул);
            Область.Параметры.ШтрихКод = СокрЛП(Стр.Наименование.ТекШтрихКод);
            Область.Параметры.ПарамРасшифровки = Стр.Наименование;
        КонецЕсли;    
        
        Область.Параметры.Наименование = СокрЛп(Стр.Наименование);
        //LKP++ 2015/10/11    
        Если НужноВыделение и НЕ Стр.Наименование.ЭтоГруппа Тогда
            //ИЛИ
            Область.Параметры.Наименование=СокрЛп(Стр.Наименование)+?(стр.ЕстьПриходВПериоде," *","");
            //ИЛИ
            Если стр.ЕстьПриходВПериоде Тогда
                Область.Область(1,1,1,17).Шрифт=Новый Шрифт(Область.Область(1,17,1,17).Шрифт,,,Истина);
            КонецЕсли;
        КонецЕсли;
        //LKP-- 2015/10/11    
        Область.Параметры.Остаток = Стр.Остаток;
        Область.Параметры.Цена = Стр.Цена;
        Область.Параметры.Сумма = Стр.Сумма;
        
        Если Уровень = 0 Тогда
            Попытка
                ИтогКоличество = Итогколичество + Стр.Остаток;
                ИтогСумма = ИтогСумма + Стр.Сумма;
            Исключение
            КонецПопытки;    
        КонецЕсли;
        ВыхТаб.Вывести(Область,Уровень+1,,?(РаскрытьГруппыПриВыводе=Истина,Истина,Ложь));

        ПоказатьПодчиненные(Стр,Уровень+1);
    КонецЦикла;    
КонецПроцедуры
17 pnamik
 
11.08.16
22:33
для формирования макета

есть в Процедуре КнопкаСформироватьНажатие(Кнопка)

в виде

ВыхТаб.НачатьАвтогруппировкуСтрок();
    ПоказатьПодчиненные(ДеревоЗн);    
    ВыхТаб.ЗакончитьАвтогруппировкуСтрок();
18 Fram
 
11.08.16
22:43
(12) ну, теперь отлаживай заполнение СтрокаДерева.Строки
19 pnamik
 
11.08.16
23:01
(18) СтрокаДерева.Строки = КоллекцияСтрокДереваЗначений
Родитель = Неопределено
могу дать доступ по тиму
20 hhhh
 
11.08.16
23:03
(17) ДеревоЗн что такое? ты как партизан, вообще нужно целый арсенал пыток к тебе применить, чтобы хоть что-то понять.
21 pnamik
 
11.08.16
23:09
22 pnamik
 
11.08.16
23:10
23 zladenuw
 
11.08.16
23:20
ужас :)
тут у тебя null, выводиться группировка. где нет наименования. по этому и ошибка.
Что это за чудо отчет такой
24 pnamik
 
11.08.16
23:33
наименование null наверно из-за битых ссылок.. после исправления сформируется отчет.
25 pnamik
 
11.08.16
23:34
был случай, когда спец с помощью пока .... цикл  "игнорировал" присутствие таких битых ссылок...
26 zladenuw
 
11.08.16
23:35
(25) ну напиши условие если СТр.Наименование = Null тогда продолжить; Конецесли;
27 zladenuw
 
11.08.16
23:36
(26) а вообще. у тебя итоги. и по этому по итогам. в верхней группировки может быть Null. ты в отладчике посмотри что у тебя выводить отчет в таблицу значений. и будешь значить. что именно нужно сделать
28 pnamik
 
11.08.16
23:39
(27) с отладчиком только на "ВЫ' я пока. потому предложил доступ по тиму..
29 zladenuw
 
11.08.16
23:41
у тебя есть в коде

Результат = Запрос.Выполнить();
пишешь  Результат = Запрос.Выполнить().Выгрузить();
ставишь точку остановки и смотришь что там вывелось. вроде shift+f9.

А не сударь. Могу только подсказать. Все остальное сам.
Иначе это оплачиваем.
30 pnamik
 
12.08.16
00:07
(29) ничего не получилось. попробовал еще в цикле пропускать ошибку типа

пока стр.наименование.Следующий() Цикл
31 hhhh
 
12.08.16
00:32
(30) проверяй стр и стр.наименование
32 pnamik
 
12.08.16
00:40
1) Пока Стр.Наименование.Следующий() Цикл
ошибка
Значение не является значением объектного типа (Следующий)
2) Пока Стр.Следующий() Цикл
ошибка Метод объекта не обнаружен (Следующий)
33 pnamik
 
12.08.16
00:57
решение
1. Попытка-Исключение-КонецПопытки (при этом не выводятся "битые ссылки"
2. исправление всех битых ссылок, и в этом случае без "попытки" (без изменения кода) отчет формируется нормально (показывает все восстановленные ссылки)
3. исправить код таким образом, чтобы независимо от битых ссылок, отчет сформировался правильно с учетом битых (тут уже я слаб пока.)

Спасибо всем за помощь
34 vicof
 
12.08.16
08:02
Пятнично
35 aleks_default
 
12.08.16
09:59
(34)+1
36 Ёпрст
 
12.08.16
10:21
(33) ты не поверишь, у тебя нет "битых" ссылок.
У тебя просто обе руки левые.
37 vicof
 
12.08.16
10:45
(36) И растут из ЖПО)
38 Fram
 
12.08.16
18:39
а че классное решение - каждый раз когда нарываешься на свою же ошибку просто оборачиваешь ее в попытку и вопрос закрыт ))
39 vicof
 
12.08.16
18:42
(38) это называется безопасное программирование))
AdBlock убивает бесплатный контент. 1Сергей