Skip to content

Commit 790179d

Browse files
Copilotnixel2007
andcommitted
Implement automatic context detection using ФоновыеЗадания.ПолучитьТекущее() API
Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com>
1 parent c8690ba commit 790179d

File tree

2 files changed

+128
-145
lines changed

2 files changed

+128
-145
lines changed

src/Классы/МенеджерСущностей.os

Lines changed: 70 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
// Управление контекстами транзакций
2121
Перем ТекущиеКонтексты; // Соответствие: КонтекстID -> Истина (активные контексты)
22-
Перем СчетчикКонтекстов; // Для генерации уникальных ID контекстов
2322

2423
Перем Лог;
2524

@@ -52,7 +51,6 @@
5251

5352
// Инициализация управления контекстами
5453
ТекущиеКонтексты = Новый Соответствие;
55-
СчетчикКонтекстов = 0;
5654
КонецПроцедуры
5755

5856
// Регистрирует переданный тип класса-сценария в модели данных.
@@ -122,28 +120,24 @@
122120
КонецФункции
123121

124122
// Сохраняет сущность в БД.
123+
// Автоматически определяет контекст выполнения (основной поток или фоновое задание).
125124
//
126125
// Параметры:
127126
// Сущность - Произвольный - Объект (экземпляр класса, зарегистрированного в модели) для сохранения в БД.
128-
// КонтекстID - Строка - Идентификатор контекста транзакции (необязательно)
129127
//
130-
Процедура Сохранить(Сущность, КонтекстID = Неопределено) Экспорт
128+
Процедура Сохранить(Сущность) Экспорт
131129
ТипСущности = АктивнаяЗапись.ТипСущности(Сущность);
132130
ОбъектМодели = МодельДанных.Получить(ТипСущности);
133131
ПулСущностей = ПолучитьПулСущностей(ТипСущности);
134132

135-
Если КонтекстID <> Неопределено Тогда
136-
// Используем коннектор контекста для потокобезопасной операции
137-
КоннекторДляОперации = ПолучитьКоннекторДляКонтекста(КонтекстID);
138-
Иначе
139-
// Автоматический выбор коннектора
140-
КоннекторДляОперации = ПолучитьКоннекторДляОперации();
141-
КонецЕсли;
133+
// Автоматически выбираем коннектор в зависимости от контекста
134+
КоннекторДляОперации = ПолучитьКоннекторДляТекущегоКонтекста();
142135

143136
РаботаСКоннекторами.Сохранить(КоннекторДляОперации, ОбъектМодели, ПулСущностей, Сущность);
144137
КонецПроцедуры
145138

146139
// Осуществляет поиск сущностей переданного типа по идентификатору.
140+
// Автоматически определяет контекст выполнения (основной поток или фоновое задание).
147141
//
148142
// Параметры:
149143
// ТипСущности - Тип - Тип искомой сущности.
@@ -152,31 +146,26 @@
152146
// Если параметр имеет тип "Соответствие", то каждое значение соответствия преобразуется к условию поиска
153147
// ИмяПоля = ЗначениеПоля, где ИмяПоля - ключ элемента соответствия, ЗначениеПоля - значение элемента соответствия.
154148
// Если параметр имеет тип "ОпцииПоиска", то опции передаются как есть.
155-
// КонтекстID - Строка - Идентификатор контекста транзакции (необязательно)
156149
//
157150
// Возвращаемое значение:
158151
// Массив - Массив найденных сущностей. В качестве элементов массива выступают
159152
// экземпляры класса с типом, равным переданному параметру "ТипСущности", с заполненными значениями полей.
160153
//
161-
Функция Получить(ТипСущности, Знач ОпцииПоиска = Неопределено, КонтекстID = Неопределено) Экспорт
154+
Функция Получить(ТипСущности, Знач ОпцииПоиска = Неопределено) Экспорт
162155
ОбъектМодели = МодельДанных.Получить(ТипСущности);
163156
ПулСущностей = ПолучитьПулСущностей(ТипСущности);
164157
Если ОпцииПоиска = Неопределено Тогда
165158
ОпцииПоиска = Новый ОпцииПоиска;
166159
КонецЕсли;
167160

