Имя: Пароль:
1C
1C 7.7
v7: Почему не во всех случаях выводится периодический реквизит?
0 Косяк
 
25.01.19
10:31
Всем доброго дня.

Почему то в отчет попадают только некоторые записи, хотя в справочнике они проставлены?

ОС.Подразделение.Получить( ТекущаяДата() )
1 trdm
 
25.01.19
10:33
Запрос плохо работает с периодикой.
2 Davalebor
 
25.01.19
10:35
(0) Не все элементы справочника ОС выводятся? Или не во всех, выведенных в отчет элементах, отображается подразделение?
3 Косяк
 
25.01.19
11:33
В отчет выводятся все элементы справочника ОС. Но не все реквизиты <Подразделение> выводятся, хотя их значения установлены (в разные годы)
4 ДенисЧ
 
25.01.19
11:34
(3) Открой ту шмэл, у которой не выводится, и посмотри историю реквизитов.
5 Косяк
 
25.01.19
12:03
Я в историю и смотрю. Там все проставлено
6 Косяк
 
25.01.19
13:50
НачДата = "01.12.2018";
    КонДата = "31.12.2018";
                                
    БИ = СоздатьОбъект("БухгалтерскиеИтоги");  
    
    БИ.ИспользоватьСубконто(ВидыСубконто.ОсновныеСредства);
    
    // в запросе количество не берем
    Если БИ.ВыполнитьЗапрос(НачДата,КонДата,"Н05.01,Н05.02",,,1,,1) = 0 Тогда
        Предупреждение("Не удается выполнить запрос к бухгалтерским итогам!",60);
        Возврат;
    КонецЕсли;
    
    СпрОС     = СоздатьОбъект("Справочник.ОсновныеСредства");
    СпрОС.ИспользоватьДату(ТекущаяДата(),1);              
    СпрПодр = СоздатьОбъект("Справочник.Подразделения");  
    
    БИ.ВыбратьСубконто(1);
    Пока БИ.ПолучитьСубконто(1) = 1 Цикл  
        
                
        ТекОС=БИ.Субконто(1);
        ТекОС.ИспользоватьДату(ТекущаяДата(),1);              
        
        ОС = СпрОС.НайтиПоКоду(ТекОС.Код); // Найдем ОС по инв.номеру
        
        //Если Подр.НайтиПоКоду(Подр)=1 Тогда
            Сообщить("ОС = "+СпрОС.Код+"     ТекОС.Код = "+ТекОС.Код+"   СпрОС.Подразделение = "+СпрОС.Подразделение);
        //КонецЕсли;
        



Выводится только небольшая часть подразделений, а остальные почему то не выводятся...
7 Вася Теркин
 
25.01.19
13:53
(6) База файловая? индексный файл убей. Только из программы выйди.
Только индексный убей, а не рабочий
8 Вася Теркин
 
25.01.19
13:54
он заканчивается на cdx
9 ZDenis
 
25.01.19
13:56
(6) Не понял зачем брать ОС из итогов, потом его искать в справочнике, а потом подразделение брать уже из справочника?
10 uno-group
 
25.01.19
13:58
СпрОС.НайтиПоКоду по ходу не всегда находит
11 Ёпрст
 
25.01.19
13:58
(9) в нике ответ же
12 Вася Теркин
 
25.01.19
14:01
(10) Ему объект нужен, а не ссылка...
13 Вася Теркин
 
25.01.19
14:02
А подразделение ему нужно на дату...
14 Вася Теркин
 
25.01.19
14:04
А в семерке разве не было НайтиЭлемент? Маразм проклятый.
15 Вася Теркин
 
25.01.19
14:04
Маразм = склероз. Точно, это склероз называется...
16 ZDenis
 
25.01.19
14:07
(14) было
СпрОС.НайтиЭлемент(ТекОС)
17 Косяк
 
25.01.19
14:07
Сообщить("ОС = "+СпрОС.Код+"     ТекОС.Код = "+ТекОС.Код+"   СпрОС.Подразделение = "+СпрОС.Подразделение);

