Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 00:31

Почему моя программа работает о-о-очень долго???

Автор Рексарыч, 20 мая 2016, 15:48

0 Пользователей и 1 гость просматривают эту тему.

Рексарыч

Всем добрый день, господа.

Не считаю себя виртузом в программировании, скорее - очень средний середнячок, но вроде теорию программирования понимаю.

Сам вопрос задан в названии темы: "Почему моя программа работает о-о-очень долго???", - может кто подскажет, если есть время и желание, друзья :).

Платформа: 1С: Предприятие 8.3 (8.3.7.2027).
Конфигурация: 1С: ERP УП 2.0 (2.0.10.199).
Толстый клиент.
Тестирую программу через клиентскую часть.

Задача: отобрать по нужным критериям маршрутные листы, удалить объекты из "Трудозатрат" и провести документ (на всякий случай).

Проверив через консоль запросов запрос, выявил, что нужных записей более 1600-а, что немного (по моим прикидкам).

Но запустив обработку, уже сижу более ~30-и минут, а она всё крутится.

Сам код:



&НаСервере
Процедура УстановитьКоличествоНаСервере()

//лёгкая защита от невнимательности ;)
//проверка на заполненность данных
        Если Не ЗначениеЗаполнено(Подразделение) или Не ЗначениеЗаполнено(ДатаНачалаПериода) или Не ЗначениеЗаполнено(ДатаКонцаПериода) Тогда
    Сообщить("Значение не заполнено. Обработка невозможна.");
    Возврат;
КонецЕсли;

        //извлекаю из базы нужные МЛ
ТрудозатратыВМЛНаУдаление = новый запрос("
|Выбрать различные //первые 10
| Трудозатраты.Ссылка,
| ВидыРабот.Распоряжение.Ссылка,
| Трудозатраты.Ссылка.Подразделение.Ссылка,
| Трудозатраты.Ссылка.Начало,
| Трудозатраты.Ссылка.Статус,
| Трудозатраты.Ссылка.Статус.Порядок
|Из
| Документ.МаршрутныйЛистПроизводства.Трудозатраты как Трудозатраты
| левое соединение Документ.ВыработкаСотрудников.ВидыРабот КАК ВидыРабот
|По
| Трудозатраты.Ссылка.Ссылка=Распоряжение.Ссылка
|Где
| Трудозатраты.Ссылка.Подразделение.Ссылка = &Подразделение //Берутся МЛ по заданному подразделению
| и Трудозатраты.ВидРабот.Ссылка есть не NULL //Отбираются те МЛ, в которых в трудозатратах что-то есть
| и &ДатаНачалаПериода <= Трудозатраты.Ссылка.Начало <= &ДатаКонцаПериода //МЛ берутся за нужный интервал
| и Трудозатраты.Ссылка.Статус.Порядок = 3 //Статус = Выполнен
| и ВидыРабот.Распоряжение.Ссылка есть NULL //Выработка сотрудников нам ненужна
| и Трудозатраты.Ссылка.ПометкаУдаления = &ПроверкаНаУдаление");

        //передаю параметры из формы, которые вводит пользователь
ТрудозатратыВМЛНаУдаление.УстановитьПараметр("Подразделение", Подразделение);
ТрудозатратыВМЛНаУдаление.УстановитьПараметр("ДатаНачалаПериода", ДатаНачалаПериода);
ТрудозатратыВМЛНаУдаление.УстановитьПараметр("ДатаКонцаПериода", ДатаКонцаПериода);
ТрудозатратыВМЛНаУдаление.УстановитьПараметр("ПроверкаНаУдаление", ПроверкаНаУдаление);

ТрудозатратыВМЛНаУдаление = ТрудозатратыВМЛНаУдаление.Выполнить().Выбрать();

//осуществляю пробежку по всем отобранным объектам
Пока ТрудозатратыВМЛНаУдаление.Следующий() Цикл

//сообщить(2);
ТрудозатратыОбъект = ТрудозатратыВМЛНаУдаление.Ссылка.Ссылка.ПолучитьОбъект();

//сообщить(3.5);
ТрудозатратыСсылка = ТрудозатратыОбъект.Трудозатраты;

//очищаю табличную часть от всех данных
ТрудозатратыСсылка.Очистить();

//провожу документ
ТрудозатратыОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);

КонецЦикла;

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

&НаКлиенте
Процедура УстановитьКоличество(Команда)
   
    сообщить("Обработка начата.");
    УстановитьКоличествоНаСервере();
    сообщить("Обработка завершена.");

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


Старался сделать так, чтобы программа была линейна, а значит время должно быть приемлемым, но выходит, что можно выспаться, пока программа отработает.

P.S.

Пока дописывал сообщение - она завершила наконец обработывать данные. Итого: 40-45 минут примерно вышло.

Rasty

вопрос не в этом, а в том что вы перепроводите все 1600 документов, естесвено это не быстро, удалить проводки, сформировать проводки и так 1600 раз
Добавлено: 20 мая 2016, 15:54


ну и проведение одного документ 1-3 секунды умножаем и получаем 27 - 80 минут
Добавлено: 20 мая 2016, 15:56


и кстати чтобы избежать Ссылка.Ссылка можно в запросе писать
|  Трудозатраты.Ссылка.Подразделение.Ссылка КАК Подразделение
и обращение будет .Подразделение
Добавлено: 20 мая 2016, 15:57


Да и писать
|  Трудозатраты.Ссылка.Подразделение.Ссылка не имеет смысла
|  Трудозатраты.Ссылка.Подразделение  так короче и Подразделение уже несет в себе ссылку на нужный вам объект
Помогли - Скажи спасибо! Решил сам - поделись решением!
:)

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск