Довідковий матеріал

Процес виконання вбудованої мови 1С:Підприємства

Розділ містить пояснення до поняття "процес виконання вбудованої мови 1С:Підприємства" та дій платформи, що виконуються на його початку й завершенні: з транзакціями, з блокуваннями даних для редагування, з повторно використовуваними значеннями, з витоками пам'яті.

Абстрактний процес виконання коду на платформі з початком і завершенням, транзакційним кільцем, блокуваннями даних, очищенням кешу та контролем витоків пам’яті.

Розділ містить пояснення до поняття "процес виконання вбудованої мови 1С:Підприємства" та дій платформи, що виконуються на його початку й завершенні: з транзакціями, з блокуваннями даних для редагування, з повторно використовуваними значеннями, з витоками пам'яті.

Що таке "процес виконання вбудованої мови 1С:Підприємства"

Процес виконання вбудованої мови (далі в цьому розділі — процес) являє собою виконання платформою 1С:Підприємства коду конфігурації вбудованою мовою.

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

Наприклад:

  • Під час запуску клієнтського застосунку 1С:Підприємства, якщо конфігурація має непорожній модуль застосунку (модуль звичайного застосунку, модуль зовнішнього з'єднання, модуль керованого застосунку), починається процес виконання тіла модуля застосунку. Тіло модуля застосунку виконується, включно з усім, що з нього викликається. Після цього процес виконання тіла модуля застосунку закінчується.
  • Процес починається під час виклику платформою обробників подій модуля застосунку (ПередНачаломРаботыСистемы, ПередЗавершениемРаботыСистемы тощо) або обробників очікування (установлених методом ПодключитьОбработчикОжидания) і закінчується після завершення виконання відповідного обробника.
  • Процес починається, якщо платформа викликає обробник інтерактивної дії у формі або елементі керування (ПриАктивизацииСтроки, ПриАктивизацииКолонки тощо), і закінчується після завершення виконання відповідного обробника.
  • Процес починається, якщо внаслідок інтерактивної дії платформа викликає обробник події, визначеної в модулі об'єкта (ПередЗаписью, ПриЗаписи тощо), і закінчується після завершення виконання відповідного обробника.
  • Процес починається на початку виконання серверного методу, безпосередньо викликаного з клієнта, і закінчується під час повернення керування з цього методу клієнту.
  • Процес починається під час першого виклику методу вбудованої мови через COM і закінчується під час останнього повернення керування з цього методу.

Важливо, що якщо стек викликів методів вбудованої мови складний і містить багаторазові переходи між операційною системою, платформою та вбудованою мовою, то процес починається лише під час першого переходу з операційної системи або платформи до вбудованої мови й закінчується під час останнього переходу з вбудованої мови до платформи або операційної системи.

Винятком є випадок, коли виконання вбудованої мови призупинено налагоджувачем і налагоджувач виконує обчислення виразу. У цьому разі для обчислення виразу починається новий процес. Після обчислення виразу цей процес закінчується.

На початку та в кінці процесу платформа виконує низку неявних дій, які можуть вплинути на роботу конфігурації.

Транзакції

Багато операцій, що виконуються конфігураціями, потребують узгодженого читання/змінення даних. Для цих цілей використовується механізм транзакцій. Транзакції можуть починатися й закінчуватися як неявно об'єктами 1С:Підприємства (наприклад, під час запису або проведення документів), так і явно методами глобального контексту НачатьТранзакцию(), ЗафиксироватьТранзакцию() і ОтменитьТранзакцию(). Початок транзакції (неявно або за допомогою НачатьТранзакцию()) може виконуватися багаторазово. Фактичний початок транзакції відбувається лише під час першого виконання початку транзакції, а всі інші призводять до збільшення значення лічильника транзакції. Виконання завершення транзакції (неявно або за допомогою ЗафиксироватьТранзакцию()/ОтменитьТранзакцию()) призводить до зменшення значення лічильника транзакції. Лише останнє виконання завершення транзакції призводить до її фактичного завершення.

Докладніше можна прочитати в статті "Помилки бази даних і транзакції".

Важливо, що значення лічильника транзакції зберігається на початку процесу.

Протягом процесу значення лічильника транзакції не може стати меншим за збережене значення. Якщо під час виконання методу ЗафиксироватьТранзакцию() або ОтменитьТранзакцию() значення лічильника транзакції мало б стати меншим, ніж збережене значення лічильника, виникає виняток "Транзакція не відкрита".

Наприкінці процесу, якщо поточне значення лічильника транзакції більше за збережене значення, платформа неявно виконує ОтменитьТранзакцию() стільки разів, скільки потрібно, щоб значення стали рівними.

Блокування даних для редагування

Блокування даних для редагування керуються методами глобального контексту ЗаблокироватьДанныеДляРедактирования() і РазблокироватьДанныеДляРедактирования(). Якщо під час виклику методу ЗаблокироватьДанныеДляРедактирования() не вказано значення параметра ИдентификаторФормы, то наприкінці процесу встановлене блокування знімається платформою неявно.

Повторно використовувані значення

Загальні модулі з повторно використовуваними значеннями можна використовувати для збереження значень даних, що часто використовуються. Якщо для загального модуля встановлено значення "На час виклику" властивості "Повторне використання значень, що повертаються", то збережені значення неявно видалятимуться платформою наприкінці процесу.

Витоки пам'яті

У технологічному журналі передбачено можливість відстеження витоків пам'яті під час виконання заданих ділянок коду конфігурації. Важливим окремим випадком контрольованої ділянки коду конфігурації є процес. Якщо у файлі конфігурації технологічного журналу контроль витоків пам'яті задано таким елементом leaks:

<leaks Collect=1>  <point Call="client"/>  <point Сall="server"/></leaks>

то до технологічного журналу буде виведено інформацію про об'єкти, які було створено, але не звільнено між початком і завершенням процесу на сервері (<point Сall="server"/>) і на клієнті (<point Call="client"/>).

Записатися телефоном