Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
828faee
feat(transactions): транзакции разных контекстов исполнения независимы
nixel2007 Aug 13, 2026
c171f4a
test(transactions): тесты пула и хранилища, чистка замечаний анализатора
nixel2007 Aug 13, 2026
2e58e1f
fix(tests): тест менеджера без пула не привязан к SQLite
nixel2007 Aug 13, 2026
f1c28b7
fix(pool): вызов отмены транзакции у себя квалифицирован явно
nixel2007 Aug 13, 2026
3a1df42
feat(pool)!: пул не отключается, нулевой размер убирает переиспользов…
nixel2007 Aug 13, 2026
258e470
feat(pool)!: все обращения к БД идут через пул соединений
nixel2007 Aug 13, 2026
7f8c0db
refactor(pool): захват соединения вынесен в одно место
nixel2007 Aug 13, 2026
949d9c9
fix(pool): хранилище сущностей не существует без пула
nixel2007 Aug 14, 2026
7fd6b77
perf(pool): перебор фоновых заданий убран с горячего пути
nixel2007 Aug 14, 2026
a5967f4
fix(concurrent): обращение к списку фоновых заданий переживает гонку
nixel2007 Aug 14, 2026
e9cd546
refactor(pool)!: коннекторы живут только в пуле соединений
nixel2007 Aug 14, 2026
6959f7d
feat(api)!: ПолучитьКоннектор заменен на выполнение алгоритма с конне…
nixel2007 Aug 14, 2026
1cf1e56
fix(packagedef): версия 4.4.0.0 вместо 4.0.0.0
nixel2007 Aug 14, 2026
8f519a4
docs(sqlite): описана несовместимость базы в памяти с нулевым размеро…
nixel2007 Aug 14, 2026
4fc440d
test(pool): прямое покрытие нового кода доведено до 96%
nixel2007 Aug 14, 2026
a3f331e
docs(api): описания методов приведены к std453
nixel2007 Aug 14, 2026
7ba5c21
refactor(pool): диспетчеризация по имени операции убрана
nixel2007 Aug 14, 2026
665c8ac
refactor(connectors)!: снят семафор, сериализовавший запись одного типа
nixel2007 Aug 15, 2026
14c52b2
fix(inmemory): доступ к общим данным базы в памяти синхронизирован
nixel2007 Aug 15, 2026
4c955b0
fix(pool): пул сущностей и реестр свойств коннекторов синхронизированы
nixel2007 Aug 15, 2026
8fe5b38
fix(deps): asserts подняты до 1.6.2 - Ожидаем перестал быть общим сос…
claude Aug 15, 2026
f7cae04
fix(json): проверка каталога выгрузки стала настоящей
claude Aug 15, 2026
fe824db
fix(pool): счетчик созданных соединений растет только после успешного…
claude Aug 15, 2026
a66d5bd
fix(pool): транзакция держит соединение сама, а не через захват
claude Aug 15, 2026
6ce953a
fix(pool): ЗабытьСущность удаляет сущность по ее идентификатору
claude Aug 15, 2026
5eca66c
fix(pool): размер пула проверяется в конструкторе
claude Aug 15, 2026
f2cea71
refactor(connectors): реестр свойств коннекторов убран
claude Aug 15, 2026
d88ec18
fix(pool): соединения, отданные заявкам, больше не теряются
claude Aug 15, 2026
ead6816
fix(pool): открытие соединения вынесено из-под блокировки пула
claude Aug 15, 2026
6d35246
test(pool): проверки открытия соединения вне блокировки пула
claude Aug 15, 2026
b4c433c
docs: правила работы над проектом в CLAUDE.md
claude Aug 15, 2026
1793f10
fix(pool): соединение с незавершенной транзакцией вытесняется из пула
claude Aug 16, 2026
cf55f6b
fix(pool): заявка с назначенным соединением остается в очереди
claude Aug 16, 2026
a5b164b
fix(pool): закрытие пула терминально, снятая бронь больше не отказ
claude Aug 16, 2026
aa5c263
style(tests): замечания анализатора по новым тестам пула
claude Aug 16, 2026
6eecd9d
fix(pool): ожидание соединения ограничено по времени
claude Aug 16, 2026
1e91e25
fix(pool): пул сущностей владеет своей блокировкой
claude Aug 17, 2026
c494170
style: замечания анализатора по правкам пула сущностей
claude Aug 17, 2026
7240ea1
fix(naming)!: классы пула и соединения переименованы, конфликт с 1con…
nixel2007 Aug 18, 2026
35bde68
build(tests)!: тесты переведены с 1testrunner на oneunit
nixel2007 Aug 18, 2026
5193fc6
chore: Добавление локального bsl ls mcp из плагина
nixel2007 Aug 18, 2026
e311d99
refactor(pool): пул сущностей на СинхронизированнаяКарта вместо своег…
nixel2007 Aug 18, 2026
ef2fa28
ci: снят пин opm@1.0.2, мешавший установить oneunit
claude Aug 18, 2026
41bc6a4
style(tests): строка создания падающего пула разнесена по аргументам
claude Aug 18, 2026
a443464
chore: oneunit mcp
nixel2007 Aug 18, 2026
775e1f4
refactor(concurrent): реестр блокировок на СинхронизированнаяКарта
nixel2007 Aug 18, 2026
01298ab
docs(pool): описание пула приведено в соответствие с поведением
nixel2007 Aug 18, 2026
d75f3d4
style: оформление по стандарту, описания классов над конструкторами
nixel2007 Aug 18, 2026
cd5b2af
style(concurrent): возвращено подавление диагностики служебного тега
claude Aug 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .bsl-language-server.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@
"parameters": {
"IncorrectLineBreak": {
"listOfIncorrectFirstSymbol": ";|,\\s*\\S+"
},
"Typo": {
"userWordsToIgnore": "переиспользование,Переиспользование,переиспользования,Переиспользования,переиспользованию,Переиспользованию,переиспользованием,Переиспользованием,переиспользовано,Переиспользовано,переиспользовать,Переиспользовать,переиспользует,Переиспользует,переиспользуется,Переиспользуется,переиспользуются,Переиспользуются"
}
}
}
}
}
8 changes: 6 additions & 2 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,17 @@ docker run --rm --name postgres -d -p 5432:5432 -e POSTGRES_PASSWORD=postgres -e
Для запуска тестов используется команда:

