Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Очень долго выполняется запрос по регистру
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
Shurgent
Здравствуйте, многоуважаемые All!

1С 7.70.027 + SQL Server 2005
Конфигурация не типовая, писалась под нас.

Столкнулся с непонятной для меня проблемой. Есть у меня один довольно "тяжелый" регистр ПартииТоваров, по которому делается очень много движений. Период сохранения итогов - месяц. Т.е., если я правильно все понимаю, на 1-е число каждого месяца у меня есть итоги по регистру и все последующие итоговые значения вычисляются уже отталкиваясь от этой точки. Но при формировании отчета по этому регистру происходят странные вещи. Если ТА указывает на начало периода, то отчеты формируются практически мгновенно, за несколько секунд. Но стоит переместить ТА хотя бы на следующий день (провести документ 2-м числом, например), то отчеты по этому регистру начинают формироваться 40-50 минут 47046430.gif , при этом, судя по тому как активно 1С начинает "кушать" оперативку (около 300Мб), складывается впечатление, что она считает итоги не с 1-го числа, а от Рождества Христова.
Никто не сталкивался с таким поведением? Как-то лечится? Весь моск себе уже высушил, перегуглил и выгуглил пол интернета - никакой толковой инфы не нашел, кроме того, что 1С работает с SQL сервером "топорно".

Please help! Я в тупике sad.gif
Batchir
Цитата(Shurgent @ 04.02.11, 20:03) необходимо зарегистрироваться для просмотра ссылки
Никто не сталкивался с таким поведением? Как-то лечится? Весь моск себе уже высушил, перегуглил и выгуглил пол интернета - никакой толковой инфы не нашел, кроме того, что 1С работает с SQL сервером "топорно".

7.7 с 2005 вообще официально не дружат. А когда у меня (когда-то) возникали проблемы с производительностью выполнения запросов 7.7 на 2005 я брал в руки бубен (1С++) и переводил все проблемные запросы на прямые. Производительность увеличивалась не то что в разы - в десятки раз, тем самым давая второе дыхание умещающей конфе и давая себе время (без плача пользователей что всё тормозит) на разработку методики перевода компании на 8-ку.
Shurgent
Если не затруднит, ткните меня в хороший RTFM, как грамотно делать прямые запросы, с примерами.
7up
Цитата(Shurgent @ 05.02.11, 10:07) необходимо зарегистрироваться для просмотра ссылки
Если не затруднит, ткните меня в хороший RTFM, как грамотно делать прямые запросы, с примерами.


Например, необходимо зарегистрироваться для просмотра ссылки или необходимо зарегистрироваться для просмотра ссылки

По большим регистрам - ускорение в десятки раз. У нас SQL 2008R2. Обычно все запросы поддаются переписке и к ним еще и кусок кода обработки результатов запроса.
Наблюдал, как штатный СводныйОстаток выполняет запрос в 70Мб результатов, после чего на клиенте фильтрует и рассчитывает остаток по одному значению измерения smile.gif
Shurgent
Большое спасибо. Пошел штудировать smile.gif
Argus79
Приветствую!

Не тестировал, но вроде бы что-то похоже ...
для SQL 2000 можно использовать такую схему, используюя 1с++:

допустим, есть регистр "ОстаткиТМЦ" в резрезе ТМЦ, Партия, Кво, См


в глобальнике :

Перем РСОстатка Экспорт

Процедура ПриНачалеРаботыСистемы()      
    // 1С++ пошла...
    Попытка
        ЗагрузитьВнешнююКомпоненту("1cpp.dll");
        Database=СоздатьОбъект("ODBCDatabase");        
    Исключение
        Предупреждение("На удалось загрузить компоненту 1cpp.dll.
        |Дальнейшая работа невозможна.");
        СтатусВозврата(0);
    КонецПопытки;    
    
    
    РСОстатка = СоздатьОбъект("ODBCRecordSet");
    РСОстатка.УстБД1С(); // для старых версий 1с++
    ТекстЗапроса = "SELECT
    |QW.Партия [Партия $Справочник.Партии],
    |Sum(QW.См) См,
    |Sum(QW.Шт) Шт
    |FROM
    |(SELECT
    | Рег.Партия Партия,
    | Рег.СмОстаток См,
    | Рег.КвоОстаток См
    |FROM
    | $РегистрОстатки.ОстаткиТМЦ(,, (ТМЦ = ?) AND (Партия <> $ПустойИД),(ТМЦ,Партия),(Кво,См)) Рег
    |WHERE
    |( Рег.СмОстаток <> 0) AND (Рег.КвоОстаток <> 0)
    |) QW
    |GROUP BY
    |QW.Партия
    |ORDER BY
    |QW.Партия
    |";

    
    Попытка
        РС.ДобПараметр(1,14, 9 ,0);
        РС.Подготовить(ТекстЗапроса);
    Исключение
        Сообщить(РС.ПолучитьОписаниеОшибки());
    КонецПопытки;
    
    
..........    


КонецПроцедуры


---------------------------------------------
в том же глобальнике (или в документах) можно сделать процедуру (функцию) списания (получения) остатка по выбранному ТМЦ "ВыбТМЦ"

    ТЗ = СоздатьОбъект("ТаблицаЗначений");

    РСОстатка.УстПараметр(1,ВыбТМЦ);
    попытка
        ТЗ = РСОстатка.ВыполнитьИнструкцию();
    Исключение
        Сообщить(РСОстатка.ПолучитьОписаниеОшибки());
        Возврат;
    КонецПопытки;
anatol1c

 ! 

необходимо зарегистрироваться для просмотра ссылки: 6
 
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.