168-
Если КонтекстID <> Неопределено Тогда
169-
// Используем коннектор контекста для потокобезопасной операции
170-
КоннекторДляОперации = ПолучитьКоннекторДляКонтекста(КонтекстID);
171-
Иначе
172-
// Автоматический выбор коннектора
173-
КоннекторДляОперации = ПолучитьКоннекторДляОперации();
174-
КонецЕсли;
161+
// Автоматически выбираем коннектор в зависимости от контекста
162+
КоннекторДляОперации = ПолучитьКоннекторДляТекущегоКонтекста();
175163

176164
Возврат РаботаСКоннекторами.Получить(КоннекторДляОперации, ОбъектМодели, ПулСущностей, ОпцииПоиска);
177165
КонецФункции
178166

179167
// Осуществляет поиск сущности переданного типа по идентификатору.
168+
// Автоматически определяет контекст выполнения (основной поток или фоновое задание).
180169
//
181170
// Параметры:
182171
// ТипСущности - Тип - Тип искомой сущности.
@@ -186,49 +175,38 @@
186175
// ИмяПоля = ЗначениеПоля, где ИмяПоля - ключ элемента соответствия, ЗначениеПоля - значение элемента соответствия.
187176
// Если параметр имеет тип "ОпцииПоиска", то опции передаются как есть.
188177
// Любой другой тип интерпретируется как поиск по &Идентификатору.
189-
// КонтекстID - Строка - Идентификатор контекста транзакции (необязательно)
190178
//
191179
// Возвращаемое значение:
192180
// Произвольный - Если сущность была найдена, то возвращается экземпляр класса с типом, равным переданному параметру
193181
// "ТипСущности", с заполненными значениями полей. Иначе возвращается "Неопределено".
194182
//
195-
Функция ПолучитьОдно(ТипСущности, Знач ОпцииПоиска = Неопределено, КонтекстID = Неопределено) Экспорт
183+
Функция ПолучитьОдно(ТипСущности, Знач ОпцииПоиска = Неопределено) Экспорт
196184
ОбъектМодели = МодельДанных.Получить(ТипСущности);
197185
ПулСущностей = ПолучитьПулСущностей(ТипСущности);
198186
Если ОпцииПоиска = Неопределено Тогда
199187
ОпцииПоиска = Новый ОпцииПоиска;
200188
КонецЕсли;
201189

202-
Если КонтекстID <> Неопределено Тогда
203-
// Используем коннектор контекста для потокобезопасной операции
204-
КоннекторДляОперации = ПолучитьКоннекторДляКонтекста(КонтекстID);
205-
Иначе
206-
// Автоматический выбор коннектора
207-
КоннекторДляОперации = ПолучитьКоннекторДляОперации();
208-
КонецЕсли;
190+
// Автоматически выбираем коннектор в зависимости от контекста
191+
КоннекторДляОперации = ПолучитьКоннекторДляТекущегоКонтекста();
209192

210193
Возврат РаботаСКоннекторами.ПолучитьОдно(КоннекторДляОперации, ОбъектМодели, ПулСущностей, ОпцииПоиска);
211194
КонецФункции
212195

213196
// Выполняет удаление сущности из базы данных.
197+
// Автоматически определяет контекст выполнения (основной поток или фоновое задание).
214198
// Сущность должна иметь заполненный идентификатор.
215199
//
216200
// Параметры:
217201
// Сущность - Произвольный - Удаляемая сущность
218-
// КонтекстID - Строка - Идентификатор контекста транзакции (необязательно)
219202
//
220-
Процедура Удалить(Сущность, КонтекстID = Неопределено) Экспорт
203+
Процедура Удалить(Сущность) Экспорт
221204
ТипСущности = АктивнаяЗапись.ТипСущности(Сущность);
222205
ОбъектМодели = МодельДанных.Получить(ТипСущности);
223206
ПулСущностей = ПолучитьПулСущностей(ТипСущности);
224207