СпрОС.Код и ТекОС.Код - выводят одинаковые значения во всех записях, а СпрОС.Подразделение - выводит всего несколько штук из 5 тысяч
18 Ёпрст
 
25.01.19
14:11
(0) нахрена вообще там бух запрос... ну и ладно..

ТекОС=БИ.Субконто(1);
Сообщить("ОС = "+ТекОС+"     ТекОС.Код = "+ТекОС.Код+"   ТекОС.Подразделение = "+ТекОС.Подразделение.Получить(ТекущаяДата()));
19 ZDenis
 
25.01.19
14:13
+ 18 только убрать вот это ТекОС.ИспользоватьДату(ТекущаяДата(),1);
20 Дмитрий
 
25.01.19
14:14
используешь дату для текос, а подразделение выводишь для спрос
21 Davalebor
 
25.01.19
14:17
(20) для СпрОс он ттоже написал использоватьдату, до бух запроса
22 Косяк
 
25.01.19
14:18
Несколько подразделений все таки выводятся, вот что удивляет
23 Косяк
 
25.01.19
14:19
ОС = м860ах     ТекОС.Код = м860ах   СпрОС.Подразделение = Цех №32 (транспортный цех)
24 HawkEye
 
25.01.19
14:22
(0) СпрОС.Подразделение.Получить(ТекущаяДата()) - что показывает (СпрОС.ИспользоватьДату - надо закоментировать) ?
25 Pit0n_08
 
25.01.19
14:22
.Получить(<Дата>)
.....
Метод  можно использовать только для периодических реквизитов справочника и если для справочника еще не применялся метод ИспользоватьДату.
26 Davalebor
 
25.01.19
14:26
(23) пробуй как в (18) написано.
и не забудь (19)
27 Davalebor
 
25.01.19
14:27
и на всякий случай, ТекущаяДата() что возвращает?
28 Косяк
 
25.01.19
14:28
текущая дата 25.01.2019
29 Косяк
 
25.01.19
14:32
ОС = Винтовой компрессор SB 75-08 инв.№5290117     ТекОС.Код = 5290117   ТекОС.Подразделение = Цех №2 (литейный)

Сделано как в (18), только несколько записей из тысяч выдает
30 Ёпрст
 
25.01.19
14:33
(29) весь код покажи
31 ZDenis
 
25.01.19
14:34
(29) А еще посмотреть бы скрин с историей того ОС, подразделение которого не попадает
32 Косяк
 