```sh
TESTRUNNER_RUN_POSTGRES_TESTS=true TESTRUNNER_RUN_SQLITE_TESTS=false oscript tasks/test.os
TESTRUNNER_RUN_POSTGRES_TESTS=true TESTRUNNER_RUN_SQLITE_TESTS=false \
./oscript_modules/bin/oneunit execute
```

Для запуска тестов с замером покрытия используется команда:

```sh
TESTRUNNER_RUN_POSTGRES_TESTS=true TESTRUNNER_RUN_SQLITE_TEST=false oscript tasks/coverage.os
TESTRUNNER_RUN_POSTGRES_TESTS=true TESTRUNNER_RUN_SQLITE_TESTS=false \
./oscript_modules/bin/oneunit execute \
--genericExecution out/tests.xml \
--genericCoverage out/genericCoverage.xml
```

Замеры покрытия доступны в подкаталоге `out`.
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-15-intel]
oscript_version: ['1.9.2', 'stable']
oscript_version: ['2.0.0', 'stable']
steps:
- uses: actions/checkout@v7

Expand All @@ -32,9 +32,9 @@ jobs:

- name: Install dependencies
run: |
opm install opm@1.0.2
opm install opm
opm install -l
opm install -l 1commands 1testrunner coverage@0.6.1
opm install -l --dev

- name: Install docker
uses: docker/setup-docker-action@v5
Expand All @@ -53,4 +53,4 @@ jobs:
TESTRUNNER_RUN_POSTGRES_TESTS: true
TESTRUNNER_RUN_SQLITE_TESTS: "${{ matrix.os == 'windows-latest' }}"
run: |
oscript ./tasks/test.os
./oscript_modules/bin/oneunit execute
10 changes: 6 additions & 4 deletions .github/workflows/qa.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@ jobs:
- name: Setup Onescript Action
uses: otymko/setup-onescript@v1.5
with:
version: "1.9.2"
version: "2.0.0"