225-
Если КонтекстID <> Неопределено Тогда
226-
// Используем коннектор контекста для потокобезопасной операции
227-
КоннекторДляОперации = ПолучитьКоннекторДляКонтекста(КонтекстID);
228-
Иначе
229-
// Автоматический выбор коннектора
230-
КоннекторДляОперации = ПолучитьКоннекторДляОперации();
231-
КонецЕсли;
208+
// Автоматически выбираем коннектор в зависимости от контекста
209+
КоннекторДляОперации = ПолучитьКоннекторДляТекущегоКонтекста();
232210

233211
РаботаСКоннекторами.Удалить(КоннекторДляОперации, ОбъектМодели, ПулСущностей, Сущность);
234212
КонецПроцедуры
@@ -252,36 +230,31 @@
252230
КонецПроцедуры
253231

254232
// Посылает коннектору запрос на начало транзакции.
255-
//
256-
// Возвращаемое значение:
257-
// Строка - Идентификатор контекста транзакции (если пул инициализирован)
258-
// Неопределено - В режиме обратной совместимости (пул не инициализирован)
233+
// Автоматически определяет контекст выполнения (основной поток или фоновое задание).
259234
//
260-
Функция НачатьТранзакцию() Экспорт
235+
Процедура НачатьТранзакцию() Экспорт
261236
Если ПулСоединений <> Неопределено Тогда
262-
// Создаем новый контекст транзакции
263-
КонтекстID = ПолучитьНовыйКонтекстID();
237+
// Автоматически определяем контекст выполнения
238+
КонтекстID = ПолучитьТекущийКонтекстID();
264239
ТекущиеКонтексты[КонтекстID] = Истина;
265240

266241
// Получаем соединение для контекста и начинаем транзакцию
267242
Соединение = ПулСоединений.ПолучитьСоединениеДляКонтекста(КонтекстID);
268243
Соединение.НачатьТранзакцию();
269-
270-
Возврат КонтекстID;
271244
Иначе
272245
// Обратная совместимость - используем общий коннектор
273246
РаботаСКоннекторами.НачатьТранзакцию(Коннектор);
274-
Возврат Неопределено;
275247
КонецЕсли;
276-
КонецФункции
248+
КонецПроцедуры
277249

278250
// Посылает коннектору запрос на фиксацию транзакции.
251+
// Автоматически определяет контекст выполнения.
279252
//
280-
// Параметры:
281-
// КонтекстID - Строка - Идентификатор контекста транзакции (при использовании пула)
282-
//
283-
Процедура ЗафиксироватьТранзакцию(КонтекстID = Неопределено) Экспорт
284-
Если КонтекстID <> Неопределено Тогда
253+
Процедура ЗафиксироватьТранзакцию() Экспорт
254+
Если ПулСоединений <> Неопределено Тогда
255+
// Автоматически определяем текущий контекст
256+
КонтекстID = ПолучитьТекущийКонтекстID();
257+
285258
// Фиксируем транзакцию и освобождаем контекст
286259
Соединение = ПулСоединений.ПолучитьСоединениеДляКонтекста(КонтекстID);
287260
Соединение.ЗафиксироватьТранзакцию();
@@ -293,12 +266,13 @@
293266
КонецПроцедуры
294267

