Версия для печати темы (https://pro1c.org.ua/index.php?s=6907126aa9cd41633d76315a14603469&showtopic=2872)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Очень долго выполняется запрос по регистру

Автор: Shurgent 04.02.11, 19:03

Здравствуйте, многоуважаемые All!

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

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

Please help! Я в тупике sad.gif

Автор: Batchir 04.02.11, 19:37

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

7.7 с 2005 вообще официально не дружат. А когда у меня (когда-то) возникали проблемы с производительностью выполнения запросов 7.7 на 2005 я брал в руки бубен (1С++) и переводил все проблемные запросы на прямые. Производительность увеличивалась не то что в разы - в десятки раз, тем самым давая второе дыхание умещающей конфе и давая себе время (без плача пользователей что всё тормозит) на разработку методики перевода компании на 8-ку.

Автор: Shurgent 05.02.11, 9:07

Если не затруднит, ткните меня в хороший RTFM, как грамотно делать прямые запросы, с примерами.

Автор: 7up 06.02.11, 0:58

Цитата(Shurgent @ 05.02.11, 10:07) http://pro1c.org.ua/index.php?act=findpost&pid=17911 или http://pro1c.org.ua/redirect.php?http://www.1cpp.ru/forum/YaBB.pl?num=1148874473

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

Автор: Shurgent 07.02.11, 10:30

Большое спасибо. Пошел штудировать smile.gif

Автор: Argus79 15.02.11, 13:32

Приветствую!

Не тестировал, но вроде бы что-то похоже ...
для 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 27.12.17, 10:25


 ! 

http://pro1c.org.ua/index.php?act=announce&id=2: 6
 

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua