Часто в процессе разработки возникает задача дополнить движения документа какой-либо информацией (например, комментариями или служебными признаками), не затрагивая при этом основной модуль объекта. Попытки сделать это через классическую ПодпискуНаСобытие часто приводят к тому, что внесенные данные затираются основным механизмом проведения. Давайте разберемся, почему так происходит и какие архитектурные подходы позволят решить эту задачу правильно.
Важно понимать, что событие ПриЗаписи для набора записей регистра накопления выполняется внутри транзакции записи документа. Когда вы программно пытаетесь изменить набор записей, вы работаете с данными, которые еще не были окончательно зафиксированы в базе данных. В момент завершения работы модуля документа платформа выполняет перезапись движений, что в ряде случаев приводит к потере изменений, внесенных в подписке. Более того, архитектурно подписки предназначены для дополнения логики, а не для изменения уже сформированных движений в рамках одной транзакции.
Если задача критична и требует изменения данных именно в момент проведения, можно выполнить принудительное чтение набора записей. Рассмотрим, как это сделать программно. Суть метода заключается в том, что мы находим документ-регистратор и считываем его движения для последующей модификации.
Разберем примерный алгоритм действий:
НаборЗаписей для нужного регистра.Регистратор.Прочитать(), модифицируем нужные колонки и Записать().Однако стоит учитывать, что это считается «костыльным» решением, так как оно влечет за собой риск блокировок и конфликтов транзакций при одновременной работе нескольких пользователей.
Если ваша задача — добавить комментарий или выполнить некую постобработку, гораздо надежнее использовать механизм очередей. Это позволяет развязать процесс проведения документа и процесс наполнения регистра дополнительными данными.
Как это реализовать:
ОчередьЗадач, куда поместите ссылку на документ.РегламентноеЗадание, которое будет считывать записи из этой очереди.Этот подход обеспечивает высокую стабильность системы, так как основная транзакция проведения документа не нагружается дополнительными операциями записи, а риск потери данных при параллельном проведении сводится к нулю.
Анализируя задачу, важно отметить: добавление комментариев или текстовых полей непосредственно в регистры накопления — это нежелательная практика. Регистры накопления спроектированы для максимально быстрой агрегации числовых данных. Добавление строковых реквизитов приводит к:
Если вам действительно необходимо хранить комментарии к движениям, лучше создать отдельный регистр сведений, где в качестве измерения будет выступать Регистратор или ИдентификаторСтроки движения. Это позволит сохранить чистоту архитектуры и производительность системы на высоком уровне. В следующий раз, столкнувшись с задачей «дописать что-то в движения», сначала задайтесь вопросом: нельзя ли вынести это в отдельный вспомогательный регистр?