25.01.19
14:36
Процедура Сформировать()        
                                                
    Если НачДата = Дата(0) Тогда
        НачДата = НачалоПериодаБИ();
    КонецЕсли;    
    
    Если КонДата = Дата(0) Тогда
        КонДата = КонецПериодаБИ();
    КонецЕсли;
    
    НачДата = "01.12.2018";
    КонДата = "31.12.2018";
                                
    БИ = СоздатьОбъект("БухгалтерскиеИтоги");  
    
    БИ.ИспользоватьСубконто(ВидыСубконто.ОсновныеСредства);
    
    // в запросе количество не берем
    Если БИ.ВыполнитьЗапрос(НачДата,КонДата,"Н05.01,Н05.02",,,1,,1) = 0 Тогда
        Предупреждение("Не удается выполнить запрос к бухгалтерским итогам!",60);
        Возврат;
    КонецЕсли;
    
    //Выбранные бухгалтерские итоги поместим в таблицу значений
    Результат = СоздатьОбъект("ТаблицаЗначений");
    Результат.НоваяКолонка("ОС");
    Результат.НоваяКолонка("Группа");
    Результат.НоваяКолонка("нБаланс", "Число");
    Результат.НоваяКолонка("оБаланс", "Число");
    Результат.НоваяКолонка("кБаланс", "Число");
    Результат.НоваяКолонка("нАмортизация", "Число");
    Результат.НоваяКолонка("оАмортизация", "Число");
    Результат.НоваяКолонка("кАмортизация", "Число");
    
    СпрОС     = СоздатьОбъект("Справочник.ОсновныеСредства");
    СпрОС.ИспользоватьДату(ТекущаяДата(),1);              
    СпрПодр = СоздатьОбъект("Справочник.Подразделения");  
    
    БИ.ВыбратьСубконто(1);
    Пока БИ.ПолучитьСубконто(1) = 1 Цикл  
        
                
        ТекОС=БИ.Субконто(1);
        //ТекОС.ИспользоватьДату(ТекущаяДата(),1);              
        
        ОС = СпрОС.НайтиПоКоду(ТекОС.Код); // Найдем ОС по инв.номеру
        
        Если ТекОС.Выбран()=0 Тогда
            Продолжить;
        КонецЕсли;
        
        
        Результат.НоваяСтрока();    
        Результат.ОС=ТекОС;
        Результат.Группа=ТекОС.СубСчет01;
        
        БИ.ВыбратьСчета();
        Если БИ.ПолучитьСчет(,СчетПоКоду("Н05.01"))=1 Тогда
            Результат.нБаланс = БИ.СНД(1);
            Результат.кБаланс = БИ.СКД(1);
            Результат.оБаланс = БИ.ДО(1) - БИ.КО(1);
        КонецЕсли;
        Если БИ.ПолучитьСчет(,СчетПоКоду("Н05.02"))=1 Тогда
            Результат.нАмортизация = Результат.нАмортизация + БИ.СНК(1);    
            Результат.кАмортизация = Результат.кАмортизация + БИ.СКК(1);
            Результат.оАмортизация = Результат.оАмортизация + БИ.КО(1)-БИ.ДО(1);
        КонецЕсли;
    КонецЦикла;
    
    Результат.Свернуть("ОС,Группа","нБаланс,кБаланс,оБаланс,нАмортизация,кАмортизация,оАмортизация");
    Результат.Сортировать("Группа,ОС");
    // Создадим еще три таблицы значений для итогов по счету, подразделению и участку
    ИтогоГруппа = СоздатьОбъект("ТаблицаЗначений");
    ИтогоГруппа.Загрузить(Результат);

    ИтогоГруппа.Свернуть("Группа","нБаланс,кБаланс,оБаланс,нАмортизация,кАмортизация,оАмортизация");
    
    
    Таблица = СоздатьОбъект("Таблица");
    Таблица.ИсходнаяТаблица( "Таблица" );
    Таблица.ВывестиСекцию("С1");
    Таблица.ВывестиСекцию("С2");
    

    Результат.ВыбратьСтроки();
    ПредыдущаяГруппа="";
    
    N = 1;          
    Пока Результат.ПолучитьСтроку()=1 Цикл
        Если ПредыдущаяГруппа<>Результат.Группа Тогда
            Группа="("+Результат.Группа+") "+Результат.Группа.Наименование;
            Стр="";
            нБалансИтогоГр=0;
            оБалансИтогоГр=0;
            кБалансИтогоГр=0;
            
            нАмортизацияИтогоГр=0;
            оАмортизацияИтогоГр=0;
            кАмортизацияИтогоГр=0;
            
            нОстатокИтогоГр=0;
            кОстатокИтогоГр=0;
            Если ИтогоГруппа.НайтиЗначение(Результат.Группа,Стр,1)=1 Тогда
                ИтогоГруппа.ПолучитьСтрокуПоНомеру(Стр);
                нБалансИтогоГр=ИтогоГруппа.нБаланс;
                оБалансИтогоГр=ИтогоГруппа.оБаланс;
                кБалансИтогоГр=ИтогоГруппа.кБаланс;
                
                нАмортизацияИтогоГр=ИтогоГруппа.нАмортизация;
                оАмортизацияИтогоГр=ИтогоГруппа.оАмортизация;
                кАмортизацияИтогоГр=ИтогоГруппа.кАмортизация;
                
                нОстатокИтогоГр=ИтогоГруппа.нБаланс-ИтогоГруппа.нАмортизация;
                кОстатокИтогоГр=ИтогоГруппа.кБаланс-ИтогоГруппа.кАмортизация;
            КонецЕсли;
            
        КонецЕсли;
        
        ОС=Результат.ОС;              
        
        ДатаКонцаАмортизации = ОС.ДатаВводаВЭксплуатацию;
        ДатаКонцаАмортизации = ДобавитьМесяц(ДатаКонцаАмортизации,ОС.СрокПолезногоИспользования);;
        
    
        нБаланс=Результат.нБаланс;
        оБаланс=Результат.оБаланс;
        кБаланс=Результат.кБаланс;
        
        нАмортизация=Результат.нАмортизация;
        оАмортизация=Результат.оАмортизация;
        кАмортизация=Результат.кАмортизация;
        
        нОстаток=нБаланс-нАмортизация;
        кОстаток=кБаланс-кАмортизация;
                                                 
        Таблица.ВывестиСекцию("С4");  
        N = N + 1;
        ПредыдущаяГруппа=Результат.Группа;
    КонецЦикла;
    
    нБалансИтого=Результат.Итог("нБаланс");
    оБалансИтого=Результат.Итог("оБаланс");
    кБалансИтого=Результат.Итог("кБаланс");
    нАмортизацияИтого=Результат.Итог("нАмортизация");
    оАмортизацияИтого=Результат.Итог("оАмортизация");
    кАмортизацияИтого=Результат.Итог("кАмортизация");
    нОстатокИтого=Результат.Итог("нБаланс")-Результат.Итог("нАмортизация");
    кОстатокИтого=Результат.Итог("кБаланс")-Результат.Итог("кАмортизация");
      
    Таблица.ВывестиСекцию("С5");
    Таблица.Опции(0,0,0,0,"ОпцииОтчетаПоОС");
    Таблица.ТолькоПросмотр(1);
    Таблица.Показать("Отчет по ОС");
