Анализ и пересчет итогов базы на SQL


Обработка производит сбор данных по нулевым строкам в таблицах итогов (Запрос к базе MS SQL) и позволяет пересчитать таблицы выборочно.

Не нашел подходящую обработку просмотра текущих нулевых итогов в базе, с функцией пересчета. Из-за чего получилось это творение.

До начала использования необходимо настроить подключение к SQL серверу, окно настройки вызывается системное вида:

В нем вбиваете адрес SQL сервера, данные авторизации и выбираете базу. После этого обработка подключается к серверу, получает данные и выводит их в таблицу.

Поля левой таблицы понятны по наименованию. Первая колонка, имя таблицы в базе MS SQL, вторая — её представление в именах метаданных, третья — число строк итоговой таблицы всего, четвертая — количество строк из них с нулевыми записями, пятая колонка — процент нулевых записей от полезных по нему производится сортировка. В таблицу выводятся только те итоги регистров, в которых есть какие-либо записи.

Правая таблица представляет из себя уточненные данные по периодам с сортировкой по дате итогов.

Обработка позволяет делать выборочный пересчет итогов, достаточно для этого выделить в левой таблице нужные строки и нажать кнопку Пересчитать. Обработка при этом возьмёт данные по периодам итогов и станет их пересчитывать, отображая индикатор выполнения. Расчет итогов по каждому периоду отдельно дает возможность не пересчитывать те итоги, у которых процент нулевых записей равен нулю, и в меньшей степени мешать пользователям блокировками.

Пользуйтесь на здоровье.

20 Comments

  1. Сурикат

    А пересчет выполняется средствами платформы или MS SQL?

    Reply
  2. AlexTeh

    Нет, пересчет только средствами 1С, но при желании можно доделать. Кроме того, когда делаешь пересчет платформой, то исправляются ошибки по итогам, которые сразу то и не заметишь.

    Reply
  3. Fox-trot

    (1) а какой тайный смысл делать средствами sql кроме поиска граблей?

    Reply
  4. AlexTeh

    (3) Надеются на уменьшение вероятности транзакций, а так же увеличение скорости выполнения.

    Reply
  5. Fox-trot

    если нарушится целостность, то скорость уже будет никому не нужна. и тебе тоже

    Reply
  6. AlexTeh

    (5) нарушить целостность ещё надо постараться… если даже и умудритесь что то испортить, то первый же пересчет итогов по периоду исправит ситуацию

    Reply
  7. Fox-trot

    насчет постараться я бы сказал, что ситуация прямо обратная. нужно очень постараться, чтоб НЕ нарушить целостность. ведь мы можем только предполагать, что хотели сказать программисты 1с, каков алгоритм. во-вторых, мы не можем гарантировать, что следующих версиях продукта алгоритм поменяется

    и наконец, пройдет какое-то время прежде чем мы узнаем, что целостность нарушена и отчеты кривые в налоговую к примеру бухгалтер отнес уже. но это уже совсем другая история 😉

    Reply
  8. axelrich

    Приветствую. Настроил соединение с сервером, проверил — ок.

    Получаю ошибку:

    {ВнешняяОбработка.АнализИПересчетИтоговSQL83.Форма.УправляемаяФорма.Форма(38)}: Ошибка при вызове метода контекста (Open)
    objRecordset.Open(ТекстЗапроса);
    по причине:
    Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Время ожидания запроса истекло

    Что это и как победить?

    Reply
  9. axelrich

    Попробовал создать чистую конфу и в ней открыть обработку. Так же настроил коннект к базе, проверил — ок.

    Получаю новую ошибку:

    {ВнешняяОбработка.АнализИПересчетИтоговSQL83.Форма.УправляемаяФорма.Форма(38)}: Ошибка при вызове метода контекста (Open)
    objRecordset.Open(ТекстЗапроса);
    по причине:
    Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Не был задан текст команды для объекта команды.
    Reply
  10. AlexTeh

    (8) Можно в функции подключения к базе, увеличить время ожидание ответа, поля:

    Соединение.ConnectionTimeOut = 510;  //<< — секунд
    Соединение.CommandTimeout = 500; //<< — секунд
    Reply
  11. AlexTeh

    (9) К сожалению, запуск на пустой, без итогов. Не отрабатывал, по этому и ошибка такая — безымянная. Нет итогов, нечего обрабатывать.

    Кроме того, хочу заметить, что на новых версиях платформы, изменили тип хранения даты и времени (по моему совместимость после 8.3.7). Тоже может быть ошибка…

    Reply
  12. axelrich

    (10)

    Изменил Соединение.ConnectionTimeOut на 60 (было 10)

    Соединение.CommandTimeout не нашел

    Результат тот же, просто теперь он минуту подождал, перед тем как выдать ошибку.

    {ВнешняяОбработка.АнализИПересчетИтоговSQL83.Форма.УправляемаяФорма.Форма(38)}: Ошибка при вызове метода контекста (Open)
    objRecordset.Open(ТекстЗапроса);
    по причине:
    Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Время ожидания запроса истекло
    Reply
  13. AlexTeh

    (12) Можешь смело ставить больше… Видимо у тебя база большая, а может ещё и диски медленные…

    Reply
  14. axelrich

    (13) База большая, диски быстрые, ошибка все равно выпадает за секунд 10-15… вне зависимости от времени установленного в Соединение.ConnectionTimeOut…

    Reply
  15. AlexTeh

    (14) Добавь еще строчку:

    Соединение.CommandTimeout = 500;

    после:

    Соединение.ConnectionTimeOut

    должно помочь.

    Reply
  16. axelrich

    (15)

    Соединение.CommandTimeout = 500;

    Благодарю!!!!! Помогло. Плюсую!

    Reply
  17. nvv1970

    (2) 1. Ошибки — ошибками, но почему нельзя сразу скулем грохнуть нулевые записи?

    2. Как вы рассматриваете записи с разделителем (splitter)? Они всегда нулевые.

    Reply
  18. AlexTeh

    (17) 1) Можно конечно удалить и запросом, но если у тебя база работаем 24/7, можешь получить не прогнозируемый результат. Гараздо безопаснее будет использовать платформенный механизм пересчета. Кроме того, тебе придется на каждый регистр писать свой запрос. Зачем такие сложности?

    2) Про splitter можно почитать тут Разделение итогов, и записи не всегда нулевые.

    Reply
  19. nvv1970

    (18) 1) Безусловно пересчет и лучше и проще и полезнее ) Тем более что время его выполнения не такое уж и кошмарное. Год назад даже озвучил бы цифры по времени для сотен миллионов записей. Проходили через это.

    Просто раз цель именно удалить нулевые — значит их нужно просто удалить ))))

    2) что-то я не подумавши ляпнул. Пруфы излишни ). Сколько раз смотрел на записи с ненулевым значением сплиттера — они почему-то всегда оказывались нулевыми. Видать везение. Любопытно, что значение сплиттера может быть не только 0 или 1. Интересно от чего зависит…

    Reply
  20. jefjef

    Так выглядят потраченные впустую стармани и полчаса рабочего времени.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *