DBEng32 (7.0.0.3, SEQ) – исправление ошибки “CodeBase –56” при использовании 1SQLite для 1С:Предприятие 7.7

10.09.08

База данных - Инструменты администратора БД

Исправление ошибки “CodeBase –56” при использовании 1SQLite (версия 1018f) для 1С:Предприятие 7.7(http://infostart.ru/projects/2127/).
Скачать: //infostart.ru/profile/2905/projects/2418/
Что делает данная разработка?
Реализована возможность управления использованием методов Begin/EndReadSequence() при выполнении запроса. Если запрос выполняется внутри транзакции, то эти методы исполняются с блокировкой таблиц. Если запрос выполняется вне транзакции, то эти методы не исполняются, даже если они вызываются в 1SQLite. Т.е. если запрос выполняется внутри модуля проведения документа, то эти методы будут исполняться, и запрос будет выполняться быстро. В остальных случаях пользователь может управлять режимом выполнения запроса с помощью функций Начать/Зафиксировать/ОтменитьТранзакцию().
Причины возникновения ошибки.
Для ускорения выполнения запросов в 1SQLitе используется метод BeginReadSequence() штатного движка 1С. Данный метод значительно ускоряет последовательный просмотр таблицы по индексу. Но для этого в штатном движке выполняется блокировка таблицы по записи. Если в другой сессии делается попытка обновления данной таблицы внутри метода EndTransaction(Commit), то проверка освобождения таблицы выполняется в цикле N раз (примерно за одну минуту), после чего выдаётся (!) команда обновления таблицы. И СУБД возвращает этому методу код возврата “-56”. В штатном движке данный код возврата обрабатывается как требование аварийного завершения сессии 1С. Т.к. это происходит в момент записи данных транзакции, то в базе данных может образоваться противоречивая информация.
Пути решения.
1) Использовать разработки, снимающие 100% занятость процессора при ожидании освобождения блокировки. В этих разработках в цикл опроса добавляется функция sleep(). Т.е. суммарное время опроса освобождения таблицы увеличивается и за это время запрос из другой сессии 1С может успеть завершиться. Но может и не успеть. :-(((
2) Использовать разработку “DBEng32 SEQ”. В этой разработке перехватываются методы BeginReadSequence() и EndReadSequence(). И в них добавляются вызовы методов BeginTransaction(), PutTLock(Full) перед выдачей BeginReadSequence(). А после вызова метода EndReadSequence() вызывается EndTransaction(Commit). Таким образом, запрос выполняется в транзакции с попыткой блокировки таблицы, для которой выдан метод BeginReadSequence(). Ожидание освобождения таблицы осуществляется другими алгоритмами, на которые влияет, установленное в настройках 1С “Время ожидания захвата таблицы Базы Данных (сек.)”. И в случае неуспешного ожидания освобождения таблицы сессия 1С не завершается аварийно, а происходит откат транзакции. Очевидным недостатком такого решения является тот факт, что общая производительность системы падает из-за неоправданных ожиданий завершения запроса, не выполняющего обновления данных. Кроме того, могут возникать клинчи. Но порчи базы данных не происходит. Естественно, что такой алгоритм можно перенести из “DBEng32 SEQ” в 1SQLite.
3) Разработать алгоритм “внешней блокировки” таблиц. Общий смысл алгоритма в том, что перед выполнением запроса делается попытка блокировать внешние ресурсы, сопоставленные реальным таблицам базы данных используемым в запросе. Таблицы (внешние ресурсы) блокируются до начала выполнения всего запроса. После выполнения запроса блокировки снимаются. А перед выполнением метода EndTransaction(Commit) осуществляется проверка и ожидание освобождения этих внешних ресурсов. Такой алгоритм позволит избежать клинчей и неоправданного ожидания окончания выполнения запросов в других сессиях. Данный алгоритм можно реализовать с участием “DBEng32 SEQ” или в самой 1SQLite осуществить перехват метода EndTransaction().
4) Отказаться от использования метода BeginReadSequence() в 1SQLite. Но в этом случае скорость выполнения запроса будет сопоставима со скорость выполнения алгоритма выборки данных штатными языковыми средствами 1С.
5) Использовать другие СУБД, свободные от данной проблемы, вместо штатного движка 1С. Например, DBEng32 для Advantage или CodeBase. Но для этого надо обеспечить совместимость 1SQLite c этими разработками.

