Почему при получении объекта документа в 1С движения пусты, хотя документ проведен?

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

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

Причина отсутствия движений

Основная причина кроется в архитектуре платформы и заботе о производительности. Метод GetObject() создает в памяти объект документа, считывая из базы данных все его основные реквизиты, табличные части и признаки проведения. Однако, движения (записи в регистрах) — это объемные данные. Если бы платформа каждый раз при получении объекта автоматически вычитывала все движения из всех регистров, это привело бы к колоссальным замедлениям системы при выполнении операций, где движения не требуются.

Таким образом, коллекция Объект.Движения при инициализации объекта является пустой или содержит только ссылки на наборы записей, которые еще не были прочитаны из базы данных. Чтобы увидеть данные в регистрах, необходимо дать платформе явную команду на их считывание.

Как правильно считать движения документа

Чтобы получить доступ к движениям конкретного документа в оперативной памяти, вам необходимо вызвать метод Прочитать() у того набора записей регистра, который вас интересует. Рассмотрим пример того, как это делается правильно:


// Получаем объект документа из ссылки
ДокументОбъект = СсылкаНаДокумент.GetObject();

// Считываем движения по нужному регистру (например, Хозрасчетный)
ДокументОбъект.Движения.Хозрасчетный.Прочитать();

// Теперь мы можем обращаться к записям
Для Каждого Запись Из ДокументОбъект.Движения.Хозрасчетный Цикл
    Сообщить(Запись.СчетДт);
КонецЦикла;

Обратите внимание: метод Прочитать() необходимо вызывать для каждого регистра отдельно. Если вы попробуете обратиться к набору записей до выполнения Прочитать(), вы увидите пустую коллекцию, так как данные еще не были загружены в оперативную память.

Отличие метода Прочитать() от записи документа

Важно различать чтение движений и перепроведение документа. Это два принципиально разных процесса:

  1. Прочитать(): Просто загружает текущие данные из базы в оперативную память объекта. Вы можете посмотреть их, проанализировать, но не меняете логику формирования движений.
  2. Записать(РежимЗаписиДокумента.Проведение): Инициирует механизм проведения. Платформа выполняет процедуру ОбработкаПроведения в модуле объекта, которая заново рассчитывает движения, очищает старые записи в регистрах для этого регистратора и записывает новые.

Именно поэтому после выполнения DocObject.Write(DocumentWriteMode.Posting) движения «появляются» — они были сформированы алгоритмом проведения заново, а не просто считаны из базы. Это важный момент для понимания жизненного цикла данных в 1С.

Практические рекомендации

При работе с движениями помните о следующих нюансах:

Теперь, зная этот механизм, вы сможете избежать ошибок при анализе движений и строить свои алгоритмы обработки документов максимально эффективно!

← На главную