К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как получить проводки документа в 1С

Способы получить проводки документа в 1С: через Движения.Прочитать, запрос к регистру бухгалтерии, конструктор движений. Примеры кода, типичные ошибки и проверка результата.

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

Выбор способа зависит от контекста: в модуле объекта документа движения доступны напрямую, а из внешнего кода (обработки, отчёта, другого документа) правильнее использовать запрос с отбором по регистратору. Ниже разобраны все рабочие варианты с примерами кода, ограничениями и типичными ошибками.

Где 1С хранит проводки документа

При проведении документ формирует наборы записей в тех регистрах, которые указаны у него на закладке «Движения» в конфигураторе. Для бухгалтерского учёта это регистр бухгалтерии (в типовых конфигурациях — «Хозрасчетный», «Налоговый»), для складского и финансового учёта — регистры накопления («ТоварыНаСкладах», «Взаиморасчеты» и другие).

Ключевая связь между документом и его проводками — поле «Регистратор». Каждая запись регистра содержит ссылку на документ, который её создал. Именно по этому полю строится любой отбор: «дай мне все записи регистра, где Регистратор = мой документ».

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

Способ 1. Получить проводки через коллекцию Движения

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

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

Проводки = ДокументОбъект.Движения.Хозрасчетный;

Проводки.Прочитать();

Для Каждого Проводка Из Проводки Цикл

Сообщить("Дт " + Проводка.СчетДт + " Кт " + Проводка.СчетКт

+ " Сумма: " + Проводка.Сумма);

КонецЦикла;

Метод Прочитать() загружает записи из базы в набор. Без вызова этого метода набор может быть пустым, даже если проводки в базе существуют — это одна из самых частых причин «пропавших» проводок у начинающих разработчиков.

Если документ ещё не проводился, но вы работаете с его объектом в транзакции проведения, движения уже сформированы в памяти — тогда Прочитать() не нужен, записи доступны сразу после выполнения обработки проведения.

Способ 2. Запрос к регистру бухгалтерии по регистратору

Универсальный и наиболее безопасный способ получить проводки любого документа из произвольного места кода — запрос к физической таблице регистра с отбором по регистратору. Запрос не блокирует документ и работает быстрее, чем чтение объекта.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Хозрасчетный.СчетДт,

| Хозрасчетный.СчетКт,

| Хозрасчетный.Сумма,

| Хозрасчетный.Содержание

|ИЗ

| РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный

|ГДЕ

| Хозрасчетный.Регистратор = &Регистратор";

Запрос.УстановитьПараметр("Регистратор", СсылкаНаДокумент);

Результат = Запрос.Выполнить().Выгрузить();

Для регистров накопления синтаксис аналогичный, меняется только тип таблицы: РегистрНакопления.ТоварыНаСкладах. Субконто в запросе доступны через поля вида СубконтоДт1, СубконтоКт1 и т.д. — их точные имена зависят от настроек плана счетов.

Если нужны проводки сразу по группе документов, передайте в параметр массив ссылок и используйте условие Регистратор В (&СписокДокументов). Это позволит одним запросом получить движения, например, всех реализаций за период.

bsl
Запрос.Текст = "ВЫБРАТЬ * ИЗ РегистрБухгалтерии.Хозрасчетный ГДЕ Регистратор = &Ссылка";

Способ 3. Набор записей через менеджер регистра

Третий вариант — работа с набором записей напрямую через менеджер регистра, без объекта документа. Он полезен, когда нужно не только прочитать, но и программно изменить или перезаписать проводки (например, в обработке исправления движений).

НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);

НаборЗаписей.Прочитать();

Для Каждого Запись Из НаборЗаписей Цикл

// работа с записью

КонецЦикла;

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

Как посмотреть проводки без программирования

Не всегда нужен код. В пользовательском режиме проводки документа доступны штатными средствами: откройте проведённый документ и используйте кнопку «Дт/Кт» (в типовых конфигурациях на управляемых формах) или меню «Перейти → Проводки». Откроется список записей регистра, отфильтрованный по этому документу.

Для массового анализа подойдёт отчёт «Оборотно-сальдовая ведомость по счету» или универсальный отчёт по регистру с отбором по регистратору. В конфигураторе проводки можно посмотреть через «Сервис → Параметры» нет — правильный путь: открыть список регистра и установить отбор по полю «Регистратор».

Сравнение способов

Коллекция Движения

Подходит в модуле документа и при проведении. Требует объект документа, блокирует его при ПолучитьОбъект().

Запрос по регистратору

Лучший выбор для чтения извне: быстро, без блокировок, работает с группой документов. Только для чтения.

Набор записей

Нужен для программного изменения проводок. Требует обязательного отбора по регистратору и аккуратности при записи.

Интерфейс Дт/Кт

Для разового просмотра пользователем без программирования. Не подходит для обработки данных.

Проверка результата и типичные ошибки

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

Отдельный случай — документы с ручной корректировкой движений (флаг «Ручная корректировка» в типовых). Их проводки могут отличаться от того, что сформировал бы алгоритм проведения, поэтому при перепроведении таких документов ручные правки сохраняются, а запрос всё равно вернёт актуальные записи из регистра.

Типичные ошибки
01
Забыли вызвать Прочитать() у набора записей — коллекция пуста, хотя проводки в базе есть.
02
Использовали ПолучитьОбъект() в цикле по тысячам документов — конфликты блокировок и резкое замедление.
03
Обратились к регистру, которого нет в движениях документа — результат всегда пустой.
04
Записали набор без отбора по регистратору — риск затронуть чужие записи или получить ошибку платформы.
05
Искали проводки у непроведённого документа — движения существуют только у проведённых.
Контрольные точки

Как проверить результат

Количество записей в результате
Норма

Больше нуля для проведённого документа

Тревожный признак

Пусто при проведённом документе — неверный регистр или отбор

Поле Регистратор у записей
Норма

Равно ссылке на исходный документ

Тревожный признак

Чужие ссылки — сбит отбор

Суммы Дт и Кт
Норма

Итоги по дебету и кредиту равны

Тревожный признак

Расхождение — проводки повреждены или прочитаны частично

Частые вопросы

Как получить проводки документа, если он не проведён?

Никак — проводки существуют только у проведённых документов. Если документ распроведён, его записи удаляются из регистров. Сначала проведите документ, затем читайте движения.

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

Откройте документ в конфигураторе и посмотрите закладку «Движения» — там перечислены все регистры. Программно список доступен через метаданные: Документ.Метаданные().Движения.

Можно ли получить проводки сразу нескольких документов одним запросом?

Да. Передайте в параметр запроса массив или список ссылок и используйте условие Регистратор В (&Список). Это заметно быстрее, чем читать каждый документ отдельно.

Чем отличается Движения.Хозрасчетный от запроса к регистру?

Коллекция Движения привязана к объекту документа и отражает его движения в памяти, включая ещё не записанные. Запрос читает фактические данные из базы без блокировки документа, но только для чтения.

Почему запрос к регистру возвращает пустой результат?

Наиболее вероятные причины: документ не проведён, выбран не тот регистр (документ не делает по нему движений), либо в параметр передана не та ссылка. Проверьте проводки через кнопку «Дт/Кт» в интерфейсе — так вы увидите реальный регистр.

Как программно изменить проводки документа?

Создайте набор записей регистра, установите отбор по регистратору, прочитайте, измените записи и вызовите Записать(). Учтите, что при следующем перепроведении документа платформа перезапишет эти проводки, если не установлен флаг ручной корректировки.

Итог

Что важно запомнить

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