См. также

Инструменты администратора БД Системный администратор Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Простецкий скрипт переименования файлов в папке в нижний регистр, будет полезен программистам и системным администраторам имеющим навыки програмирования в 1С. Можно легко настроить под себя, спасает мне периодически час времени, может, кому еще будет полезен.

1 стартмани

18.02.2022    4011    0    igor7777    6    

2

Инструменты администратора БД Программист Пользователь Оперативный учет 7.7 1С:Торговля и склад 7.7 Управленческий учет Абонемент ($m)

Боремся с бардаком. Работы в прошлых датах запрещены. Непроведенные документы (по разным причинам) - автоматом переносятся в начало текущего дня при запуске любого первого сеанса 1С в текущем дне. Задержка старта 1С - практически незначима. Не требует настройки, не требует допрограммирования (исключая один оператор вставки в процедуру старта системы). Можно обработку выполнять вручную с любой периодичностью.

2 стартмани

25.05.2020    5875    2    CheBurator    3    

2

Журнал регистрации Инструменты администратора БД Системный администратор Программист Платформа 1С v7.7 Конфигурации 1cv7 Бесплатно (free)

Рассмотрим систему на базе Elasticsearch, Logstash и Kibana (ELK Stack) для анализа логов 1С Предприятие 7.7 с целью визуализации и анализа событий 1С.

22.01.2019    11556    phsin    20    

28

Инструменты администратора БД Системный администратор Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Скрипт позволяет выполнить объединение конфигураций и реструктуризацию из командной строки. Объединение выполняется штатными средствами конфигуратора 1С 7.7, взаимодействие с которым происходит путем посылки нажатий клавиш. Пригодится, если есть необходимость обновить или постоянно обновлять множество ИБ.

1 стартмани

22.04.2017    15858    4    devlabnn    2    

6

Инструменты администратора БД Бухгалтер Бухгалтерский учет 7.7 1С:Бухгалтерия 7.7 Украина Бухгалтерский учет Абонемент ($m)

Перепроведение по счету для конфигурации Бухгалтерский учет для Украины, 1С: Предприятие 7.7

1 стартмани

23.09.2016    3851    1    Genyak    1    

0

Инструменты администратора БД Системный администратор Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Периодически сталкивался со следующими проблемами при печати в 1С: 7.7 работающей под терминалом: 1) После замены принтера на клиентской машине 1С пытается печатать на старый принтер. 2) Отсутствует предварительный просмотр при печати. 3) Не работает печать без предварительного просмотра (пакетная печать документов). 4) В некоторых формах печатает, в некоторых нет.

1 стартмани

09.06.2016    28035    19    tux    3    

1

Инструменты администратора БД Системный администратор Программист Платформа 1С v7.7 Платформа 1С v8.3 Бесплатно (free)

Часто бывает необходимо отслеживать состояние часто повторяющихся регламентных заданий. Например, синхронизация данных с IP-телефонией, которая может производиться каждую минуту, синхронизация с сайтами, синхронизация данных с различными системами. Использовать для этих целей логирование 1С чрезвычайно неэффективно и не удобно. В таких случаях удобно использовать подход, применяемый в Unix-системах: писать логи в обычные текстовые файлы, а потом делать их обработку через эффективно работающие Unix-команды: grep, tail, cat, less и т.п.

18.05.2016    37106    rudjuk    21    

