Здравствуйте.
1С:Предприятие 8.2 (8.2.19.130), "Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1" (4.1.14.01).
Конфигурацию модифицированная по хотелкам пользователей.
Сервер: VDS/VPS Xeon CPU E5-1650 v4 3,6GHz 4 ядра/ 8Гб / Windows Server 2008R2 Std 64bit / Диск С: = 120Гб по уверениям датацентра наш сервер располагается на SSD диске.
Проблема в следующем, периодически возникают притормаживания при подборе товара, которые выражается в задержке при наборе артикула (номера товара) в списке товаров в форме подбора, и при дальнейшем помещении товара (по нажатии Ввода) во временный элемент формы ТабличноеПоле.
Задержка между нажатием Ввода и появлением товара в ТабличномПоле может до 30 сек.
После подбора товаров и нажатии кнопки ОтправитьВДокумент содержимое временного ТабличногоПоля переносится в документ (Реализация, Поступление и т.д.) и в этом процессе также может быть притормаживание, в зависимости от количества позиций во временном ТабличномПоле.
P.S. Такие тормоза не являются постоянными, а возникают бессистемно в любой момент времени, в основном это период приходится на середину дня или вечер около 16:30, четкого графика нет, продолжительность таких подтормаживание может отличатся по продолжительности, так и по силе, но в основном длится минут 20-30. При этом диспетчер задач не показывает скачков загрузки процессора на процессах 1С - иногда у некоторых это значение на секунду может увеличиваться на 2-3%.
Несколько раз при возникновении тормозов звонил в поддержку, они смотрели и отмечали, что запускался бекап сервера, который видимо успешно не выполнился ночью, после этого они останавливали бекап, но тормоза еще какое-то время продолжались.
Поддержка ДЦ - перевели нас на SSD диск, сняли лимит по операциям на диске, но не помогает, и говорят, что проблема не на их стороне и что это проблема в конфигурации.
Подскажите пожалуйста, как можно найти причину данной проблемы, чтобы ее устранить.
Если потребуется какая-нибудь дополнительная информация, я постараюсь ее предоставить.
База файловая? Регламентные задания есть? Переиндексацию таблиц делали?
logist @ 26.11.16, 19:17
,
Да база файловая. Работает около 10 пользователей.
Регламентных заданий нет, каждый час планировщик windows запускает 1С с выполнением внешней обработки, которая выгружает остатки товаров на сайт и закрывается. Этот процесс занимает где-то 159 сек с учетом архивирования csv файла и отправки его на сервер и загрузки в таблицу.
Индексацию делал где-то месяц назад в разрезе ТиИ, думал, что тормоза связанны с ошибкой, но тестирование и исправление и индексацией не помогли.
Acid @ Сегодня, 14:49
,
Техподдержка ДЦ предлагают подключить разработчиков конфигурации для анализа, но т.к. конфигурация немного модифицирована меня мучают сомнения, что они откажут.
В частности модификация заключалась в следующем, была доработана форма подбора номенклатуры (из видимых):
было
стало
Теперь вся информация находится перед глазами и не нужно прыгать по закладкам, чтобы увидеть нужную информацию.
ТабличноеПоле "ПодобранныйТовар" используется для накопления подбираемого товара и потом отправкой его всего в документ - очень удобно и быстро получилось, т.е. набрал артикул нажал Ввод, в вопросе указал количество и набираешь другой артикул...
Плюс верхнее дерево и сам список товаров пришлось кинуть на панель (без закладок), т.о. ограничил их от нижней панели с закладками и перенастроил привязки, т.к. постоянно нарушалось построение элементов на форме - элементы наползали одни на другие сбиваясь в кучу, для восстановления нужно было выбрать "Восстановить положение окна", но это было до следующего открытия.
Но это все не влияет на тормоза.
Единственно, что дает визуализацию тормозов при непонятных нагрузках на диск это функция определения допустимого остатка при выборе товара, которая при выборе товара выполняет запрос на остаток и кол-во уже выписанного в реализациях, но еще не проведенных.
Функция ДопустимыйОстаток(Артикул)
Товар = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Артикул);
Запрос = Новый Запрос;
ПодразделениеТекущегоПользователя = "";
Если ТекСклад = 0 Тогда
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиТоваровКомпанииОстатки.Номенклатура,
| ОстаткиТоваровКомпанииОстатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ОстаткиТоваровКомпании.Остатки(
| ,
| Номенклатура = &Номенклатура) КАК ОстаткиТоваровКомпанииОстатки";
Иначе
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиТоваровКомпанииОстатки.Номенклатура,
| ОстаткиТоваровКомпанииОстатки.КоличествоОстаток,
| ОстаткиТоваровКомпанииОстатки.СкладКомпании
|ИЗ
| РегистрНакопления.ОстаткиТоваровКомпании.Остатки(, Номенклатура = &Номенклатура) КАК ОстаткиТоваровКомпанииОстатки
|ГДЕ
| ОстаткиТоваровКомпанииОстатки.СкладКомпании.РегионПродаж = &РегионПродаж";
Запрос.УстановитьПараметр("РегионПродаж", ТекСклад);
КонецЕсли;
Запрос.УстановитьПараметр("Номенклатура", Товар);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Остаток = 0;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Остаток = Остаток+ВыборкаДетальныеЗаписи.КоличествоОстаток;
КонецЦикла;
Если Остаток = 0 Тогда
Возврат Остаток;
КонецЕсли;
// Найдем и узнаем сколько пользователь уже добавил товара в подбор
НайденаяСтрока = ПодобранныйТовар.Найти(Товар.Артикул, "Артикул");
ПодобраноКоличество = 0;
Если НайденаяСтрока = Неопределено Тогда
Иначе
ПодобраноКоличество = НайденаяСтрока.Количество;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровТовары.Количество,
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваровТовары.Ссылка
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров КАК РеализацияТоваров
| ПО РеализацияТоваровТовары.Ссылка = РеализацияТоваров.Ссылка
|ГДЕ
| РеализацияТоваров.Проведен = ЛОЖЬ
| И РеализацияТоваров.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
| И РеализацияТоваров.Товары.Номенклатура В ИЕРАРХИИ(&Номенклатура)
| И РеализацияТоваров.СкладКомпании.РегионПродаж = &РегионПродаж";
ДатаНач = ДобавитьМесяц(НачалоДня(ТекущаяДата()), -1);
ДатаКон = КонецДня(ТекущаяДата())+1;
Запрос.УстановитьПараметр("ДатаНачала",ДатаНач);
Запрос.УстановитьПараметр("ДатаКонца",ДатаКон);
Запрос.УстановитьПараметр("Номенклатура",Товар);
Запрос.УстановитьПараметр("РегионПродаж",ТекСклад);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
ВыписаноВДокументах = 0;
Пока Выборка.Следующий() Цикл
Если Выборка.Номенклатура = Товар Тогда
ВыписаноВДокументах = ВыписаноВДокументах+Выборка.Количество;
КонецЕсли;
КонецЦикла;
ДопустимыйОстаток = Остаток - ПодобраноКоличество - ВыписаноВДокументах;
Если ВыписаноВДокументах > 0 Тогда
ПоказатьОповещениеПользователя("ПОИСК В ДОКУМЕНТАХ: ",ПолучитьНавигационнуюСсылку(Товар.Ссылка), Товар.Артикул+
" уже выписано в не проведенных документах "+Символы.ПС+
"в количестве: "+Строка(ВыписаноВДокументах)+" шт.",БиблиотекаКартинок.Информация);
КонецЕсли;
Возврат ДопустимыйОстаток;
КонецФункции
Разместите тестовую неизмененную базу и сравните производительность.
Ну как размещение кучи информации на одной закладке может не повлиять на тормоза?
"ВЫБРАТЬ
| ОстаткиТоваровКомпанииОстатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ОстаткиТоваровКомпании.Остатки(
| ,
| Номенклатура.Артикул = &Артикул
| И СкладКомпании.РегионПродаж = &РегионПродаж) КАК ОстаткиТоваровКомпанииОстатки ";
Просто без цикла:
ВыборкаДетальныеЗаписи.Следующий();
Остаток = ВыборкаДетальныеЗаписи.КоличествоОстаток;
Кстати, если в запросах будут использоваться ВТ(временные таблицы), естественно будет еще дополнительная нагрузка на диск.
Вместо ВТ переделайте на Вложенные Запросы.
Можете ещё показать структуру регистра ОстаткиТоваровКомпании?
т.к. база файловая, то единицей блокировки данных при записи является вся таблица целиком. Если в этот момент в базе идет "интенсивная" запись в таблицу ОстаткиТоваровКомпании, то работа с этой таблицей может быть проблемной.
Нет ли случайно запросов в транзакции на чтение этой таблицы?
Попробуйте проанализировать код документов, которые пишут в этот регистр. Предполагаю что там выполняется контроль остатков перед записью, что в свою очередь вызывает тормоза из-за ожиданий на блокировках.
ИМХО тут действительно нужно проанализировать конфу как предлагают в ДЦ.
Можно попробовать увеличить скорость записи данных, возможно там выполняется какой-то код, который неоправданно увеличивает время транзакции записи.
Вообще решением так же может быть переход на SQL (возможно есть возможность использования какой-то бесплатной lite версии в ДЦ), тогда единицей блокировки данных будет уже запись, а не таблица и проверить что все запросы попадают в индекс при выполнении.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua