Разработка и Конфигурация · 9 мин
Как получить проводки документа в 1С
Способы получить проводки документа в 1С: через Движения.Прочитать, запрос к регистру бухгалтерии, конструктор движений. Примеры кода, типичные ошибки и проверка результата.
Проводки документа в 1С хранятся не в самом документе, а в регистрах — бухгалтерском (например, «Хозрасчетный») или накопления. Поэтому задача «получить проводки документа» сводится к чтению движений документа из соответствующего регистра. Сделать это можно несколькими способами: через коллекцию движений объекта, запросом к виртуальной таблице регистра или через менеджер набора записей.
Выбор способа зависит от контекста: в модуле объекта документа движения доступны напрямую, а из внешнего кода (обработки, отчёта, другого документа) правильнее использовать запрос с отбором по регистратору. Ниже разобраны все рабочие варианты с примерами кода, ограничениями и типичными ошибками.
Где 1С хранит проводки документа
При проведении документ формирует наборы записей в тех регистрах, которые указаны у него на закладке «Движения» в конфигураторе. Для бухгалтерского учёта это регистр бухгалтерии (в типовых конфигурациях — «Хозрасчетный», «Налоговый»), для складского и финансового учёта — регистры накопления («ТоварыНаСкладах», «Взаиморасчеты» и другие).
Ключевая связь между документом и его проводками — поле «Регистратор». Каждая запись регистра содержит ссылку на документ, который её создал. Именно по этому полю строится любой отбор: «дай мне все записи регистра, где Регистратор = мой документ».
Важно понимать: если документ проведён, но не делает движений по конкретному регистру, набор записей по этому регистру будет пустым. А если документ не проведён вовсе, проводок у него нет — попытка их получить вернёт пустую коллекцию или пустой результат запроса.
Способ 1. Получить проводки через коллекцию Движения
Если код выполняется в модуле объекта документа или у вас есть объект документа (полученный через ПолучитьОбъект()), проводки доступны через свойство Движения. Это коллекция наборов записей, по одному на каждый регистр, указанный в движениях документа.
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
Проводки = ДокументОбъект.Движения.Хозрасчетный;
Проводки.Прочитать();
Для Каждого Проводка Из Проводки Цикл
Сообщить("Дт " + Проводка.СчетДт + " Кт " + Проводка.СчетКт
+ " Сумма: " + Проводка.Сумма);
КонецЦикла;
Метод Прочитать() загружает записи из базы в набор. Без вызова этого метода набор может быть пустым, даже если проводки в базе существуют — это одна из самых частых причин «пропавших» проводок у начинающих разработчиков.
Если документ ещё не проводился, но вы работаете с его объектом в транзакции проведения, движения уже сформированы в памяти — тогда Прочитать() не нужен, записи доступны сразу после выполнения обработки проведения.
Способ 2. Запрос к регистру бухгалтерии по регистратору
Универсальный и наиболее безопасный способ получить проводки любого документа из произвольного места кода — запрос к физической таблице регистра с отбором по регистратору. Запрос не блокирует документ и работает быстрее, чем чтение объекта.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Хозрасчетный.СчетДт,
| Хозрасчетный.СчетКт,
| Хозрасчетный.Сумма,
| Хозрасчетный.Содержание
|ИЗ
| РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Регистратор = &Регистратор";
Запрос.УстановитьПараметр("Регистратор", СсылкаНаДокумент);
Результат = Запрос.Выполнить().Выгрузить();
Для регистров накопления синтаксис аналогичный, меняется только тип таблицы: РегистрНакопления.ТоварыНаСкладах. Субконто в запросе доступны через поля вида СубконтоДт1, СубконтоКт1 и т.д. — их точные имена зависят от настроек плана счетов.
Если нужны проводки сразу по группе документов, передайте в параметр массив ссылок и используйте условие Регистратор В (&СписокДокументов). Это позволит одним запросом получить движения, например, всех реализаций за период.
Запрос.Текст = "ВЫБРАТЬ * ИЗ РегистрБухгалтерии.Хозрасчетный ГДЕ Регистратор = &Ссылка";Способ 3. Набор записей через менеджер регистра
Третий вариант — работа с набором записей напрямую через менеджер регистра, без объекта документа. Он полезен, когда нужно не только прочитать, но и программно изменить или перезаписать проводки (например, в обработке исправления движений).
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
// работа с записью
КонецЦикла;
Обязательно установите отбор по регистратору до вызова Прочитать(). Набор без отбора попытается прочитать весь регистр, что на большой базе приведёт к зависанию или нехватке памяти. А запись набора без отбора вообще заблокирована платформой как защита от случайного уничтожения данных.
Как посмотреть проводки без программирования
Не всегда нужен код. В пользовательском режиме проводки документа доступны штатными средствами: откройте проведённый документ и используйте кнопку «Дт/Кт» (в типовых конфигурациях на управляемых формах) или меню «Перейти → Проводки». Откроется список записей регистра, отфильтрованный по этому документу.
Для массового анализа подойдёт отчёт «Оборотно-сальдовая ведомость по счету» или универсальный отчёт по регистру с отбором по регистратору. В конфигураторе проводки можно посмотреть через «Сервис → Параметры» нет — правильный путь: открыть список регистра и установить отбор по полю «Регистратор».
Сравнение способов
Подходит в модуле документа и при проведении. Требует объект документа, блокирует его при ПолучитьОбъект().
Лучший выбор для чтения извне: быстро, без блокировок, работает с группой документов. Только для чтения.
Нужен для программного изменения проводок. Требует обязательного отбора по регистратору и аккуратности при записи.
Для разового просмотра пользователем без программирования. Не подходит для обработки данных.
Проверка результата и типичные ошибки
После получения проводок убедитесь, что результат соответствует ожиданиям: количество записей больше нуля, суммы по дебету и кредиту сходятся, регистратор у каждой записи равен исходному документу. Если запрос вернул пустую таблицу, проверьте три вещи: проведён ли документ, указан ли нужный регистр в его движениях и не отменено ли проведение после формирования проводок.
Отдельный случай — документы с ручной корректировкой движений (флаг «Ручная корректировка» в типовых). Их проводки могут отличаться от того, что сформировал бы алгоритм проведения, поэтому при перепроведении таких документов ручные правки сохраняются, а запрос всё равно вернёт актуальные записи из регистра.
Как проверить результат
Больше нуля для проведённого документа
Пусто при проведённом документе — неверный регистр или отбор
Равно ссылке на исходный документ
Чужие ссылки — сбит отбор
Итоги по дебету и кредиту равны
Расхождение — проводки повреждены или прочитаны частично
Частые вопросы
Как получить проводки документа, если он не проведён?
Никак — проводки существуют только у проведённых документов. Если документ распроведён, его записи удаляются из регистров. Сначала проведите документ, затем читайте движения.
Как узнать, по каким регистрам документ делает движения?
Откройте документ в конфигураторе и посмотрите закладку «Движения» — там перечислены все регистры. Программно список доступен через метаданные: Документ.Метаданные().Движения.
Можно ли получить проводки сразу нескольких документов одним запросом?
Да. Передайте в параметр запроса массив или список ссылок и используйте условие Регистратор В (&Список). Это заметно быстрее, чем читать каждый документ отдельно.
Чем отличается Движения.Хозрасчетный от запроса к регистру?
Коллекция Движения привязана к объекту документа и отражает его движения в памяти, включая ещё не записанные. Запрос читает фактические данные из базы без блокировки документа, но только для чтения.
Почему запрос к регистру возвращает пустой результат?
Наиболее вероятные причины: документ не проведён, выбран не тот регистр (документ не делает по нему движений), либо в параметр передана не та ссылка. Проверьте проводки через кнопку «Дт/Кт» в интерфейсе — так вы увидите реальный регистр.
Как программно изменить проводки документа?
Создайте набор записей регистра, установите отбор по регистратору, прочитайте, измените записи и вызовите Записать(). Учтите, что при следующем перепроведении документа платформа перезапишет эти проводки, если не установлен флаг ручной корректировки.
Что важно запомнить
Проводки живут в регистрах и связаны с документом полем Регистратор. Для чтения извне используйте запрос, в модуле документа — коллекцию Движения, для изменения — набор записей с обязательным отбором. Перед изменением движений работайте в копии базы.