34
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. CheBurator 2712 31.07.08 01:42 Сейчас в теме
..блин.. истина где-то рядом...
2. hogik 443 31.07.08 02:47 Сейчас в теме
3. JohnyDeath 302 31.07.08 10:56 Сейчас в теме
Ну хорошо, что нашлось решение, а то негоже такому красивому проекту загнутся из-за этой проблемы.
Конечно, лечше чтоб эти правки были сделаны в 1sqlite, а то получается, что вы хотите улучшить 7-ку, а выходит что вы нарушили авторские права, подправив движок 1с
4. hogik 443 31.07.08 12:25 Сейчас в теме
(3)(JohnyDeath)
“нарушили авторские права, подправив движок 1с”
У меня вопрос не по теме. Под какую формулировку в законе об авторских правах попадают разработки такого рода?
P.S. А ошибка ““CodeBase –56” есть и без использования 1SQLite. Только вероятность её появления очень мала.
5. JohnyDeath 302 31.07.08 12:30 Сейчас в теме
(4) Ну, на сколько я помню, нельзя каким-либо образом патчить/исправлять файлы программы. Если я не прав - поправьте меня.
6. Abadonna 3968 31.07.08 12:39 Сейчас в теме
(5) Мне почему-то кажется, что если я честно купил программу, то лично для себя могу делать с ней, что хочу: хоть запатчить, хоть испортить ;)
7. JohnyDeath 302 31.07.08 12:48 Сейчас в теме
(6) мне тоже так хочется думать, но, по-моему, законодателям так не кажется.
8. hogik 443 31.07.08 12:52 Сейчас в теме
(5)(JohnyDeath)
“Если я не прав - поправьте меня”
Не знаю. Я давно хочу это выяснить.
Вот это уже отменили?

Лицо, правомерно владеющее экземпляром программы для ЭВМ, вправе без согласия правообладателя и без выплаты дополнительного вознаграждения декомпилировать или поручать декомпилирование программы для ЭВМ с тем, чтобы изучать кодирование и структуру этой программы при следующих условиях:
информация, необходимая для взаимодействия независимо разработанной данным лицом программы для ЭВМ с другими программами, недоступна из других источников;
информация, полученная в результате этого декомпилирования, может использоваться лишь для организации взаимодействия независимо разработанной данным лицом программы для ЭВМ с другими программами, а не для составления новой программы для ЭВМ, по своему виду существенно схожей с декомпилируемой программой для ЭВМ или для осуществления любого другого действия, нарушающего авторское право;
декомпилирование осуществляется в отношении только тех частей программы для ЭВМ, которые необходимы для организации такого взаимодействия.

http://www.fips.ru/avp/law/3523-1S.HTM
9. kolodina 12.08.08 12:07 Сейчас в теме
думаю, если некто купил программу - то может делать с ней все что хочет... авторские права тут не нарушаются... авторские права нарушаются, если вы купили программу - и выдаете ее за свою...
пропатченный движок я установила на двух станциях - у меня выхода нету... целая подсистема написана с использованием 1sqlite... если его оттуда убрать - тормоза будут несказанные...
10. kolodina 12.08.08 13:19 Сейчас в теме
а вот вопрос - я поставила пропатченный движок на двух станциях - а остальные пока не трогала... могут быть проблемы? спасибо.
11. hogik 443 12.08.08 14:50 Сейчас в теме
12. JohnyDeath 302 21.08.08 10:03 Сейчас в теме
Hogik, я вот фразу одну недопонял:
"В остальных случаях пользователь может управлять режимом выполнения запроса с помощью функций Начать/Зафиксировать/ОтменитьТранзакцию()."
надо ли это понимать так:
Если я выполняю запрос вне модуля проведения (например в отчете), то мне необходимо писАть:
Код
НачатьТранзакцию();
Запрос.ВыполнитьЗапрос(ТекстЗапроса);
ЗафиксироватьТранзакцию();
Показать полностью