295268
// Посылает коннектору запрос на отмену транзакции.
269+
// Автоматически определяет контекст выполнения.
296270
//
297-
// Параметры:
298-
// КонтекстID - Строка - Идентификатор контекста транзакции (при использовании пула)
299-
//
300-
Процедура ОтменитьТранзакцию(КонтекстID = Неопределено) Экспорт
301-
Если КонтекстID <> Неопределено Тогда
271+
Процедура ОтменитьТранзакцию() Экспорт
272+
Если ПулСоединений <> Неопределено Тогда
273+
// Автоматически определяем текущий контекст
274+
КонтекстID = ПолучитьТекущийКонтекстID();
275+
302276
// Отменяем транзакцию и освобождаем контекст
303277
Соединение = ПулСоединений.ПолучитьСоединениеДляКонтекста(КонтекстID);
304278
Соединение.ОтменитьТранзакцию();
@@ -343,14 +317,30 @@
343317
КонецЕсли;
344318
КонецПроцедуры
345319

346-
// Получить новый идентификатор контекста
320+
// Получить идентификатор текущего контекста выполнения
321+
// Автоматически определяет, выполняется ли код в основном потоке или фоновом задании
347322
//
348323
// Возвращаемое значение:
349-
// Строка - Уникальный идентификатор контекста
350-
//
351-
Функция ПолучитьНовыйКонтекстID()
352-
СчетчикКонтекстов = СчетчикКонтекстов + 1;
353-
Возврат "Контекст_" + СчетчикКонтекстов;
324+
// Строка - Идентификатор контекста:
325+
// - Для фоновых заданий: УникальныйИдентификатор задания
326+
// - Для основного потока: специальная константа "MainThread"
327+
//
328+
Функция ПолучитьТекущийКонтекстID()
329+
Попытка
330+
// Пытаемся получить текущее фоновое задание
331+
ТекущееЗадание = ФоновыеЗадания.ПолучитьТекущее();
332+
333+
Если ТекущееЗадание <> Неопределено Тогда
334+
// Выполняемся в фоновом задании - используем его УникальныйИдентификатор
335+
Возврат Строка(ТекущееЗадание.УникальныйИдентификатор);
336+
Иначе
337+
// Выполняемся в основном потоке
338+
Возврат "MainThread";
339+
КонецЕсли;
340+
Исключение
341+
// Если API ФоновыеЗадания недоступно - используем основной поток
342+
Возврат "MainThread";
343+
КонецПопытки;
354344
КонецФункции
355345

356346
// Завершить контекст и освободить связанные ресурсы
@@ -363,18 +353,28 @@
363353
ПулСоединений.ОсвободитьКонтекст(КонтекстID);
364354
КонецПроцедуры
365355

366-
// Получить коннектор для текущей операции (с учетом активных контекстов)
356+
// Получить коннектор для текущего контекста выполнения
357+
// Автоматически определяет контекст и выбирает подходящий коннектор
367358
//
368359
// Возвращаемое значение:
369360
// АбстрактныйКоннектор - Коннектор для выполнения операции
370361
//
371-
Функция ПолучитьКоннекторДляОперации()
362+
Функция ПолучитьКоннекторДляТекущегоКонтекста()
372363
Если ПулСоединений = Неопределено Тогда
373-
// Режим обратной совместимости
364+
// Режим обратной совместимости - пул не используется
374365
Возврат Коннектор;
366+
КонецЕсли;
367+
368+
// Определяем текущий контекст
369+
КонтекстID = ПолучитьТекущийКонтекстID();
370+
371+
// Проверяем, есть ли активная транзакция для данного контекста
372+
Если ТекущиеКонтексты.Получить(КонтекстID) <> Неопределено Тогда
373+
// Используем коннектор из активной транзакции
374+
Соединение = ПулСоединений.ПолучитьСоединениеДляКонтекста(КонтекстID);
375+
Возврат Соединение.ПолучитьКоннектор();
375376
Иначе
376-
// В режиме пула - пока используем общий коннектор для операций вне транзакций
377-
// При активной транзакции будет использоваться коннектор из контекста
377+
// Нет активной транзакции - используем общий коннектор
378378
Возврат Коннектор;
379379
КонецЕсли;
380380
КонецФункции

0 commit comments

Comments
 (0)