- name: Install dependencies
run: |
opm install opm@1.0.2
opm install opm
opm install -l
opm install -l 1commands 1testrunner coverage@0.6.1
opm install -l --dev

- name: Install docker
uses: docker/setup-docker-action@v5
Expand All @@ -49,7 +49,9 @@ jobs:
TESTRUNNER_RUN_POSTGRES_TESTS: true
TESTRUNNER_RUN_SQLITE_TESTS: false
run: |
oscript ./tasks/coverage.os
./oscript_modules/bin/oneunit execute \
--genericExecution out/tests.xml \
--genericCoverage out/genericCoverage.xml

- name: Setup sonarqube
uses: warchant/setup-sonar-scanner@v10
Expand Down
13 changes: 13 additions & 0 deletions .mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"mcpServers": {
"bsl-language-server": {
"type": "http",
"url": "http://localhost:8234/mcp"
},
"oneunit": {
"type": "stdio",
"command": "./oscript_modules/bin/oneunit",
"args": ["mcp"]
}
}
}
3 changes: 2 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{
"language-1c-bsl.linterEntryPoint": "./src/fake-entrypoint.os",
"coverage-gutters.xmlname": "out/coverage.xml"
"language-1c-bsl.languageServerMcpEnabled": true,
"language-1c-bsl.languageServerMcpPort": "8234"
}
25 changes: 25 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Работа над entity

## Порядок работы

- **Сначала тесты, потом реализация.** Тест пишется до кода, который он проверяет,
и должен падать на текущем поведении. Это относится и к исправлениям дефектов:
сперва тест, воспроизводящий дефект, затем починка.
- **Правки кода — только файловыми инструментами** (Read/Edit/Write). Редактировать
исходники через `sed`, `python`, `cat >> файл` и прочие перенаправления оболочки
нельзя без явного разрешения.

## Прогон тестов

```
opm install opm@1.0.2
opm install -l
opm install -l --dev
./oscript_modules/bin/oneunit execute
```