?
13. hogik 443 21.08.08 14:23 Сейчас в теме
(12)(JohnyDeath)
“то мне необходимо писАть”
Необходимо, перед тем как “писАть”, принять решение, что важней в конкретном алгоритме – скорость выполнения запроса или ожидание освобождения заблокированной таблицы в других сессиях. Т.е. если запрос выполнять вне транзакции, то он будет выполняться медленно, но в других сессиях не будет возникать ожидания освобождения блокировки таблицы. Если запрос выполнять внутри транзакции, то он будет выполняться быстро, но в других сессиях будет возникать ожидание освобождения таблицы.
14. JohnyDeath 302 21.08.08 15:33 Сейчас в теме
(13) т.е. я тебя понял правильно и пример для внешнего отчета написал правильно?
и рекомендации сделать в 1sqlite Begin/EndReadSequence() опциональным здесь как раз-таки будет очень кстати?
15. hogik 443 21.08.08 15:53 Сейчас в теме
(14)(JohnyDeath)
“для внешнего отчета написал правильно?”
На этот вопрос нет однозначного ответа. Правильно будет и то, что Вы написали. И без запуска транзакции тоже будет правильно. Всё зависит от поставленных Вами задач в алгоритме. Или Ваш вопрос ко мне в чем-то другом?
“сделать в 1sqlite Begin/EndReadSequence() опциональным ”
Да. Но, думаю, имеет смысл иметь не два режима – “включено/выключено”, а ещё и, типа, - “авто”. Т.е. внутри транзакции эти методы вместе с блокировкой таблицы имеет смысл выполнять в 99% случаев, т.к. блокировка существует и по другим причинам. И если транзакция уже активизирована по другим причинам, то уж и заодно имеет смысл активизировать Begin/EndReadSequence().
16. JohnyDeath 302 21.08.08 16:47 Сейчас в теме
(15)Или Ваш вопрос ко мне в чем-то другом?
Я вот что имел ввиду: как бы ты поступил, если бы знал, что этот запрос во внешнем отчете выполняется продолжительное время
17. hogik 443 21.08.08 17:21 Сейчас в теме
(15)(JohnyDeath)
“как бы ты поступил”
Применительно к 1SQLite я б выяснил:
1) Что означает “продолжительное время”.
2) Используются ли таблицы запроса в других, параллельно выполняющихся, задачах.
3) Сколько времени выполняется данная выборка штатными средствами 1Са.
И т.д. Т.е. опять однозначного ответа не может быть.
А если говорить вообще, то я б постарался построить систему так, чтобы таких вопросов (проблем) не возникало.
P.S. Посмотрите, пожалуйста, сообщения (20), пункт #3 в http://infostart.ru/profile/2905/blogs/482/ Мне очень интересно Ваше мнение по поводу данного “явления”.
18. hogik 443 21.08.08 17:25 Сейчас в теме
+(17)
Я ошибся. Не пункт #3, а пункт #2.
20. JohnyDeath 302 21.08.08 17:35 Сейчас в теме
22. hogik 443 21.08.08 17:44 Сейчас в теме
(20)(JohnyDeath)
Прочел Ваш ответ. Суть происходящего мне ясна. Мой вопрос был в другом. Вам это “явление” ничего не напоминает? И как люди работают с этим при наличии такого “явления”?
23. JohnyDeath 302 21.08.08 17:53 Сейчас в теме
(22) " И как люди работают с этим при наличии такого “явления”?"
Наверное так: пользователей натаскивают на то, что если они видят эту ошибку, ждут чуть-чуть и пробуют ещё ;) ( а вообще лучше у kiruh-и спросить, он Фокс использует очень широко)
(21) “проблему автоматически?”
Он это и делает.

Меня просто смутила фраза из описания: В остальных случаях пользователь может управлять режимом выполнения запроса с помощью функций Начать/Зафиксировать/ОтменитьТранзакцию().
Т.е. я могу "смело" ставить пропатченный движок и не переписывать те места, где я использую 1sqlite?
24. hogik 443 21.08.08 18:04 Сейчас в теме
(23)(JohnyDeath)
“я могу "смело" ставить пропатченный движок и не переписывать те места, где я использую”
Да. Но учитывать фразу “только для тестирования”… ;-)))
А что касается моего вопроса про “явление”, то, похоже, мне опять не удалось сформулировать вопрос. Но отложим это. Сейчас, думаю, важней разобраться с 1SQLite.
25. JohnyDeath 302 21.08.08 18:17 Сейчас в теме
(24) Да. Но учитывать фразу “только для тестирования”… ;-)))
именно поэтому я и поставил слово СМЕЛО в кавычки. ;)
19. JohnyDeath 302 21.08.08 17:29 Сейчас в теме
(17) всё-таки, наверное, мы не поняли друг друга (= я плохо изъяснился)
Спрошу по-другому: "Не решает ли этот патч движка проблему автоматически? Т.е. я, как программист 1С, просто напишу
Код
Запрос.Выполнить(ТекстЗапроса)
Показать полностью

а пропатченный движок сам всё разрулит:
1) если он выполняется внутри транзакции (например, в модуле проведения), то он выбирает "быстрый способ"
2) если вне транзакции, то "медленный" (с отключенным ReadSequence)
?
21. hogik 443 21.08.08 17:37 Сейчас в теме
(19)(JohnyDeath)
“проблему автоматически?”
Он это и делает.
26. CheBurator 2712 11.09.08 01:16 Сейчас в теме
прям как разведчики...
Оставьте свое сообщение