КонецПроцедуры
33 Davalebor
 
25.01.19
14:37
(29) Код написан верно. Может там в истории на эту дату и правда нет значений подразделения?
34 Косяк
 
25.01.19
14:38
(29)

Там в истории встречаются 2012, 2013, 2014 годы, а также 2018
35 Вася Теркин
 
25.01.19
14:38
Там индексы битые!!!!! Выйди из базы и удали все CDX. Очистил файлы CDX?
Потом тестирование и исправление запусти "Только тестировать"
36 trad
 
25.01.19
14:39
(30) получи! ))
37 Вася Теркин
 
25.01.19
14:39
Вообще проще Выгрузка-Загрузка
38 Вася Теркин
 
25.01.19
14:40
ОС = СпрОС.НайтиПоКоду(ТекОС.Код);//
Замени на
СпрОС.НайтиЭлемент(ТекОС)

и ещё раз пробуй
39 trad
 
25.01.19
14:41
(32) где тут вообще обращение к подразделению???
40 Вася Теркин
 
25.01.19
14:42
А вот это художество

        ОС = СпрОС.НайтиПоКоду(ТекОС.Код);// Найдем ОС по инв.номеру

        
        Если ТекОС.Выбран()=0 Тогда
            Продолжить;
        КонецЕсли;

не наоборот должно идти?
41 Гад
 
25.01.19
14:43
если в запросе при обращении к переодике значение одно, то выводить будет, если несколько значений то будет ПустоеЗначение
зы тема ж баян лет на 10 -15 с ней опоздал
42 Гад
 
25.01.19
14:44
грузи в тз и там с объектом работай как "периодический" при обработке значения
43 Kigo_Kigo
 
25.01.19
14:44
(39) В таблице печатной формы
И вообще ТС добавь колоку в ТЗ , запихни туда подразделения и в конце посмотри что и как заполнилось в ТЗ , через ТЗ.ВыбратьСтроку();
44 Вася Теркин
 
25.01.19
14:45
+1 Периодический всегда корректно дает
45 Davalebor
 
25.01.19
14:47
(41) Запрос-то тут при чем? У него не используется запрос для обращения к периодическому реквизиту.
46 trad
 
25.01.19
14:48
(45) ты прочитал ветку! читер
47 Гад
 
