Имя: Пароль:
1C
1С v8
регистр сведений ГрафикиРаботыПоВидамВремени и табеля
,
0 vip67
 
16.07.15
09:15
Всем добрый день!
1с 8.2 УПП для Украины 1-3-30-1, SQL 2012 сервера нормальные по производительности.
возникла проблема при обработке табелей:
одновременно с табелями работает около 30 сотрудников (всего 60 подразделений) В каждом подразделении кол-во сотрудников колеблется от 5-ти до 800 (таких всего 2). В основном - около 50-100 сотрудников.
при попытке записи или проведении табеля очень часто (практически каждый пользователь) возникает ошибка:

Ошибка при выполнении обработчика - 'ПередЗаписью'
по причине:
{Документ.ТабельУчетаРабочегоВремениОрганизации.МодульОбъекта(2371)}: Ошибка при вызове метода контекста (Выполнить)

по причине:
Ошибка выполнения запроса
по причине:
Конфликт блокировок при выполнении транзакции:
Microsoft SQL Server Native Client 11.0: Транзакция (идентификатор процесса 60) вызвала взаимоблокировку ресурсов блокировка | буфер связи с другим процессом и стала жертвой взаимоблокировки. Запустите транзакцию повторно.
HRESULT=80004005, SQLSrvr: SQLSTATE=40001, state=34, Severity=D, native=1205, line=1

место ошибки: модуль объекта документ табель учета рабочего времени.
Процедура УдалитьЗаписиЗаПериодДокумента()
//    бил    
//Блокир_ = Новый БлокировкаДанных;
//ЭлементБлокировки = Блокир_.Добавить("РегистрСведений.ГрафикиРаботыПоВидамВремени");
//ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый;
//ЭлементБлокировки.УстановитьЗначение("Документ", ЭтотОбъект.Ссылка);
//Блокир_.Заблокировать();

//    бил    
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос.УстановитьПараметр("Документ", Ссылка);
    Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    ГрафикиРаботы.ГрафикРаботы,
    |    ГрафикиРаботы.Месяц
    |ПОМЕСТИТЬ ВТСотрудникоМесяц
    |ИЗ
    |    РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботы
    |ГДЕ
    |    ГрафикиРаботы.Документ = &Документ";
    Запрос.Выполнить();
    
    Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |СотрудникоМесяц.ГрафикРаботы КАК Сотрудник,
    |СотрудникоМесяц.Месяц КАК Месяц,
    |ВЫБОР
    |    КОГДА ВведенныеДокументы.ГрафикРаботы ЕСТЬ NULL
    |        ТОГДА ИСТИНА
    |    ИНАЧЕ ЛОЖЬ
    |КОНЕЦ КАК УдалятьЗаписиЗаПериод
    |
    |ИЗ
    |    ВТСотрудникоМесяц КАК СотрудникоМесяц
    |ЛЕВОЕ СОЕДИНЕНИЕ    
    |    (ВЫБРАТЬ
    |    СотрудникоМесяц.ГрафикРаботы,
    |    СотрудникоМесяц.Месяц
    |    ИЗ
    |        ВТСотрудникоМесяц КАК СотрудникоМесяц
    |    ВНУТРЕННЕЕ СОЕДИНЕНИЕ
    |        РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботы
    |    ПО
    |        ГрафикиРаботы.ГрафикРаботы = СотрудникоМесяц.ГрафикРаботы
    |        И НЕ ГрафикиРаботы.План
    |        И ГрафикиРаботы.Месяц = СотрудникоМесяц.Месяц
    |        И ГрафикиРаботы.Документ <> &Документ
    |        И ГрафикиРаботы.Документ <> ЗНАЧЕНИЕ(Документ.ТабельУчетаРабочегоВремениОрганизации.ПустаяСсылка)
    |    )КАК ВведенныеДокументы
    |ПО
    |    ВведенныеДокументы.ГрафикРаботы = СотрудникоМесяц.ГрафикРаботы
    |    И ВведенныеДокументы.Месяц = СотрудникоМесяц.Месяц";
    ВыборкаЗапроса = Запрос.Выполнить().Выбрать();
    
    НаборЗаписей = РегистрыСведений.ГрафикиРаботыПоВидамВремени.СоздатьНаборЗаписей();
    Пока ВыборкаЗапроса.Следующий() Цикл
        
        НаборЗаписей.Отбор.План.Установить(Ложь);
        НаборЗаписей.Отбор.ГрафикРаботы.Установить(ВыборкаЗапроса.Сотрудник);
        НаборЗаписей.Отбор.Месяц.Установить(ВыборкаЗапроса.Месяц);
        
        Если ВыборкаЗапроса.УдалятьЗаписиЗаПериод Тогда
            НаборЗаписей.Очистить();
            НаборЗаписей.Записать();
        Иначе
            
            НаборЗаписей.Прочитать();
            Для Каждого Запись Из НаборЗаписей Цикл
                Если (Запись.Документ = Ссылка) Тогда
                    Запись.ОсновноеЗначениеПолное = 0;
                    Запись.ДополнительноеЗначениеПолное = 0;
                    Запись.Документ = Документы.ТабельУчетаРабочегоВремениОрганизации.ПустаяСсылка();
                КонецЕсли;
            КонецЦикла;
            НаборЗаписей.Записать();
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры  // УдалитьЗаписиЗаПериодДокумента()

Кроме этого, очень часто табель записывается или проводится очень долго - до 30-40мин.
Разработчики (линия поддержки подтвердила узкое место с регистром сведений ГрафикиРаботыПоВидамВремени, советует либо дробить табеля (что нам не подходит), либо переводить конфигурацию на управляемые блокировки)
Как еще можно бороться с этой проблемой, потому как с управляемыми блокировками не сталкивался?
1 piter3
 
16.07.15
09:18
проведение на ночь регламентами например
2 leonidkorolev
 
16.07.15
09:24
(0) Если приемлемо, то проведение ночью, а в рабочее время типа предварительное проведение.
Я бы попробовал побаловаться блокировками. Сама УПП в управляемом режиме, надо только документ Табель перевести в управляемый режим.
3 vip67
 
16.07.15
09:24
(1) не подойдет,т.к. один табель начнет проводиться, а другие просто зависнут, кроме того если конец месяца - и нужно здавать табель сегодня, а необходимо править, то кто будет ждать до завтра?
4 vip67
 
16.07.15
09:25
(2) УПП работает в обычном приложении
5 leonidkorolev
 
16.07.15
09:30
(4) Эээээ... да нет вроде

http://screencast.com/t/U9P2bxJDipc
6 leonidkorolev
 
16.07.15
09:37
(4) А в самом документе Табель можно поиграться

http://screencast.com/t/PjzMCORyA
7 vip67
 
16.07.15
09:40
(5) ну, у меня режим блокировок стоит автоматический. по вашим картинкам - сама 1С - четко в управляемом, а табельв автоматическом режимах? и что это дает? напоминаю - у меня 8.2
я пробовал ставить 1с в автоматический и управляемый режим, а табель и регистр в управляемый. но тогда как я понимаю - нужно самостоятельно прописывать блокировки на все процедуры записи в документе? или если не пропишу - будет действоват ьавтоматическая блокировка?
8 leonidkorolev
 
16.07.15
09:44
(7) Каша в голове.
Короче. Автоматический режим это зло. Везде ставим управляемый.
9 piter3
 
16.07.15
09:45
(8) а код написан для управляемых?
10 leonidkorolev
 
16.07.15
09:49
(9) код нет. код надо править.
Закон Брукера: Даже маленькая практика стоит большой теории.