<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55
global $wpdb2;
global $failure;
global $file_hist;
///// echo '<H2><b>Старт загрузки</b></H2><br>';
$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
///// echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}
$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
///// echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}
/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
///// echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
///// echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist); ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7]; ////получаем размер файла
$m_mtime_file=$masiv_data_file[9]; ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file
///// echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
///// echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
///// echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);
if ($results)
{ foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));
////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
///// echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
///// echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}
////загружаем данные
$table='vin_history'; // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация // (путь от корня web-сервера)
$delim=';'; // Разделитель полей в CSV файле
$enclosed='"'; // Кавычки для содержимого полей
$escaped='\
Навскидку интересно. Надо бы опробовать.
Очень хорошее описание, однозначно плюс
Какой программой открывать статью?
За статью плюс!!! Будет полезной.
Офисом
Статья хорошая, но однобокая… Всё-таки, блокировки лучше начать лечить с SQL — нормальное отлаживание регламентных заданий, оптимизированые скрипты, разделение файлов БД по разным дискам и т.д… Поэтому советую переименовать статью, точнее уточнить — режим управляемых блокировок
anig99 — у меня все регламентные задания настроены. Базы и логи на разных дисках. Серваки новые на каждом 16 гб. ОЗУ. Все как положено, только от блокировок deadlock это не спасает в часы пик юзеры вообще работать не могут. Просто по одной простой причине — последовательная выполнение транзакций, полная изоляция транзакций друг от друга. так что крути не крути а с блокировками в первую очередь нужно через 1с разбираться. Это я сам лично опробывал и имею хорошие результаты.
(7) сам себе противоречишь… сначала всё настроил для SQL, а потом уже за управляемые взялся… Как ни крути, но то, что при времени проведения документа в несколько минут не вылетает блокировка, пользователя не радует, а просто угнетает в меньшей степени. Просто по твоей статье все начнут врубать управляемые блокировки, хотя можно обойтись и SQL… По моему мнению управлеяемые блокировки — последнее средство, когда SQL достигает предела производительности.
Да нифига в режиме автоматических блокировок 1с 8.1 работает как 1с 8.0. Т.е. по сути платформу 8.1 разработали для того, чтобы в ней могли работать одновременно много пользователей и колотить документы. Ты почитай книжку «1с предприятие от 8.0 к 8.1»
Проблема в том, что при проведении в автоматических блокировках накладывается режим блокировки разделяемый и если две транзакции пытаются захватить одни и те же данные у них это получается, после их обработки каждой из транзакций необходимо выполнить исключительную блокировку транзакций для записи этих данных. В итоге ни одна ни другая этого не может сделать без принудительного прекращения одной из них вот это и есть deadlock. В управляемых блокировках, это решается путем наложения исключительной блокировки данных. Я сам до последнего момента сомневался и поразился результатам. Про SQL я не спорю если у тебя не настроены регламентные задания это увеличит блокировки, но как бы ты их не настраивал ты их не решишь одим sql. У меня с 5 — 7 вечера 40 операторов колотят накладные по 50 — 200 позиций в каждой. А у тебя база какого размера? Сколько юзеров работают?
а за управляемые я взялся потому, что результата не было.
Пересказ(Ctrl+C-Ctrl+V) Книги от 8.0 к 8.1.
Не рассмотрена проблема
эскалации.P.S. Блокировка на удаление движений нафиг не нужна.
Ну насколько помню я ссылки на книгу дал. И во всей статье на нее ссылаюсь.
Не рассмотрена проблема эскалации — я что то не понял там, что в заголовке статьи написано ЭСКАЛАЦИЯ БЛОКИРОВОК.
Это вообще отдельная большая тема.
Пишешь, на русский язык для людей переводишь, с примерами код готовый выкладываешь, а народ еще фукает и говрит не рассмотрена проблема такая то, я что к тебе на защиту диплома пришшел, не нравится не бери.
120 гБ — 30-50 пользователей.
Проблем с текущим проведение нет никаких. Проблемы начинаются, когда начинают перепроводить задним числом, тогда начинает решать тюнингованность sql.
А вообще я и не говорю о том, что всё можно решить одним sql. Я говорю о том, что сначала нужно решить проблемы с sql, а потом уже делать управляемые блокировки…ну по крайней мере сделать управляемые, но не забыть про sql.
(10) другой вопрос… сколько времени на проведение одного документа уходит?
Мало, ожидание на блокировках по времени значительно снизилось, замерял по конфигурации ЦУП. Да и потом, ожидание возникает в случае, если один склад одна номенклатура. Ну по словам операторов, им настало счастье.
(12)
В статье только сказано:
Вы очень не глубоко изучили этот вопрос и уже пишите слово «победил».
Вас почитают многие люди и сядут в лужу, то что у Вас все (3!!! документа) заработало просто счастливое стечение обстоятельств (мало данных и хорошее железо).
Не слово про измерения и индексы. Про разделяемый режим.
(12) Я выразил свое мнение, нужно было поставить минус без комментариев? — тогда бы Вы еще больше расстроились.
Вашу статью закачал обратно на IS. 😀
Ну если 7 000 документов «Реализация товаров и услуг» в день это мало, тогда я не могу представить много.
А за основу я взял типовую конфигурацию 1с, насколько я знаю там оптимально это дело настроено (я про индексы говорю). Да и потом, про сядут в лужу, мне это помогло я решил поделится, еще никто не запрещал перед глобальными изменениями делать бекап.
Этот вопрос я изучал около 2-х месяцев и многое перепробывал с настройками sql, ощутимых результатов я не увидел.
3 документа это чудо?
1 — случайность
2 — свопадение
3 — закономерность.
Да и никого я не заставляю это делать. А инфы про управляемые блокировки в нете действительно мало. Книги 1с в свободное скачивание тоже не предостовляются.
(15) Автор не пишет «как победить». Он делится информацией о том, как «он победил» в конкретной ситуации. Так что дезинформацией здесь и не пахнет.
Но конечно же, право на минус у Вас имеется…
(17) забейте если для Вас это критично я могу аннулировать свой минус.
вы просто не описали достаточно Важные вещи, о которых вы наверняка знаете. Просто могли упомянуть о них в статье для затравки, а более подробно описать потом. И Ваши читатели бы знали что не все так просто.
Я не стал читателей уводить в дебри, я сам, когда читал про эскалацию блокировок чуть мозг не сломал. Про это можно почитать тутhttp://www.gilev.ru/1c/81/lock/lock.htm но там не написано, конкретно если вы сделаете это, то настанет вам счастье.
21 Неодназначное впечатление
1. Статья начиналась как собственное понимание, а закончилась как ЖКК, т.е. нечитаемо, ну или я лично не осилил.
2. Способ помещения задач на проведения под одного пользователя практикуется в УПП давно. Я так понял, вы работали только с УТ и поэтому об этом либо не знали, либо вводите нас в заблуждение
3. Раз уж упомянули мою статью, отвечу:
лучше всего бороться с эскалацией в MS SQL Server 2008, без всяких управляемых блокировок
КАК БОРОТЬСЯ — это мой хлеб, за деньги готов продать свои знания
4. Почему вы не разложили действия этого пользователя по нескольким фоновым процедурам для НЕПЕРЕСЕКАЕМЫХ данных?
5. Радует одно, вы пишите за бесплатно, тем самым заполняя информационный вакуум
я не считаю, раз есть книжки от 1С, значит их дублировать не надо
но пожалуйста не копипастите их, а пишите полностью СВОИ мысли
пусть они буду с ошибками, но Вы же сами и научитесь в результате
по крайней мере, у меня получается учиться таким образом
рейтинговать не буду ввиду изложенного
надеюсь без обид
4. Почему вы не разложили действия этого пользователя по нескольким фоновым процедурам для НЕПЕРЕСЕКАЕМЫХ данных? вот эта интересная мысль.
2. Я работаю под SQL server 2005.
А Управляемыми блокировками решил воспользоваться, т.к. мне интересно показалось. А они чем то плохи? Просто не каждый знает все тонкости SQL server.
(22) дело не в том, хороши они или плохи.
В УПП все Вами сказанное есть, в том числе управлемые блокировки.
С другой стороны, заново изобретать велосипед не зазорно, мысли не могут иметь копирайта.
Про эскалацию — управляемые блокировки не могут спасти от эскалации, просто эскалация будет не на субд, а на кластере 1С.
Не правильный, но самый простой метод, который могу озвучить бесплатно — дробление количества движений на более мелкие порции.
Софтпоинт недавно проводил семинар по гибким блокировкам и дедлокам, также они обещали выложить материалы семинара в открытый доступ — нудо бы их пнуть (?) за обещанное…
http://www.softpoint.ru/info_id103.htm
ууу. начал читать статью.. на первых же шагах — «траблы»
..»нарисовалась такая проблема как блокировки (deadlock), собственно о них в дальнейшем и пойдет речь. Блокировка — это информация о том, данный ресурс захвачен «кем то» для выполнения какого-то действия.»
.
ну… из того, что я «усвоил» 😉 блокировки и дедлоки — это не одно и то же… Условно: блокировка — рано или поздно кончается, дедлок — это навсегда… 😉
народ, только не пинайте человека
он же СТАРАЛСЯ, а не продает что-то
(26) ни в коем же случае! любой кто знает больше чем «я» — уже вызывает уважение…
:)))
а я могу и просто так плюсы ставить,а корифеи зазнались уже 😮 ,там кто то написал что плюст а сам не поставил вот идиот
Цитата «нарисовалась такая проблема как блокировки (deadlock)»
Блокировки это не проблема.
Ожидание на блокировках это пробема и дедлоки это проблема.
Кроме того не понятно почему deadlock написано в скобках к словку «блокировки», дедлок и блокировка это разные вещи.
«… нам необходимо сохранить целостность данных, поэтому при проведении и обработки удаления проведения необходимо указать какие записи регистров блокировать».
Не понятно зачем при удалении проведения ставить УБ?
Рекомендую ознакомиться как сделаны УБ в УПП — она полностью переведена на УБ.
Вот цитата К. Рупосова (1С):
Если очень коротко, то ответ такой: все будет в порядке, платформа автоматически позаботиться обо всем, кроме одного – чтения данных в транзакции. Если вы хотите, чтобы до конца транзакции никто не смог изменить данные, которые вы прочитали, то вам нужно установить на них блокировку. Классический пример – контроль остатков. Вы прочитали остатки, приняли решение и начали записывать движения (в том числе списывать остатки). Если это происходит в автоматическом режиме, то все будет хорошо. Если в управляемом, то ваше чтение не защищено и кто-нибудь может списать ваши остатки после того, как вы приняли решение, но до того, как вы записали движения. В этом случае, ваши проводки могут оказаться некорректными (остатков, на которые вы рассчитывали, может уже не быть).
В итоге ставлю статье «минус» — все было сведено к переводу на УБ и при этом присутствуют неверные решения.
(31)
>Рекомендую ознакомиться как сделаны УБ в УПП — она полностью переведена на УБ
Я что-то пропустил? Или речь идет о: «ОбщегоНазначения.УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ,,истина,РежимПроведения);»
Вся типовая конфигурация УПП с работает в режиме блокировок «Автоматический»
(34) Нет речи о «ОбщегоНазначения.УдалитьДвиженияРегистратора». Причем оно здесь?
>> Вся типовая конфигурация УПП с работает в режиме блокировок «Автоматический»
По умолчанию да. Но с версии 1.2.15 появилась возможность включить управляемый режим.
(35)
то что появилась возможность совсем не означает «она полностью переведена на УБ «.
Для перевода корпеть и корпеть программисту ручками.
Да и режим блокировок не зависит от релизов конфигурации.
Или о чем речь идет? может прямо пример из текста типовой УПП?
(36) Не понимаю, что я должен написать, чтобы Вы восприняли «она полностью переведена на УБ»?
В описании нового и в конференции написано, что можно установить режим управления блокировкой — «Управляемый».
Или Вы не верете тому, что она полностью переведена на УБ?
Ну что же оставайтесь при своем, а в тоже время многие уже установили в УПП этот режим и довольны.
(37)
Действительно пропустил, спасибо.
Речь идет о процедуре общего модуля «УстановитьУправляемуюБлокировку», которая вызывается если изменён соответствующий флаг свойств конфигурации.
Спасибо за совет! я про УПП говорю. А в статье возможно где-то не так выразился. На критику каждый имеет право.
(34) не полностью только склад(партии) и взаиморасчеты ну и еще по мелочи, к сожалению на производство у них сил не хватило.
(40) Да, полностью согласен. И утверждение «она полностью переведена на УБ» будет соответствовать действительности когда в типовой демке в свойствах конфигурации будет установлен флаг «Управляемый».
Хотя должен признать, что программисту здорово облегчена работа и вместо «корпеть и корпеть» больше подходит «делай как я».
(40) А мог бы ты сказать в каком месте производства не хватает УБ?
(42) Да все производственные регистры.
Может напишу расширенную статью по этому поводу в своем блоге.
из того что я себе представляю: не может быть универсального решения на управляемых блокировках. все зависит от частностей — от темпов проведения доков, от характера самих доков и от много другого.. то есть чтобы сделать эффективные УБ — надо на живой базе или на тестовом стенде на объемах данных близким к реальным погонять и померять…
????
(44) есть общие правила по которым можно определить необходимость управляемой блокировки
Статья очень хорошая. Спасибо, помогла.
(45) речь не про это, а про то, что сам код упр.блокировок — будет зависеть от многих причин. т.е. упрощенно может потребоваться перетасовка порядка проведения по разным регистрам…
очень рад, что пригодилась.
Категорически согласен. Каждую конфигурацию надо рассматривать отдельно.
хочу попробовать воспользоваться вашим опытом. У нас терминальный режим, СКЛ 2000, управление торговлей 8.1. для беларуси. 20 пользователей. Документы заказ покупателя и реализация. и куча регистров к ним. Реализация проводится на завтра. Помогут ли здесь управляемые блокировки и могу ли я испортить базу, например остатки по минусу пойдут?
Спасибо автору за статью. Спасибо за расширенеи моего кругозора.
Побольше бы подобных статей где вы будете делится своими успехами и неудачами. Плюс.
Интересна как сама статья, так и комменты к ней, причем даже негативные..
надо больше таких статей, которые пусть и с какими-то недостатками, но описывают реальный опыт внедрения…
Интересная статья, спасибо
Я так понимаю что управляемые блокировки плюс установка исключительной блокировки в транзакции убирают возникновение ошибки deadlock, но у меня она все равно появляется при проведении двух разных документов Заказ покупателя, которые резервируют товар и в которых одинаковые товары
Статья полезная. Спасибо.
Много полезного узнала. Спасибо.
Я новичок в 1спрограммировании. Для меня оказалось полезным.
Интересная статья, я так понимаю блокировки которые выставлены в автоматическом режиме выполнаются на стороне СУБД. А управляемые на стороне платформы 8
Не все конечно удалось исправить, но некоторые моменты из статьи для себя почерпнул.
Мне для общего развития не лишнее. Хотя конечно все поверхостно. С блокировками нужно читать полноценные статьи, чтобы в них разобраться.
Посоветуйте, пожалуйста, как отловаить дедлок, в профайлере 5-6 раз в день вылезает, журнале регистрации видно что транзакция отваливается, поделитесь опытом как вы определяете где копать ?
ага. мне тоже интересно
Статья тупо слизана из книжки «Профессиональная разработка»!!!
http://1cexpo.ru/informacziya/27-blokirovki-dannyx-v-1spredpriyatii-8.html
И не стыдно за такой плагиат еще и «СтарМани» требовать?!
Ничего нового в статье на две страницы текста не почерпнул 🙁
Не советую это качать не тратьте время и деньги. вот такая же статья но на халяву 🙂