25.01.19
14:48
(45) 0+1  = 41 )
48 И_Вас_Вылечат
 
25.01.19
14:50
ТекОС=БИ.Субконто(1);
                    
ОС = СпрОС.НайтиПоКоду(ТекОС.Код);// Найдем ОС по инв.номеру

Зачем по коду то?
Не легше сразу элемент искать?

ОС = СпрОС.НайтиЭлемент(ТекОС);

Может у вас там сто тыщ миллионов элементов с одинаковым кодом
49 HawkEye
 
25.01.19
14:51
(40) (48) т.е. то, что его в принципе искать не надо... вас не смущает?
50 И_Вас_Вылечат
 
25.01.19
14:54
(49) немножко )
51 Косяк
 
25.01.19
14:54
(48) результат тот же самы - всего несколько подразделений

    СпрОС     = СоздатьОбъект("Справочник.ОсновныеСредства");
    СпрОС.ИспользоватьДату(ТекущаяДата(),1);              
    СпрПодр = СоздатьОбъект("Справочник.Подразделения");  
    
    БИ.ВыбратьСубконто(1);
    Пока БИ.ПолучитьСубконто(1) = 1 Цикл  
        
                
        ТекОС=БИ.Субконто(1);
        ТекОС.ИспользоватьДату(ТекущаяДата(),1);              
        
        //ОС = СпрОС.НайтиПоКоду(ТекОС.Код); // Найдем ОС по инв.номеру
        ОС = СпрОС.НайтиЭлемент(ТекОС);
        
        //Подр = СпрПодр.НайтиПоКоду(ОС.Подразделение.Код); //
                                                              
        
//ТекОС=БИ.Субконто(1);
//Сообщить("ОС = "+ТекОС+"     ТекОС.Код = "+ТекОС.Код+"   ТекОС.Подразделение = "+ТекОС.Подразделение.Получить(ТекущаяДата()));        
        
        //Если Подр.НайтиПоКоду(Подр)=1 Тогда
            Сообщить("ОС = "+СпрОС.Код+"     ТекОС.Код = "+ТекОС.Код+"   СпрОС.Подразделение = "+СпрОС.Подразделение+"  ОС = "+ОС);
        //КонецЕсли;
        
        //Сообщить("ТекОС= "+ТекОС+"     ТекОС.Код = "+ТекОС.Код);

        ////Если ТекОС.Выбран()=0 Тогда
        ////    Продолжить;
        ////КонецЕсли;
        
        //Если (ГруппаОС.Выбран()=1) и (ТекОС.АмортизационнаяГруппа<>ГруппаОС) Тогда
        //    Продолжить;
        //КонецЕсли;
        
        //Если ОбъектОС.ЭтоГруппа()=1 Тогда
        //    Если ТекОС.ПринадлежитГруппе(ОбъектОС)=0 Тогда
        //        Продолжить;
        //    КонецЕсли;
        //КонецЕсли;
52 И_Вас_Вылечат
 
25.01.19
14:55
проверка Выбран() тож так себе для ТекОС
53 Ёпрст
 
25.01.19
14:59
(51)

   БИ.ВыбратьСубконто(1);
    Пока БИ.ПолучитьСубконто(1) = 1 Цикл  
        ТекОС=БИ.Субконто(1);
        Сообщить("ОС = "+ТекОС+"     ТекОС.Код = "+ТекОС.Код+"   ТекОС.Подразделение = "+ТекОС.Подразделение.Получить(ТекущаяДата()));  
    КонецЦикла;
54 ZDenis
 
25.01.19
15:00
(51) эээ
после ОС = СпрОС.НайтиЭлемент(ТекОС);
в ОС будет 1 или 0, все смешали в кучу.

верный ответ был в (18). Если после этого выводится что-то не то, то в периодике проблема. может там обнуляется какой-то датой значение.
55 Ёпрст
 
25.01.19
15:00
выполни этот код и никакой отсебятинки
56 Davalebor
 
