Имя: Пароль:
1C
1С v8
Полтергейст на сервере.
0 Lama12
 
24.04.15
16:34
Есть код приведенный ниже. По какой-то причине, массив "МассивПредыдущих" обнуляется.
По записям в журнале регистрации в массиве число элементов следующее:
5 000
10 000
15 000
20 000
5 000
10 000

При этом в справочнике элементов около 170 000, т.е. повторный вызов функции не возможен.
В документации ограничений на размерность массива не нашел. Может плохо искал.

Кто сталкивался, может подскажете куда копать?


&НаСервереБезКонтекста
Функция ОбъектыМетаданныхКолво(ИмяМетаданных) Экспорт

    МассивПредыдущих = Новый Массив;
    КолВо = 0;
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 5000
                   |    МетаД.Ссылка КАК Объект
                   |ИЗ
                   |    Справочник.АдресныеСокращения КАК МетаД
                   |ГДЕ
                   |    НЕ МетаД.Ссылка В (&Ссылка)";
                  
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "Справочник.АдресныеСокращения", ИмяМетаданных);
    
    Пока Истина Цикл
        
        Запрос.УстановитьПараметр("Ссылка", МассивПредыдущих);
        РезультатЗапрос = Запрос.Выполнить();
        Если РезультатЗапрос.Пустой() Тогда
        
            Прервать;
        
        КонецЕсли;
        
        МассивОбработка = РезультатЗапрос.Выгрузить().ВыгрузитьКолонку("Объект");
        //Состояние("Обрабатываем:" + ИмяМетаданных);
        
        КолВо = КолВо + НайтиПоСсылкам(МассивОбработка , Неопределено, Неопределено, Неопределено).Количество();
        Для каждого Стр Из МассивОбработка Цикл
        
            МассивПредыдущих.Добавить(Стр);
            
        КонецЦикла;
        
        ЗаписьЖурналаРегистрации("СсылкиПоиск",УровеньЖурналаРегистрации.Информация,,,ИмяМетаданных + " - " + МассивПредыдущих.Количество(),);
    КонецЦикла;
    
    
    
    
    Возврат КолВо;
    
    

КонецФункции
1 H A D G E H O G s
 
24.04.15
16:37
(0) Перепиши алгоритм
2 H A D G E H O G s
 
24.04.15
16:38
|ГДЕ
                   |    МетаД.Ссылка > (&ПоследняяСсылкаПредыдущегоПрохода)";


Для надежности добавь

Упорядочить по Ссылка
3 H A D G E H O G s
 
24.04.15
16:39
(0) Сталкивался с таким при внеконтекстных вызовах и работой с ДеревомЗначений порядка 120000 строк.
4 yukon
 
24.04.15
16:41
(0) ОбъектыМетаданныхКолво
А сразу "Количество(Ссылка) КАК Колво" в запрос поставить не поможет?
5 Lama12
 
24.04.15
16:49
(2) Попробую. Спасибо.
(4) Мне нужна статистика использования объектов по  метаданным в базе. Писать робота для построения мегазапроса... как-то не хочется.
6 yukon
 
24.04.15
16:56
(5) Э-э, О_О.
"ВЫБРАТЬ
|    Количество(Ссылка) КАК Количество
|ИЗ
|    Справочник.АдресныеСокращения";

Мегазапрос? Тогда, прошу прощения, погорячился.
7 Lama12
 
24.04.15
16:58
(6) :) Мне не количество элементов нужно посчитать, а количество ссылок на них в базе.
8 Lama12
 
28.04.15
09:09
Похоже нашел в чем причина. Если процесс на сервере падает, то часть переменных в серверных процедурах обнуляется. Причем, какая часть обнулится - не ясно. Клиент переподключится автоматически на новый процесс, но процедура серверная будет работать "как повезет". Как диагносцировать и обрабатывать подобную ситуацию - не понятно. Попробую сделать пример не зависящий от данных и отправить в 1С.
В общем рекомендую с опаской обрабатывать на сервере большие объемы информации в оперативной памяти.
9 Lama12
 
28.04.15
10:23
8+ Да. Причина в падении приложения на сервере из-за превышения объема допустимой памяти под один процесс. Сервер перезапускает процесс. Переменные обнуляются.