|
19 | 19 |
|
20 | 20 | // Управление контекстами транзакций |
21 | 21 | Перем ТекущиеКонтексты; // Соответствие: КонтекстID -> Истина (активные контексты) |
22 | | -Перем СчетчикКонтекстов; // Для генерации уникальных ID контекстов |
23 | 22 |
|
24 | 23 | Перем Лог; |
25 | 24 |
|
|
52 | 51 |
|
53 | 52 | // Инициализация управления контекстами |
54 | 53 | ТекущиеКонтексты = Новый Соответствие; |
55 | | - СчетчикКонтекстов = 0; |
56 | 54 | КонецПроцедуры |
57 | 55 |
|
58 | 56 | // Регистрирует переданный тип класса-сценария в модели данных. |
|
122 | 120 | КонецФункции |
123 | 121 |
|
124 | 122 | // Сохраняет сущность в БД. |
| 123 | +// Автоматически определяет контекст выполнения (основной поток или фоновое задание). |
125 | 124 | // |
126 | 125 | // Параметры: |
127 | 126 | // Сущность - Произвольный - Объект (экземпляр класса, зарегистрированного в модели) для сохранения в БД. |
128 | | -// КонтекстID - Строка - Идентификатор контекста транзакции (необязательно) |
129 | 127 | // |
130 | | -Процедура Сохранить(Сущность, КонтекстID = Неопределено) Экспорт |
| 128 | +Процедура Сохранить(Сущность) Экспорт |
131 | 129 | ТипСущности = АктивнаяЗапись.ТипСущности(Сущность); |
132 | 130 | ОбъектМодели = МодельДанных.Получить(ТипСущности); |
133 | 131 | ПулСущностей = ПолучитьПулСущностей(ТипСущности); |
134 | 132 |
|
135 | | - Если КонтекстID <> Неопределено Тогда |
136 | | - // Используем коннектор контекста для потокобезопасной операции |
137 | | - КоннекторДляОперации = ПолучитьКоннекторДляКонтекста(КонтекстID); |
138 | | - Иначе |
139 | | - // Автоматический выбор коннектора |
140 | | - КоннекторДляОперации = ПолучитьКоннекторДляОперации(); |
141 | | - КонецЕсли; |
| 133 | + // Автоматически выбираем коннектор в зависимости от контекста |
| 134 | + КоннекторДляОперации = ПолучитьКоннекторДляТекущегоКонтекста(); |
142 | 135 |
|
143 | 136 | РаботаСКоннекторами.Сохранить(КоннекторДляОперации, ОбъектМодели, ПулСущностей, Сущность); |
144 | 137 | КонецПроцедуры |
145 | 138 |
|
146 | 139 | // Осуществляет поиск сущностей переданного типа по идентификатору. |
| 140 | +// Автоматически определяет контекст выполнения (основной поток или фоновое задание). |
147 | 141 | // |
148 | 142 | // Параметры: |
149 | 143 | // ТипСущности - Тип - Тип искомой сущности. |
|
152 | 146 | // Если параметр имеет тип "Соответствие", то каждое значение соответствия преобразуется к условию поиска |
153 | 147 | // ИмяПоля = ЗначениеПоля, где ИмяПоля - ключ элемента соответствия, ЗначениеПоля - значение элемента соответствия. |
154 | 148 | // Если параметр имеет тип "ОпцииПоиска", то опции передаются как есть. |
155 | | -// КонтекстID - Строка - Идентификатор контекста транзакции (необязательно) |
156 | 149 | // |
157 | 150 | // Возвращаемое значение: |
158 | 151 | // Массив - Массив найденных сущностей. В качестве элементов массива выступают |
159 | 152 | // экземпляры класса с типом, равным переданному параметру "ТипСущности", с заполненными значениями полей. |
160 | 153 | // |
161 | | -Функция Получить(ТипСущности, Знач ОпцииПоиска = Неопределено, КонтекстID = Неопределено) Экспорт |
| 154 | +Функция Получить(ТипСущности, Знач ОпцииПоиска = Неопределено) Экспорт |
162 | 155 | ОбъектМодели = МодельДанных.Получить(ТипСущности); |
163 | 156 | ПулСущностей = ПолучитьПулСущностей(ТипСущности); |
164 | 157 | Если ОпцииПоиска = Неопределено Тогда |
165 | 158 | ОпцииПоиска = Новый ОпцииПоиска; |
166 | 159 | КонецЕсли; |
167 | 160 |
|
168 | | - Если КонтекстID <> Неопределено Тогда |
169 | | - // Используем коннектор контекста для потокобезопасной операции |
170 | | - КоннекторДляОперации = ПолучитьКоннекторДляКонтекста(КонтекстID); |
171 | | - Иначе |
172 | | - // Автоматический выбор коннектора |
173 | | - КоннекторДляОперации = ПолучитьКоннекторДляОперации(); |
174 | | - КонецЕсли; |
| 161 | + // Автоматически выбираем коннектор в зависимости от контекста |
| 162 | + КоннекторДляОперации = ПолучитьКоннекторДляТекущегоКонтекста(); |
175 | 163 |
|
176 | 164 | Возврат РаботаСКоннекторами.Получить(КоннекторДляОперации, ОбъектМодели, ПулСущностей, ОпцииПоиска); |
177 | 165 | КонецФункции |
178 | 166 |
|
179 | 167 | // Осуществляет поиск сущности переданного типа по идентификатору. |
| 168 | +// Автоматически определяет контекст выполнения (основной поток или фоновое задание). |
180 | 169 | // |
181 | 170 | // Параметры: |
182 | 171 | // ТипСущности - Тип - Тип искомой сущности. |
|
186 | 175 | // ИмяПоля = ЗначениеПоля, где ИмяПоля - ключ элемента соответствия, ЗначениеПоля - значение элемента соответствия. |
187 | 176 | // Если параметр имеет тип "ОпцииПоиска", то опции передаются как есть. |
188 | 177 | // Любой другой тип интерпретируется как поиск по &Идентификатору. |
189 | | -// КонтекстID - Строка - Идентификатор контекста транзакции (необязательно) |
190 | 178 | // |
191 | 179 | // Возвращаемое значение: |
192 | 180 | // Произвольный - Если сущность была найдена, то возвращается экземпляр класса с типом, равным переданному параметру |
193 | 181 | // "ТипСущности", с заполненными значениями полей. Иначе возвращается "Неопределено". |
194 | 182 | // |
195 | | -Функция ПолучитьОдно(ТипСущности, Знач ОпцииПоиска = Неопределено, КонтекстID = Неопределено) Экспорт |
| 183 | +Функция ПолучитьОдно(ТипСущности, Знач ОпцииПоиска = Неопределено) Экспорт |
196 | 184 | ОбъектМодели = МодельДанных.Получить(ТипСущности); |
197 | 185 | ПулСущностей = ПолучитьПулСущностей(ТипСущности); |
198 | 186 | Если ОпцииПоиска = Неопределено Тогда |
199 | 187 | ОпцииПоиска = Новый ОпцииПоиска; |
200 | 188 | КонецЕсли; |
201 | 189 |
|
202 | | - Если КонтекстID <> Неопределено Тогда |
203 | | - // Используем коннектор контекста для потокобезопасной операции |
204 | | - КоннекторДляОперации = ПолучитьКоннекторДляКонтекста(КонтекстID); |
205 | | - Иначе |
206 | | - // Автоматический выбор коннектора |
207 | | - КоннекторДляОперации = ПолучитьКоннекторДляОперации(); |
208 | | - КонецЕсли; |
| 190 | + // Автоматически выбираем коннектор в зависимости от контекста |
| 191 | + КоннекторДляОперации = ПолучитьКоннекторДляТекущегоКонтекста(); |
209 | 192 |
|
210 | 193 | Возврат РаботаСКоннекторами.ПолучитьОдно(КоннекторДляОперации, ОбъектМодели, ПулСущностей, ОпцииПоиска); |
211 | 194 | КонецФункции |
212 | 195 |
|
213 | 196 | // Выполняет удаление сущности из базы данных. |
| 197 | +// Автоматически определяет контекст выполнения (основной поток или фоновое задание). |
214 | 198 | // Сущность должна иметь заполненный идентификатор. |
215 | 199 | // |
216 | 200 | // Параметры: |
217 | 201 | // Сущность - Произвольный - Удаляемая сущность |
218 | | -// КонтекстID - Строка - Идентификатор контекста транзакции (необязательно) |
219 | 202 | // |
220 | | -Процедура Удалить(Сущность, КонтекстID = Неопределено) Экспорт |
| 203 | +Процедура Удалить(Сущность) Экспорт |
221 | 204 | ТипСущности = АктивнаяЗапись.ТипСущности(Сущность); |
222 | 205 | ОбъектМодели = МодельДанных.Получить(ТипСущности); |
223 | 206 | ПулСущностей = ПолучитьПулСущностей(ТипСущности); |
224 | 207 |
|
225 | | - Если КонтекстID <> Неопределено Тогда |
226 | | - // Используем коннектор контекста для потокобезопасной операции |
227 | | - КоннекторДляОперации = ПолучитьКоннекторДляКонтекста(КонтекстID); |
228 | | - Иначе |
229 | | - // Автоматический выбор коннектора |
230 | | - КоннекторДляОперации = ПолучитьКоннекторДляОперации(); |
231 | | - КонецЕсли; |
| 208 | + // Автоматически выбираем коннектор в зависимости от контекста |
| 209 | + КоннекторДляОперации = ПолучитьКоннекторДляТекущегоКонтекста(); |
232 | 210 |
|
233 | 211 | РаботаСКоннекторами.Удалить(КоннекторДляОперации, ОбъектМодели, ПулСущностей, Сущность); |
234 | 212 | КонецПроцедуры |
|
252 | 230 | КонецПроцедуры |
253 | 231 |
|
254 | 232 | // Посылает коннектору запрос на начало транзакции. |
255 | | -// |
256 | | -// Возвращаемое значение: |
257 | | -// Строка - Идентификатор контекста транзакции (если пул инициализирован) |
258 | | -// Неопределено - В режиме обратной совместимости (пул не инициализирован) |
| 233 | +// Автоматически определяет контекст выполнения (основной поток или фоновое задание). |
259 | 234 | // |
260 | | -Функция НачатьТранзакцию() Экспорт |
| 235 | +Процедура НачатьТранзакцию() Экспорт |
261 | 236 | Если ПулСоединений <> Неопределено Тогда |
262 | | - // Создаем новый контекст транзакции |
263 | | - КонтекстID = ПолучитьНовыйКонтекстID(); |
| 237 | + // Автоматически определяем контекст выполнения |
| 238 | + КонтекстID = ПолучитьТекущийКонтекстID(); |
264 | 239 | ТекущиеКонтексты[КонтекстID] = Истина; |
265 | 240 |
|
266 | 241 | // Получаем соединение для контекста и начинаем транзакцию |
267 | 242 | Соединение = ПулСоединений.ПолучитьСоединениеДляКонтекста(КонтекстID); |
268 | 243 | Соединение.НачатьТранзакцию(); |
269 | | - |
270 | | - Возврат КонтекстID; |
271 | 244 | Иначе |
272 | 245 | // Обратная совместимость - используем общий коннектор |
273 | 246 | РаботаСКоннекторами.НачатьТранзакцию(Коннектор); |
274 | | - Возврат Неопределено; |
275 | 247 | КонецЕсли; |
276 | | -КонецФункции |
| 248 | +КонецПроцедуры |
277 | 249 |
|
278 | 250 | // Посылает коннектору запрос на фиксацию транзакции. |
| 251 | +// Автоматически определяет контекст выполнения. |
279 | 252 | // |
280 | | -// Параметры: |
281 | | -// КонтекстID - Строка - Идентификатор контекста транзакции (при использовании пула) |
282 | | -// |
283 | | -Процедура ЗафиксироватьТранзакцию(КонтекстID = Неопределено) Экспорт |
284 | | - Если КонтекстID <> Неопределено Тогда |
| 253 | +Процедура ЗафиксироватьТранзакцию() Экспорт |
| 254 | + Если ПулСоединений <> Неопределено Тогда |
| 255 | + // Автоматически определяем текущий контекст |
| 256 | + КонтекстID = ПолучитьТекущийКонтекстID(); |
| 257 | + |
285 | 258 | // Фиксируем транзакцию и освобождаем контекст |
286 | 259 | Соединение = ПулСоединений.ПолучитьСоединениеДляКонтекста(КонтекстID); |
287 | 260 | Соединение.ЗафиксироватьТранзакцию(); |
|
293 | 266 | КонецПроцедуры |
294 | 267 |
|
295 | 268 | // Посылает коннектору запрос на отмену транзакции. |
| 269 | +// Автоматически определяет контекст выполнения. |
296 | 270 | // |
297 | | -// Параметры: |
298 | | -// КонтекстID - Строка - Идентификатор контекста транзакции (при использовании пула) |
299 | | -// |
300 | | -Процедура ОтменитьТранзакцию(КонтекстID = Неопределено) Экспорт |
301 | | - Если КонтекстID <> Неопределено Тогда |
| 271 | +Процедура ОтменитьТранзакцию() Экспорт |
| 272 | + Если ПулСоединений <> Неопределено Тогда |
| 273 | + // Автоматически определяем текущий контекст |
| 274 | + КонтекстID = ПолучитьТекущийКонтекстID(); |
| 275 | + |
302 | 276 | // Отменяем транзакцию и освобождаем контекст |
303 | 277 | Соединение = ПулСоединений.ПолучитьСоединениеДляКонтекста(КонтекстID); |
304 | 278 | Соединение.ОтменитьТранзакцию(); |
|
343 | 317 | КонецЕсли; |
344 | 318 | КонецПроцедуры |
345 | 319 |
|
346 | | -// Получить новый идентификатор контекста |
| 320 | +// Получить идентификатор текущего контекста выполнения |
| 321 | +// Автоматически определяет, выполняется ли код в основном потоке или фоновом задании |
347 | 322 | // |
348 | 323 | // Возвращаемое значение: |
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 | + КонецПопытки; |
354 | 344 | КонецФункции |
355 | 345 |
|
356 | 346 | // Завершить контекст и освободить связанные ресурсы |
|
363 | 353 | ПулСоединений.ОсвободитьКонтекст(КонтекстID); |
364 | 354 | КонецПроцедуры |
365 | 355 |
|
366 | | -// Получить коннектор для текущей операции (с учетом активных контекстов) |
| 356 | +// Получить коннектор для текущего контекста выполнения |
| 357 | +// Автоматически определяет контекст и выбирает подходящий коннектор |
367 | 358 | // |
368 | 359 | // Возвращаемое значение: |
369 | 360 | // АбстрактныйКоннектор - Коннектор для выполнения операции |
370 | 361 | // |
371 | | -Функция ПолучитьКоннекторДляОперации() |
| 362 | +Функция ПолучитьКоннекторДляТекущегоКонтекста() |
372 | 363 | Если ПулСоединений = Неопределено Тогда |
373 | | - // Режим обратной совместимости |
| 364 | + // Режим обратной совместимости - пул не используется |
374 | 365 | Возврат Коннектор; |
| 366 | + КонецЕсли; |
| 367 | + |
| 368 | + // Определяем текущий контекст |
| 369 | + КонтекстID = ПолучитьТекущийКонтекстID(); |
| 370 | + |
| 371 | + // Проверяем, есть ли активная транзакция для данного контекста |
| 372 | + Если ТекущиеКонтексты.Получить(КонтекстID) <> Неопределено Тогда |
| 373 | + // Используем коннектор из активной транзакции |
| 374 | + Соединение = ПулСоединений.ПолучитьСоединениеДляКонтекста(КонтекстID); |
| 375 | + Возврат Соединение.ПолучитьКоннектор(); |
375 | 376 | Иначе |
376 | | - // В режиме пула - пока используем общий коннектор для операций вне транзакций |
377 | | - // При активной транзакции будет использоваться коннектор из контекста |
| 377 | + // Нет активной транзакции - используем общий коннектор |
378 | 378 | Возврат Коннектор; |
379 | 379 | КонецЕсли; |
380 | 380 | КонецФункции |
|
0 commit comments