Тесты гоняет [oneunit](https://github.com/sfaqer/oneunit). Переменные среды
`TESTRUNNER_RUN_SQLITE_TESTS` и `TESTRUNNER_RUN_POSTGRES_TESTS` — единственный
способ сказать, какие базы доступны. Наборы, которым нужна конкретная база,
выключаются аннотацией `&ВключенЕсли`, читающей ту же переменную; наборы,
работающие с любой из двух, выбирают по ним базу сами.
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -569,6 +569,21 @@

При использовании in-memory базы данных в моделях больше, чем с одним типом сущности, строка соединения должна выглядеть так: `"FullUri=file::memory:?cache=shared"`

> Внимание!

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

Поэтому in-memory базу нельзя сочетать с **нулевым размером пула соединений**: при нулевом размере соединение открывается на операцию и закрывается сразу после нее, то есть между операциями открытых соединений не остается. Следующая операция откроет уже пустую базу и получит `no such table`. Переживет база такой промежуток или нет, зависит от внутреннего пулинга провайдера, то есть воспроизводится через раз.

Для in-memory базы используйте ненулевой размер пула — тогда пул придерживает соединения открытыми и база живет, пока жив менеджер сущностей. Если нулевой размер нужен принципиально, держите отдельное соединение к той же базе на все время работы:

```bsl
Держатель = Новый КоннекторSQLite;
Держатель.Открыть("FullUri=file::memory:?cache=shared", Новый Массив);
// ... работа через менеджер сущностей ...
Держатель.Закрыть();
```

<a id="library-structure-connector-postgresql" />

### КоннекторPostgreSQL
Expand Down
4 changes: 4 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,7 @@
* [ВидСравнения](ВидСравнения.md)
* [ТипыКолонок](ТипыКолонок.md)
* [ТипыПодчиненныхТаблиц](ТипыПодчиненныхТаблиц.md)

### Прочее

* [Потокобезопасная работа с БД](ПотокобезопаснаяРаботаСБД.md)
59 changes: 48 additions & 11 deletions docs/МенеджерСущностей.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,18 @@
// Параметры:
// ТипКоннектора - Тип - Тип класса, реализующего интерфейс Коннектор.
// СтрокаСоединения - Строка - Строка соединения к БД, к которой подключается коннектор.
// ППараметрыКоннектора - Массив - Массив дополнительных параметров коннектора. Содержимое произвольное.
// ПараметрыКоннектора - Массив - Массив дополнительных параметров коннектора. Содержимое произвольное.
// РазмерПулаСоединений - Число - Предел параллельной работы с БД: когда все места заняты,
// следующий контекст ждет освобождения, но не дольше предела ожидания - иначе получает ошибку.
// Нулевой размер снимает предел, но постоянно живущих соединений не держит - каждое обращение
// к БД открывает свое соединение и закрывает его по завершении.
//
Процедура ПриСозданииОбъекта(Знач ТипКоннектора, Знач СтрокаСоединения = "", Знач ППараметрыКоннектора = Неопределено)
Процедура ПриСозданииОбъекта(
Знач ТипКоннектора,
Знач СтрокаСоединения = "",
Знач ПараметрыКоннектора = Неопределено,
Знач РазмерПулаСоединений = 10
)
```

### ДобавитьКлассВМодель
Expand Down Expand Up @@ -134,37 +143,65 @@
### НачатьТранзакцию

```bsl
// Посылает коннектору запрос на начало транзакции.
// Начинает транзакцию для текущего контекста исполнения.
//
// Контекст занимает соединение и держит его до фиксации или отмены, поэтому все его операции
// попадают в эту транзакцию, а завершить ее другое фоновое задание не может.
//
Процедура НачатьТранзакцию()
```

### ЗафиксироватьТранзакцию

```bsl
// Посылает коннектору запрос на фиксацию транзакции.
// Фиксирует транзакцию текущего контекста исполнения и возвращает его соединение в пул.
//
Процедура ЗафиксироватьТранзакцию()
```

### ОтменитьТранзакцию

```bsl
// Посылает коннектору запрос на отмену транзакции.
// Отменяет транзакцию текущего контекста исполнения и возвращает его соединение в пул.
//
Процедура ОтменитьТранзакцию()
```

### ПолучитьКоннектор
### ВыполнитьСКоннектором

```bsl
// Возвращает текущий активный коннектор.
// Выполняет алгоритм коннектором из пула.
//
// Возвращаемое значение:
// АбстрактныйКоннектор - Возвращает экземпляр коннектора. Конкретная реализация определяется параметром
// ТипКоннектора при вызове конструктора МенеджерСущностей.
// Прямой доступ к БД в обход библиотеки. Соединение занимается на время выполнения алгоритма и
// сразу возвращается в пул, поэтому держать его за пределами вызова нельзя. Если текущий контекст
// исполнения начал транзакцию, алгоритм получает коннектор этой транзакции и попадает в нее.
//
// Параметры:
// Алгоритм - Строка - Лямбда-выражение с одним параметром - коннектором.
// Контекст - Структура - Значения, доступные в алгоритме по именам ключей.
// Объект - Сценарий - Объект, поля и методы которого доступны в алгоритме.
//
Процедура ВыполнитьСКоннектором(Знач Алгоритм, Знач Контекст = Неопределено, Знач Объект = Неопределено)
```

### ВычислитьСКоннектором

```bsl
// Вычисляет значение алгоритмом, выполненным коннектором из пула.
//
// Прямой доступ к БД в обход библиотеки. Соединение занимается на время выполнения алгоритма и
// сразу возвращается в пул, поэтому держать его за пределами вызова нельзя. Если текущий контекст
// исполнения начал транзакцию, алгоритм получает коннектор этой транзакции и попадает в нее.
//
// Параметры:
// Алгоритм - Строка - Лямбда-выражение с одним параметром - коннектором.
// Контекст - Структура - Значения, доступные в алгоритме по именам ключей.
// Объект - Сценарий - Объект, поля и методы которого доступны в алгоритме.
//
// Возвращаемое значение:
// Произвольный - Результат алгоритма.
//
Функция ПолучитьКоннектор()
Функция ВычислитьСКоннектором(Знач Алгоритм, Знач Контекст = Неопределено, Знач Объект = Неопределено)
```

### ПолучитьХранилищеСущностей
Expand Down
Loading
Loading