Как реализовать запись дополнительных данных в регистр накопления после проведения документа?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

Часто в процессе разработки возникает задача дополнить движения документа какой-либо информацией (например, комментариями или служебными признаками), не затрагивая при этом основной модуль объекта. Попытки сделать это через классическую ПодпискуНаСобытие часто приводят к тому, что внесенные данные затираются основным механизмом проведения. Давайте разберемся, почему так происходит и какие архитектурные подходы позволят решить эту задачу правильно.

Почему возникают проблемы с подпиской «ПриЗаписи»

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

Вариант 1: Прямое чтение и модификация набора записей

Если задача критична и требует изменения данных именно в момент проведения, можно выполнить принудительное чтение набора записей. Рассмотрим, как это сделать программно. Суть метода заключается в том, что мы находим документ-регистратор и считываем его движения для последующей модификации.

Разберем примерный алгоритм действий:

  1. Получаем ссылку на документ, который является регистратором.
  2. Используем объект НаборЗаписей для нужного регистра.
  3. Устанавливаем отбор по Регистратор.
  4. Выполняем Прочитать(), модифицируем нужные колонки и Записать().

Однако стоит учитывать, что это считается «костыльным» решением, так как оно влечет за собой риск блокировок и конфликтов транзакций при одновременной работе нескольких пользователей.

Вариант 2: Использование очереди задач (рекомендуемый подход)

Если ваша задача — добавить комментарий или выполнить некую постобработку, гораздо надежнее использовать механизм очередей. Это позволяет развязать процесс проведения документа и процесс наполнения регистра дополнительными данными.

Как это реализовать:

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

Архитектурная рекомендация: избегайте «дурного тона»

Анализируя задачу, важно отметить: добавление комментариев или текстовых полей непосредственно в регистры накопления — это нежелательная практика. Регистры накопления спроектированы для максимально быстрой агрегации числовых данных. Добавление строковых реквизитов приводит к:

Если вам действительно необходимо хранить комментарии к движениям, лучше создать отдельный регистр сведений, где в качестве измерения будет выступать Регистратор или ИдентификаторСтроки движения. Это позволит сохранить чистоту архитектуры и производительность системы на высоком уровне. В следующий раз, столкнувшись с задачей «дописать что-то в движения», сначала задайтесь вопросом: нельзя ли вынести это в отдельный вспомогательный регистр?

← На главную