25.01.19
15:02
(51) Возьми код ОС, у которого ТОЧНО в истории есть значение реквизита подразделение на сегодняшнюю дату. и напиши простую обработку, что бы вывести его подразделение.

СпрОС     = СоздатьОбъект("Справочник.ОсновныеСредства");
СпрОС.НайтиПоКоду(Тут код ОС напиши);
Сообщить("ОС = "+СпрОС.Код+СпрОС.Наименование+"   СпрОС.Подразделение = "+СпрОС.Подразделение.Получить(ТекущаяДата()));
57 Ёпрст
 
25.01.19
15:02
И ... нафига вообще тебе впёрлось это подразделение, если его в коде потом нет нигде и оно не используется
58 trad
 
25.01.19
15:04
(57) телепаты говорят в таблице (43)
59 И_Вас_Вылечат
 
25.01.19
15:07
(54) таконо,
спрос.ТекущийЭлемент() надо присваивать то )
Ну и Ёпрст прав в 53
60 Косяк
 
25.01.19
15:09
(57) Я делаю файл выгрузки по ОС, чтобы самопальной обработкой загрузить эти данные, создавая по ходу загрузки элементы справочника ОбъектыЭксплуатации в 1С ERP и тут же создание документов ввода начальных остатков по ним. Проставлять потом вручную подразделения - трудоемко...
61 Ёпрст
 
25.01.19
15:10
(60) и ? как в (53) что хоть ?
62 Косяк
 
25.01.19
15:14
(53)

Вот этот код выводит только некоторые подразделения из 5000


БИ.ВыбратьСубконто(1);
    Пока БИ.ПолучитьСубконто(1) = 1 Цикл  
        ТекОС=БИ.Субконто(1);
        Сообщить("ОС = "+ТекОС+"     ТекОС.Код = "+ТекОС.Код+"   ТекОС.Подразделение = "+ТекОС.Подразделение.Получить(ТекущаяДата()));  
    КонецЦикла;
63 Ёпрст
 
25.01.19
15:17
(62) ну значит нет значений периодического реквизита у этих ОС на текущую дату.
64 Косяк
 
25.01.19
15:20
(62) У меня прямо в отчете можно кликнуть по колонке Наименовании - открывается эта позиция в справочнике ОС, смотрю - там задано подразделение, а в отчете его нет. Нахожу строку, где подразделение вывелось, открываю эту позицию в справочнике ОС и никакой разницы в <истории> реквизитов я не вижу
65 Ёпрст
 
25.01.19
15:22
(64) чудес не бывает, смотришь не то ОС.
66 Ёпрст
 
25.01.19
15:23
или не тот реквизит
67 Davalebor
 
25.01.19
15:23
(64) Скриншот окошка с историей значения реквизита подразделение сделай, для ОС, у которого по твоему этот реквизит на текущую дату существует, но в отчет подразделение не выводится.
68 Davalebor
 
25.01.19
15:24
(66) да, может не тот реквизит..
69 HawkEye
 
25.01.19
15:24
(64) уверен, что это другое ОС?))
70 Косяк
 
25.01.19
15:24
(66) Реквизит называется <Подразделение> и имеет тип Справочник.подразделения
71 Ёпрст
 
25.01.19
15:27
Ну так тогда:

БИ.ВыбратьСубконто(1);
    Пока БИ.ПолучитьСубконто(1) = 1 Цикл  
        ТекОС=БИ.Субконто(1);
      Если ПустоеЗначение(ТекОС.Подразделение.Получить(ТекущаяДата())) = 1 Тогда
      ОткрытьФорму(Текос);
      Возврат;"
     КонецЕсли;

    КонецЦикла;
72 Ёпрст
 
25.01.19
15:28
в открытой форме твоё подразделение есть ?
73 Косяк
 
25.01.19
15:29
Короче, нашел ошибку. Оказалось, что в зависимости от вида ОС, подразделение может стоять в Субконто1, Субконто2, в Субконто3
74 Косяк
 
25.01.19
15:31
Спасибо Коллеги, что простимулировали дополнительно пошевелить извилинами!:)
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший