Книга знаний

Рекламное место пустует
1С:Предприятие / v8 / Администрирование / Производительность

v8: Способы повышения производительности 1С 80

Подборка способов повышения производительности 1С 80Автор статьи: Гений 1С | Редакторы: Damned
Последняя редакция №12 от 21.07.06 | История
URL: http://kb.mista.ru/article.php?id=229

Ключевые слова: производительность


Ускорение работы с коллекциями значений



По возможности используйте вместо списков значений и структур соответствия - это единственная индексированная коллекция в 1С.

Для операций свертки и сортировки таблицы значений выгоднее использовать построитель запросов, чем встроенные методы Свернуть, Сортировать: Книга знаний: v8: Ускорение типовой свертки таблиц значений в 1С80

Допишите сюда другие известные вам способы ускорения производительности.

Совместная работа большого количества пользователей



Для терминального режима имеет смысл попробовать способ избавления от 100% загрузки процессора при блокировках: Книга знаний: Исправление ошибки 1С:Предприятие 7.7/8.0 - 100% загрузка процессора при ожидании блокировки

Вынесение кода проведения документа на сервер

Самый первый способ


Для этого весь код проведения документа нужно вынести на сервер.
Модуль документа:
Процедура ОбработкаПроведения()
    ПровестиДокументNNNНаСервере(Ссылка, Отказ); 
КонецПроцедуры

Общий модуль с флажком только "Сервер":
Функция ПровестиДокументNNNНаСервере(Ссылка, Отказ) 
...
КонецФункции

Более деликатный способ


Проведение из документа переносится на сервер.
Идет передача ссылки на сервер (передача объекта невозможна), на сервере идет вызов
проведения.
Модуль документа:
Процедура ОбработкаПроведения(Отказ, РежимПроведения) Экспорт 
#Если Клиент Тогда 

    ПровестиНаСервере(Ссылка, РежимПроведения, Отказ);
    Возврат;
#КонецЕсли

//Далее исходный код обработки проведения, выполняться будет только на сервере
...
КонецПроцедуры


Общий модуль только с галкой "Сервер":
Процедура ПровестиНаСервере(Ссылка, РежимПроведения, Отказ)
    Ссылка.ПолучитьОбъект().ОбработкаПроведения(Отказ, РежимПроведения);
КонецПроцедуры


Метод вынесения проведения на сервер тестировался на примере конфигурации УПП, документа ПеремещениеТоваров.
До вынесения документ проводился 13 секунд (работа кода - 3.5 сек, запись движений - 8.5 сек).
После вынесения - 4.5 секунд (работа кода - 2.5 сек, запись движений - 2 сек).

При этом, естественно, придется проделать работу по перестроению процедур и функций,
не доступных на сервере (находящихся в общих модулях только с галкой "Клиент" или в конструкциях
#Если Клиент Тогда #КонецЕсли) - нужно сделать их доступными на сервере.

Стоит отметить, что на файловом варианте такой код будет зацикливаться, так как все компилируется
на клиенте. Для обхода этой ошибки можно ввести дополнительный параметр процедуры "ОбработкаПроведения", например, так:
Процедура ОбработкаПроведения(Отказ, РежимПроведения, ЭтоПрограммныйВызов) Экспорт
    #Если Клиент Тогда

        ЭтоПрограммныйВызов = ?(ЭтоПрограммныйВызов=Неопределено, Ложь, ЭтоПрограммныйВызов);
        Если НЕ ЭтоПрограммныйВызов Тогда // для файлового варианта - исключаем зацикливание
            ПровестиНаСервере(Ссылка, РежимПроведения, Отказ);
            Возврат;
        КонецЕсли;
    #КонецЕсли

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

///////////
Процедура ПровестиНаСервере(Ссылка, РежимПроведения, Отказ)
    Ссылка.ПолучитьОбъект().ОбработкаПроведения(Отказ, РежимПроведения, Истина);
КонецПроцедуры


От Гения 1С: Лучше использовать специальную функцию, проверяющую, файловая версия или клиент-серверная и запускать ускорение только для клиент-сервера. Функция должна быть размещена в модуле сервера:
Функция обЭтоКлиентСервер()
#Если Клиент Тогда

    Возврат истина;
#КонецЕсли

Возврат ложь;
КонецФункции



Негативный эффект такого подхода - движения не записываются автоматически, придется их записать
в конце процедуры "ОбработкаПроведения". Например, так:
Для Каждого Набор из Движения Цикл
    Если Набор.Модифицированность() Тогда
        Набор.Записать(ложь); // ложь - чтобы не замещать движения, записанные ранее в этом же документе
    КонецЕсли;
КонецЦикла;


От Гения 1С: Лучше движения возвращать обратно в процедуру проведения и восстанавливать наборы записей (можно XML сериализацией). Тогда они зами запишутся штатно. Вообще наверное лучше объект сериализировать не XML сериализацией, а собственной обработкой в структуру, тогда можно в эту структуру и наборы записей запихнуть.
Закладка

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2021 | Mista.ru

Яндекс.Метрика