Кто заблокировал объект ? 7.7 (SQL/DBF)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

99 Comments

  1. JohnyDeath

    Хорошо!

    Я по аналогии давно хочу сделать «журналирование изменений», но меня терзает один вопрос. Что будет происходить, если один пользователь записывает данные в базу Sqlite и одновременно второй пользователь также начнет писать свои данные.

    Не попадал на такое? Как бы красиво и без потерь разрулить подобные ситуации?

    Reply
  2. JohnyDeath

    Извиняюсь, толком не посмотрел твой код.

    Оказывается, у тебя идет бесконечный цикл попыток записи. Да, это решение проблемы, но какое-то тяжелое (для процессора).

    Reply
  3. Ёпрст

    (1) попадал, поэтому и все выполнения запросов обёрнуты в цикл + попытка

    А так ошибка будет «database is locked»

    И т.к таких ошибок по ЖР было за день не так много (штук 10 всего) при 50 пользователях, то такое решение оправдано..

    Щас вроде проблем нет.

    + новая версия ВК и режим «PRAGMA journal_mode=WAL» ускорили процессс записи в базу.

    Reply
  4. Ёпрст

    (2) не.. норм.

    Я ж проверил на живых пользователях методу сперва … и без цикла с попыткой

    🙂

    Reply
  5. JohnyDeath

    (3)

    новая версия ВК и режим «PRAGMA journal_mode=WAL» ускорили процессс записи в базу.

    Этот режим вряд ли ускорил запись в базу, просто теперь читатели и писатели не мешают друг другу.

    Вот кусок с офф. сайта:

    WAL might be very slightly slower (perhaps 1% or 2% slower) than the traditional rollback-journal approach in applications that do mostly reads and seldom write.

    Хотя это очень маленькая погрешность и ей можно пренебречь.

    Reply
  6. Ёпрст

    (5) да один хрен.. тут в табличке 2 поля всего.. быстро обновляет табличку.

    я забил на блокировку — ошибок блокировок мало цикл вполне оправдан.

    Reply
  7. Арчибальд

    Вот если бы система еще сама стучала по голове блокировальщику…

    Reply
  8. Ёпрст

    Добавлю, аналогично можно проверить, кто блокировал объект и при програмной записи..

    сделав тот же самый запрос , что и в ОбработкаБлокировкиОбъекта

    Reply
  9. venger

    Можно подумать, но это так, — фантазии, чтобы тому, кто заблокировал объект, выскакивало предупреждение о том, что надо бы объект освободить, так как уже очередь…;-)

    Reply
  10. prolancer

    (10) когда известен автор проблемы, можно и по телефону ему позвонить, или докладную шефу на стол…

    Reply
  11. Ёпрст

    (11) да и, если терминалка (или радмин какой-нить), самому закрыть объект..

    или сессию срубить..

    Reply
  12. Свой

    класс… твои юзеры наверное катаются в масле, окруженные такой заботой программиста 🙂

    Reply
  13. Ёпрст

    (13) по крайней мере, перестали мне звонить по этой ерунде — рулят сами

    Reply
  14. venger

    (13),(14) Я еще хотел сказать, что он просто о себе заботится, чтоб не дергали по ерунде, а не о пользователях, но опередил в 14-м посте;-)

    Reply
  15. Abadonna

    А ежели просто ограничить время, которое юзер может держать объект открытым?

    Одним формексом можно обойтись

    Reply
  16. venger

    (16) Как-бы это через чур жестко;-) Еще таймер обратного отсчета большими красными буквами: «До взрыва осталось: 00:00:03»;-) Да и с программной блокировкой тогда как быть?

    Reply
  17. hogik

    (16)

    «Одним формексом можно обойтись»

    — Эту задачу можно решить, вообще, без ВК. 😉

    (0)

    Хорошее решение проблемы.

    Но, думаю, еще имеет смысл устранять не следствие, а причину. Т.е. запретить пользователю открывать объекты БД в режиме редактирования по двойному щелчку в списках, журналах. Т.е. открывать в режиме просмотра объекта. И случайных проблем с «задним числом» будет меньше… Ведь чаще всего пользователи хотят только посмотреть объект БД, а не изменить его одновременно. Первичный документ, чаще всего, существует в одном экземпляре, на одном рабочем месте… Или не так? 😉

    Reply
  18. Abadonna

    (18)

    — Эту задачу можно решить, вообще, без ВК. 😉

    Что-то сомневаюсь, если только прописывать код в каждый объект, а это не комильфо

    Reply
  19. hogik

    (19)

    Прописывать надо. Но не в каждый объект. Т.к. до появления «формекса», уже давно, прописано во все объекты вызов глобальной функции решающей схожие алгоритмы в схожих местах. Типа:

    Процедура ПриОткрытии() хПриОткрытии(Контекст); КонецПроцедуры

    Процедура ПриЗакрытии() хПриЗакрытии(Контекст); КонецПроцедуры

    Нас самом деле, еще проще — используется общая функция, типа:

    хУсё(КодДействия,Контекст).

    Ну, а в конкретном случае данной темы, выполняются по смыслу следующий код, но расширенный на всё типы объектов 1С-а. Еще есть обработка показа списка всех заблокированных объектов.

    Процедура ПриОткрытии()
    Если (Форма.ТолькоПросмотр()=0) И (Выбран()=1) Тогда
    ЗначениеВФайл(КаталогИБ()+СтрЗаменить(ЗначениеВСтрокуВнутр(ТекущийДокумент()),»»»»,»_»)+».xxx»,ИмяПользователя(),0);
    КонецЕсли;
    КонецПроцедуры
    Процедура ПриЗакрытии()
    Если (Форма.ТолькоПросмотр()=0) И (Выбран()=1) Тогда
    ФС.УдалитьФайл(КаталогИБ()+СтрЗаменить(ЗначениеВСтрокуВнутр(ТекущийДокумент()),»»»»,»_»)+».xxx»);
    КонецЕсли;
    КонецПроцедуры
    Процедура Кнопка()
    Если ТекущийДокумент.Выбран()=1 Тогда
    Предупреждение(ЗначениеИзФайла(КаталогИБ()+СтрЗаменить(ЗначениеВСтрокуВнутр(ТекущийДокумент.ТекущийДокумент()),»»»»,»_»)+».xxx»,,0));
    КонецЕсли;
    КонецПроцедуры

    Показать

    Reply
  20. Abadonna

    (20)

    Т.к. до появления «формекса», уже давно, прописано во все объекты вызов глобальной функции решающей схожие алгоритмы в схожих местах. Типа:

    Процедура ПриОткрытии() хПриОткрытии(Контекст); КонецПроцедуры

    Вот и я про то же. У меня тоже было прописано глПриОткрытии() глПризаписи.

    Но ты, по ходу, лет 10 на одной базе сидишь, а у меня их сейчас чуть не по паре новых в день (не считая еще 8х). А прописать формекс у меня сейчас всего две строчки в ГМ, которые не фиг восстановить после обновления. Все остальное работает в ДопГМ, который правь на лету — не хочу

    Reply
  21. Abadonna

    +(21)Вот считай:

    Перем Сервис Экспорт; // раз строчка

    Процедура ПриНачалеРаботыСистемы()

    //………………………………

    ОткрытьФорму(«Отчет»,Контекст,КаталогИБ()+»СтартСистемы.ert»); // два строчка

    Коне

    Reply
  22. hogik

    (21)(22)

    Аркадий.

    Я же не против «формекса». Естественно, когда много разных конфигураций. Требуется делать обновления. Хочется не заниматься тупой работой. Надо использовать средства, типа, «формекса». А у меня, действительно 10 лет, всего, две конфигурации. Одна в бухгалтерии, в которую я не лезу. И одна, полностью самописная, для основной сферы деятельности конторы. Но эта конфигурация одна на все задачи конторы. От автосервиса до проходной. И база одна на всех. Мне легче, чем тебе, но ооо-чень скучно… 🙁

    Reply
  23. Ёпрст

    Ну да.. можно было бы обойтись одним формексом:

    ид-объекта получать через ЗначениеВСтрокуУнутрь, а блокировки писать в файло (коть в текстовик, хоть в дбф) и поиск там же..

    Вот только без ВК совсем не отловить интерактивное возникновение блокировки объекта. В лучшем случае, во всех формах списка /журналах документа прописать рукописное открытие формы через ОткрытьФорму() + смотреть, что возвращает метод.

    ежели нуль — искать в файле блокировок юзверя, открывшего объект.

    Но это как-то не очень.

    Reply
  24. hogik

    (24)

    «Но это как-то не очень.»(с)

    Да, «без ВК совсем не отловить интерактивное возникновение блокировки»(с). Надо либо «прописывать»(с) в списках/журналах, либо делать кнопку в списках/журналах, либо делать отдельную обработку с кнопкой в панели инструментов. Но пользователю не важно как это сделано если блокировки, такого рода возникают, один раз в неделю. Т.е., скажу еще раз, надо устранять причину. Открывать, по умолчанию, объекты в режиме «только просмотр». А если пользователям необходимо работать одновременно с одним объектом, то в схеме базы данных этот объект уже не один объект. Простой пример. Шапку документа забивает «бухгалтер», а строки документа «кладовщик». Сделать форму документа с закладками — это самое примитивное решение задачи. На самом деле (в нашем примере) шапка документа и строки — это разные объекты. Это в теории… 😉 И не в 1С… 🙁

    P.S. Повторю еще раз. Вы предложили очень хорошее решение проблемы. И использование этих ВК оправдано на 100%. Т.к., думаю, эти ВК используются в вашей системе не только для решения данной задачи. А, тогда, почему бы их не использовать и в этой задаче… 😉

    Reply
  25. Ёпрст

    (25) Да, так и есть — вк не только для этой задачи используются.

    По-поводу правки, документ может иметь несколько состояний (распечатан/собран/и т.д и т.п) + разные схемы отгрузки.. Все эти доп флаги-реквизиты документа проставляются как правило, обработками. Но документ может быть открыт аналитиком в это время, для правки самого документа. Вот и возникают коллизии.

    Не часто, но есть.

    Reply
  26. victuan

    Аж три ВК! Для такой рутинной задачи

    Reply
  27. Ёпрст

    (27) см. (24)… достаточно одной.. — формекс.

    Reply
  28. victuan

    (28) «можно было бы обойтись одним формексом»

    Так ведь не обошелся же 😀

    Reply
  29. Ёпрст

    (29) мне важна скорость работы и максимальное удобство, тем более, что 1cpp и 1sqlite используются в других местах кода, зачем лишать себя этого — не ясно.

    А так, можно и вообще всё без ВК сделать, только оно надо ?

    Reply
  30. hogik

    (26)

    «доп флаги-реквизиты документа проставляются … обработками»

    «документ может быть открыт … в это время … для правки самого документа»

    Об этом и говорю. Это и означает, что «доп флаги-реквизиты» не должны являются реквизитами документа. Т.е. наблюдается ошибка в проектировании схемы БД.

    Reply
  31. Ёпрст

    (31)Намекаешь, что состояния документов нужно хранить в подчиненном документе ? Или еще где ?

    Изменяются не только флаги, но и ключевые реквизиты типа Контрагент/договор/Фирма..

    Долго объяснять почему, связано с разными схемами учета.

    Reply
  32. hogik

    (32)

    Намекаю на, немного, другое. 😉

    Проблемы блокировки документов, последовательности, проведение задним числом, закрытие периодов, само понятие «провести», свертка БД, регистры и т.д. возникает при попытки «автоматизировать» предметную область документами и бух.проводками. Но эта предметная область называется — бухгалтерский учет (и все его разновидности). Судя по Вашим текстам из (26)(32) сообщений, делается попытка автоматизировать не бух.учет, а реальную жизнь конторы. И использовать, для этого, структуры схемы БД типа документ — не совсем логично. Думаю, документ должен появляться на конечном этапе всей «хоз.операции» исключительно для взаимодействия с внешним контрагентом, в виде распечатки, а не в БД как единое целое. Но, это, опять не про 1С… 🙁

    Reply
  33. Ёпрст

    (33) почитал ваши посты в других обсуждениях, примерно понял, об чем речь..

    К сожалению, в данный момент переделывать всё и уходить от логики, заложенной еще самой 1с не представляется возможным..

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

    Reply
  34. GenTay

    Скачал, поставил +. Внедрил — база стала неустойчивой, подвержена вылетам и медленной.

    Reply
  35. Ёпрст

    (35) ВК каких версий поставил ?

    И на счет медленной.. есть сомнения.

    У вас терминал, или чисто файловая ?

    Reply
  36. Ёпрст

    +36 скажем так, терминалка, пользователей от 40 до 70 в одной базе, проблем с падением производительности и нагрузкой на проц не наблюдается.

    Ну и вылетов, тем более нет.

    Reply
  37. Ёпрст

    +37 на счет, чисто файловой не скажу, не тестил под нагрузкой, ибо таких баз не имею.

    Reply
  38. JohnyDeath

    Да и для «чисто файловой» (вне терминала) базы директива sqlite

    PRAGMA journal_mode=WAL

    бесполезна

    Reply
  39. GenTay

    (36) Релиз 7.70.266. Прога основательно доработана. Есть центральная и 2 периферийки. Периферийки на терминалах. Вылеты случались на разных периферийных базах. Причем по времени обновил вечером, утром следующего дня начало вылетать. День непоняток, на сл.день глушу в конфе текст доработки и два дня тьфу-тьфу. В принципе нет и нет, не парюсь по этому поводу.

    Reply
  40. orefkov

    +(39)

    Я бы даже добавил, что

    запросSQLLite.ВыполнитьЗапрос(«PRAGMA journal_mode=WAL»);

    можно делать ТОЛЬКО если все юзеры этой базы сидят в ней на одном терминальном сервере. Если

    Reply
  41. Ёпрст

    (40) заремь 2 процы ОбработкаБлокировкиОбъекта и ПриНачалеБлокировки, проблема осталась ?

    попробуй заремить запросSQLLite.ВыполнитьЗапрос(«PRAGMA journal_mode=WAL»);

    если юзвери работают не на 1 сервере терминалов.

    (41) у меня так и есть…

    Reply
  42. Ёпрст

    +42 .. По-поводу частых блокировок Sqllite базы во время записи, их и не так много за целый день.

    Смотрел за 2 дня, тупо выкинув цикл с попыткой в ЖР.. При 50 пользователях, таких записей было ~15 за два дня.

    Так что.. загон в цикл с поп

    Reply
  43. Борода

    ОбработкаБлокировкиОбъекта не цепляет константы хотя ПриНачалеБлокировкиОбъекта отрабатывает. Это нормально ?

    Reply
  44. Ёпрст

    (44) нормально, я не ставил целью обработку констант, если нужно — дописать недолго.

    Reply
  45. Борода

    плюс однозначный.

    модифицировал малость:

    Если МонопольныйРежим()=1 Тогда

    запросSQLLite.ВыполнитьЗапрос(«delete from БазаБлокировок»);

    Иначе

    запросSQLLite.ВыполнитьЗапрос(«delete from БазаБлокировок Where Пользователь = ‘»+Пользователь.Наименование+»‘»);

    КонецЕсли;

    (45) в чем нормальность, просветите.

    Reply
  46. Ёпрст

    «Нормальность»

    в том, что лень было константы анализировать еще 🙂

    Reply
  47. Ёпрст

    (46) я бы не удалял сведения о пользователе — лишнее это.

    Там всегда при начале блокировки — INSERT or REPLACE — всегда эта запись «перезапишется», если была.

    Reply
  48. Борода

    (47) нет, «ненормальность» в том, что при попытке вторым юзером зайти в константу процедура ОбработкаБлокировкиОбъекта не отрабатывает вообще и 1С сразу выдаёт ошибку.

    Может это только у меня так ?

    Reply
  49. Ёпрст

    (49)Я не помню уже, ловит или нет, надо у АЛьФа спросить.

    Reply
  50. Ёпрст

    +50, для красоты, можно еще так сделать:

    //Сообщить(«» + Объект + » открыт пользователем » + ИмяВредителя,»!»);

    ДопТекст =»» + Объект + » открыт пользователем » + ИмяВредителя;

    Reply
  51. Борода

    (51) Это я уже сделал. Таки супер! 😀

    Reply
  52. dranzerf

    Вещь классная, тока, у меня почему-то наоборот не получается. Когда один пользователь заходит в справочник к примеру, то у другого выдает сообщение, а если этот другой откроет элемент справочника, а первый зайдет в него, то пишет только «объект открыт пользователем», а имя пользователя не пишет.

    В чем причина и как ликвидировать?

    Reply
  53. Ёпрст

    (53) Кто куда и откуда ?

    Нипонятна..

    Reply
  54. dranzerf

    Тут оказывается дело только в одном пользователе. Система блокировки не хочет определять его,тока не понятно почему. А с остальными все впорядке.

    Reply
  55. Ёпрст

    (55) как «определяешь» пользователя ?

    Через ИмяПользователя() или через глПользователь ?

    Reply
  56. Ёпрст

    +56 да еще, у этого пользователя, ВК загружены ?

    Reply
  57. dranzerf

    (56) глПользователь.

    (57) Мы работаем через терминал, база на серваке, т.ч. да.

    Reply
  58. Ёпрст

    (58) И ? наименование есть у него ?

    Мот он без рабочего каталога входит, как «не авторизован» ?

    Тогда и не пишется ему ничего..

    Reply
  59. Ёпрст

    +59 у этого пользователя открой табло и напиши глПользователь.Наименование, что возвращает ?

    Reply
  60. dranzerf

    Пишет — Ошибка в вырожении.

    Reply
  61. dranzerf

    Может стоит использовать ИмяПользователя а не глПользователь?

    Reply
  62. Ёпрст

    (61) ну вот и ответ.

    (62) проще пользователю создать нормальный рабочий каталог и проверить его наименование/код в справочнике Пользователи.

    Reply
  63. dranzerf

    Да нет. Все нормально. Просто тот, кто изначально заводил пользователей, не прописал им полное наименование. Т.ч. все работает, но все равно спасибо.

    Reply
  64. dranzerf

    Не. Все равно проблемы. Что-то со строкой: ИДОбъекта = глМД.ЗначениеВДлиннуюСтрокуБД(Объект);

    Вопрос такой — есть ли ограничения по версиям dll и конфигурации?

    Reply
  65. Ёпрст

    (65) есть.

    1cpp желательно иметь 3-ей версии

    Reply
  66. vitapi

    А почему это решение не подходит для 1С SQL? Мне для SQL надо…

    Reply
  67. Ёпрст

    (67) потому, что на 1sqlite написано, а так, в SQL сделать намного проще — создал табличку для хранения заблокированных объектов в самом скуле + всё тоже самое + синтаксис запроса подправить.

    Reply
  68. vitapi

    (68) То есть, как я понимаю, это вопрос целесообразности? Я было подумал, что это несовместимо с SQL.

    Reply
  69. Ёпрст

    (69) для скуля это просто можно сделать разными способами, (на софтпоинте есть одно из решений, например)

    а вот для дбф никто не удосужился, вот я и выложил.

    А так, для скуля всё сделать по-аналогии, только заместо базы в sqlite использовать свою табличку в скуле.

    проверяешь есть ли она, если нет , то create table и всё собственно, так же в ПриНачалеБлокировки пишешь в неё того кто заблокировал, потом так же обрабатываешь блокировку.

    Короче, тот же код, только синтаксис запроса чуть другой.

    Reply
  70. Ёпрст

    +70 добавил для скуля.. пробуйте.

    Reply
  71. Sergafan10

    На скуле не показывает пользователя, но мне кажется это у тех, у кого права в системе «овощные» или же библиотека не зарегана. Заходил под админом на двух разных тачках — всё путем.

    Reply
  72. Ёпрст

    (72) Это, использовал ПолноеИмяПользователя() или глПользователь.Наименование ?

    Reply
  73. Ёпрст

    +(73) ну и 1cpp и formex желательно грузить в ПриНачалеРаботыСистемы ( и регистрить их спецом не надо, они уже сто лет в обед в этом не нуждаются)

    ЗЫ: ставмит только последних версий желательно 3 и выше для 1cpp и ..101 и выше для формекса.

    Reply
  74. Sergafan10

    Судя по всему ПолноеИмяПользователя(), т.к. у того, кем блокировал, как раз его и не было(причём только у одного). ;)))

    Рад, что регать не надо, у меня версии свежие, а то я уж способы регания библиотек в домене наскоблил)))

    Спасибо!!! Плюсанул.

    Reply
  75. sCHTASS

    Могет кому будет полезно и мое творение http://infostart.ru/public/19782/.

    Отличие от этой разбработки:

    1) использует 2 компоненты: 1с++ и formex

    2) работает _ТОЛЬКО_ на sql-базах

    3) чтобы все заработало, нужно прописать в глобальнике только одну строку.

    4) в любой момент можно отключить/включить приблудку.

    Reply
  76. Ёпрст

    (76) публикация не активна, а так, моя поделка использует 2 ВК для скуля и 3 для ДБФ, хотя можно и 1-ой обойтись — формексом, но не удобно.

    Reply
  77. sCHTASS

    (77) Странно. Когда-то была активной…

    Reply
  78. Ёпрст

    (78) посмотрел, всё тоже самое, отличие — все действия в доп глобальнике, минус — не проверяется, был ли он(доп глобальник) уже загружен ранее.

    🙂

    Методе то сто лет в обед

    Reply
  79. Ёпрст

    цуцй

    Reply
  80. natalika1601

    После подключения данной обработки при закрытии базы стала выскакивать ошибка отложенной записи Windows. И база стала тормозить. Что с этим делать? База dbf.

    Reply
  81. Ёпрст

    (81)

    база по сети ?

    в терминале ?

    ВК каких версий поставили ?

    Reply
  82. cabat

    Использую данную схему некоторое время (база DBF, база блокировок в SQLite-файле), все гуд.

    Но тут наткнулся на такой момент — при массовой обработке объектов получаем большой поток блокировок объектов

    и соответствующее кол-во запросов вставок в базу блокировок.

    И что то как то подтормаживает все это некисло..

    Пока обошел так — добавил методы начала и фиксации транзакции при записи в SQLite, перед массированной обработкой объектов начинаю транзакцию, после фиксирую..

    Ускорение на порядок, но как то некузяво это..

    Может какое более красивое решение есть?

    Reply
  83. Ёпрст

    (83) база в терминале или по сети ?

    У меня, даже при массовых операций тормозов не замечено.

    Reply
  84. Ёпрст

    база в терминале, правда.

    Reply
  85. cabat

    боевая база в терминале, для разработки локальная — результат одинаковый

    по профайлеру получается, что 80% времени выполнения массовой обработки объектов занимает запись в таблицу заблокированных объектов..

    если обернуть процедуру в транзакцию SQLite, то время выполнения сокращается на порядок..

    Reply
  86. cabat

    попробовал на всякий случай сначала один раз подготовить запрос, а потом вызывать с параметрами — результат тот же..

    причем ведь файлик базы SQLite весит то всего 10-20Кб, а скорость вставки записей очень низкая получается..

    наверное я просто не умею ее готовить 🙁

    Reply
  87. Ёпрст

    (86) странно, у меня в худшем случае, если кто-то ужо пишет туда.. но по логам в ЖР, когда цикла с попыткой выполнения запроса не было, таких случаев в день при 70 юзверей, не так и много..

    А с попыткой в цикле и так влёт влетает.

    1sqlite какой версии хоть ?

    Покажи, как свою транзакцию ставишь.

    Reply
  88. cabat

    1sqlite версия: 1.0.2.3

    транзакция ставится выполнением запроса «BEGIN TRANSACTION», фиксируется «COMMIT TRANSACTION»

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

    только у меня используется класс-обертка над объектом 1sqlite для выполнения запросов

    Reply
  89. Ёпрст

    (89) странно..

    Ладно, попобую поиграться на досуге..

    Ты кстати, отключение журналирования делал ?

    Reply
  90. cabat

    (90) а то..

    даже спецом добавил в класс метод, который возвращает текущий режим — думал, может не срабатывает..

    пробовал даже режим MEMORY ставить..

    может конечно, имеет смысл с Сашей Орефковым посоветоваться, может я что то не так делаю при работе с 1sqlite..

    Reply
  91. kozorez
    Хорошее решение проблемы.

    Но, думаю, еще имеет смысл устранять не следствие, а причину. Т.е. запретить пользователю открывать объекты БД в режиме редактирования по двойному щелчку в списках, журналах. Т.е. открывать в режиме просмотра объекта. И случайных проблем с «задним числом» будет меньше… Ведь чаще всего пользователи хотят только посмотреть объект БД, а не изменить его одновременно. Первичный документ, чаще всего, существует в одном экземпляре, на одном рабочем месте… Или не так? 😉

    тоже считаю что очень правильное решение, плюс настроенные права пользователей, не открывать что не нужно или не редактировать.

    Reply
  92. Rockman

    Большое спасибо.

    Reply
  93. phstranger

    Плюсанул.

    Reply
  94. qwe_QWE

    Не могу понять — Процедура ОбработкаБлокировкиОбъекта() вызывается уже из объекта конфигурации?

    Reply
  95. aimerlive

    Интересная идея спасибо!

    Reply
  96. Ёпрст

    (97) ?

    что значит «из объекта» ?

    Reply
  97. Ёпрст

    это всего лишь предопределенная проца глобальника из формекс

    Reply
  98. Dolly_EV

    Прикрутил… при групповом проведении на писание в SQLite тратится 1% времени. А как бы сделать так, что при групповых операциях в таблички не писалось?. Т.е. как узнать в ПриНачалеБлокировкиОбъекта(), что это групповой проведение?

    Reply
  99. andrewks

    (101) Dolly_EV, если я правильно помню подноготную 7.7, то можно в модуле проведения дока в разделе осн. программы установить переменную ЭтоГрупПров=0, а в самой процедуре проведения в самом конец ЭтоГрупПров=1.

    тогда по тексту процедуры проведения можно будет опираться на эту переменную, за исключением самого первого дока данного вида, но, думаю, 1 док — это не показатель.

    только проверьте сначала эту фишку

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *