Доброе утро всем. Столкнулся с проблемой в запросах. Конфигурация с 8.2 перекочевала на 8.3, запускаем, вроде все работает, но в один прекрасный момент начинает жутко тормозить (процессор на 100%, все ждут пока завершится 1 запрос). Ковыряния в логах, конфигах и кодах показало следующий результат:
Со стороны PostgreSQL жутко тормозит такой запрос:
DELETE FROM _CRgActP435
WHERE EXISTS(
SELECT 1
FROM (SELECT 1 AS SDBL_DUMMY) SDBL_DUAL
INNER JOIN (SELECT
T4._RecorderTRef AS RecorderTRef,
T4._RecorderRRef AS RecorderRRef,
T4._LineNo AS LineNo_
FROM _CRgActP435 T4
INNER JOIN tt5 T5
ON T4._RecorderTRef = T5._RecorderTRef AND T4._RecorderRRef = T5._RecorderRRef AND T4._LineNo = T5._LineNo LIMIT 100000) T3
ON _CRgActP435._RecorderTRef = T3.RecorderTRef AND _CRgActP435._RecorderRRef = T3.RecorderRRef AND _CRgActP435._LineNo = T3.LineNo_
WHERE _CRgActP435._RecorderTRef = T3.RecorderTRef AND _CRgActP435._RecorderRRef = T3.RecorderRRef AND _CRgActP435._LineNo = T3.LineNo_);
Функция УчестьВытеснениеРасчетов(Конт, тбСостав) Экспорт
НаборЗаписей = РегистрыРасчета.РасчетЗарплаты.СоздатьНаборЗаписей();
НаборЗаписей.Загрузить(тбСостав);
// Получим дополнительные записи, имеющие признак сторно, которые необходимо добавить
// в текущий набор для того, чтобы в результате сохранения получился максимальный
// фактический период действия
Конт.Записать();
НаборЗаписей.Отбор.Регистратор.Значение = Конт.Ссылка;
НаборЗаписей.Записать(Истина, Ложь);
ТаблицаСторноЗаписей = НаборЗаписей.ПолучитьДополнение();
Для каждого Строка Из ТаблицаСторноЗаписей Цикл
// Сторно-запись движений
Движение = НаборЗаписей.Добавить();
// Свойства
Движение.ПериодРегистрации = Строка.ПериодРегистрацииСторно;
Движение.ПериодДействияНачало = Строка.ПериодДействияНачалоСторно;
Движение.ПериодДействияКонец = Строка.ПериодДействияКонецСторно;
Движение.БазовыйПериодНачало = Строка.БазовыйПериодНачало;
Движение.БазовыйПериодКонец = Строка.БазовыйПериодКонец;
Движение.ВидРасчета = Строка.ВидРасчета;
Движение.Сторно = Истина;
// Измерения
Движение.ФизЛицо = Строка.ФизЛицо;
Движение.Приказ = Строка.Приказ;
Движение.РУ = Строка.РУ;
// Ресурсы
// Реквизиты
Движение.ГрафикРаботы = Строка.ГрафикРаботы;
Движение.Ставка = Строка.Ставка;
Движение.ВидУчетаВремени = Строка.ВидУчетаВремени;
Движение.Подразделение = Строка.Подразделение;
Движение.Должность = Строка.Должность;
Движение.ЗанимаемыхСтавок = Строка.ЗанимаемыхСтавок;
Движение.НормаДнейЗаМесяц = Строка.НормаДнейЗаМесяц;
Движение.НормаЧасовЗаМесяц = Строка.НормаЧасовЗаМесяц;
Движение.СпособОтраженияВБухучете = Строка.СпособОтраженияВБухучете;
Движение.ЗаменаФизЛицо = Строка.ЗаменаФизЛицо;
Движение.ЗаменаВидРасчета = Строка.ЗаменаВидРасчета;
Движение.ЗаменаПриказ = Строка.ЗаменаПриказ;
Движение.ЗаменаЗанимаемыхСтавок = Строка.ЗаменаЗанимаемыхСтавок;
Движение.БазаРасчета = Строка.БазаРасчета;
Движение.БазаРасчетаВсего = Строка.БазаРасчетаВсего;
Движение.ДополнительныеДанные = Строка.ДополнительныеДанные;
Движение.ДокументОснование = Строка.ДокументОснование;
Движение.ПериодРасчетаСреднегоЗаработкаНачало = Строка.ПериодРасчетаСреднегоЗаработкаНачало;
Движение.ПериодРасчетаСреднегоЗаработкаКонец = Строка.ПериодРасчетаСреднегоЗаработкаКонец;
Движение.ПорогПоВзносам = Строка.ПорогПоВзносам;
Движение.ПериодНачалаРасчетаСредней = Строка.ПериодНачалаРасчетаСредней;
КонецЦикла;
НаборЗаписей.Записать(Истина, Ложь);
Возврат НаборЗаписей;
КонецФункции
Если Вы нашли запрос, который действительно тормозит, тогда смотрите планы запросов и стоимости операций.
Итак, нашел кое-какое решение для устранения этой печали, поставил PostgreSQL 9.3 с офсайта 1С. Теперь заполнение документа выполняется более-менее быстро (15-20 сек), но возникает другая беда. При работе двух и более пользователей все ждут пока кто-то один работает с уведомлением (через htop) LOCK TABLE waiting. Я так полагаю стоит блокировка всей таблицы сразу, а как можно по умолчанию указать блокировку только строк?
Нашел решение и этой проблеме в этой http://pro1c.org.ua/redirect.php?http://infostart.ru/public/144750/. Поставил управляемую блокировку в свойствах конфигурации и LOCK TABLE waiting исчез.
блокировка строк невозможна. Блокируется конкретная таблица перед записью.
Я скажу так - если запрос нормально отрабатывал на 8.2, то это проблема релиза 8.3. Корявость 1С никто не отменял.
Варианты решения следующие :
1. Отладить запрос в менеджере постгрю. Когда заработает, переделать запрос в 1С.
2. Если не поможет пункт 1, тогда переписать данную функцию на прямой запрос к БД, вставив уже готовый код отлаженого запроса.
3. Вернуть пользователя, который занимается расчетом ЗП на версию 8.2
В PostgreSQL блокировка на уровне записей возможна в управляемом режиме блокировок данных.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua