Работа с бухгалтерскими проводками в 1С: запросы к регистрам бухгалтерии

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

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

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

Теория: Как хранятся проводки в регистре бухгалтерии

В отличие от регистров накопления‚ регистр бухгалтерии имеет строго определенную структуру‚ заданную планом счетов. Ключевой момент — настройка свойства Движения по счетам (в конфигураторе‚ свойства регистра):

  • Движения по счетам = Истина (Двойная запись): Регистр содержит измерения СчетДт и СчетКт. Платформа контролирует‚ чтобы в рамках одной записи (проводки) были заполнены оба счета. Это стандарт для бухгалтерии (Хозрасчетный‚ НУ и т.д.).
  • Движения по счетам = Ложь (Однонаправленные): Регистр содержит измерения Счет и ВидДвижения (Приход/Расход). Используется редко‚ например‚ для учета валютных различий или специфического управленческого учета.

Важно: Набор записей регистра бухгалтерии формируется документом при проведении. Каждая запись — это одна строка проводки (Дт/Кт). Субконто (Подразделение‚ Номенклатура‚ Контрагент и др.) определяются планом счетов для каждого счета отдельно;

Основные виртуальные таблицы для чтения проводок

Не рекомендуется читать физическую таблицу регистра напрямую (РегистрБухгалтерии.Хозрасчетный)‚ так как это неэффективно и не дает доступа к сальдо. Используйте виртуальные таблицы:

Виртуальная таблица Назначение Ключевые поля
Обороты Обороты за период (Дебет‚ Кредит) и входящие/исходящие сальдо. СчетДт‚ СчетКт‚ Субконто‚ СуммаДт‚ СуммаКт‚ КоличествоДт‚ КоличествоКт
ОборотыДтКт Самая частая для детального анализа. Разворачивает двойную запись в две строки: отдельно Дт и отдельно Кт. Удобно для СКД и отчетов «по счетам». Счет‚ ВидДвижения (Дт/Кт)‚ Субконто‚ Сумма‚ Количество‚ Регистратор‚ НомерСтроки
Остатки Сальдо на конкретный момент времени. Счет‚ Субконто‚ Сумма‚ Количество
Проводки Доступ к «сырым» записям регистра (как они записал документ). Не агрегирует данные. Регистратор‚ НомерСтроки‚ СчетДт‚ СчетКт‚ СубконтоДт‚ СубконтоКт‚ Сумма‚ Количество‚ Валюта‚ Курс

Практические примеры запросов

Получить все проводки конкретного документа (Регистратора)

Это самая частая задача: «Дана ссылка на документ‚ показать его проводки». Лучше всего использовать виртуальную таблицу Проводки с отбором по Регистратор.

// Пример на языке 1С
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
| Проводки.Регистратор‚
| Проводки.НомерСтроки‚
| Проводки.СчетДт КАК СчетДт‚
| Проводки.СчетКт КАК СчетКт‚
| Проводки.Сумма КАК Сумма‚
| Проводки.Количество КАК Количество‚
| Проводки.Валюта КАК Валюта‚
| Проводки.Курс КАК Курс‚
| // Субконто доступны как измерения: СубконтоДт1‚ СубконтоДт2‚ СубконтоДт3‚ СубконтоКт1...
| Проводки.СубконтоДт1 КАК СубконтоДт1‚
| Проводки.СубконтоКт1 КАК СубконтоКт1
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Проводки КАК Проводки
|ГДЕ
| Проводки.Регистратор = &Регистратор";

Запрос.УстановитьПараметр("Регистратор"‚ СсылкаНаДокумент); // Передаем ссылку на документ
Результат = Запрос.Выполнить;
Выборка = Результат.Выбрать;

Пока Выборка.Следующий Цикл
 // Обработка строки проводки
 Сообщить(Выборка.СчетДт + " / " + Выборка.СчетКт + " = " + Выборка;Сумма);
КонецЦикла;

Анализ оборотов по счетам с развертыванием Дт/Кт (ОборотыДтКт)

Если нужно получить «плоский» список движений по счетам (например‚ для отчета по счету 60.01)‚ удобнее использовать ОборотыДтКт. В этом случае одна проводка даст две записи выборки.

Запрос.Текст = 
"ВЫБРАТЬ
| ОборотыДтКт.Счет КАК Счет‚
| ОборотыДтКт.ВидДвижения КАК ВидДвижения‚ // Приход (Дт) / Расход (Кт)
| ОборотыДтКт.Субконто1 КАК Подразделение‚ // Пример: 1-е субконто счета
| ОборотыДтКт.Субконто2 КАК Номенклатура‚ // Пример: 2-е субконто
| ОборотыДтКт.Субконто3 КАК Контрагент‚ // Пример: 3-е субконто
| ОборотыДтКт.Сумма КАК Сумма‚
| ОборотыДтКт.Количество КАК Количество‚
| ОборотыДтКт.Регистратор КАК Документ‚
| ОборотыДтКт.НомерСтроки КАК НомерСтроки
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(
| &НачалоПериода‚ 
| &КонецПериода‚ 
| ‚ // Условие по измерениям (можно оставить пустым)
| Счет В (&СписокСчетов) // Отбор по списку счетов
| ) КАК ОборотыДтКт
|УПОРЯДОЧИТЬ ПО
| ОборотыДтКт.Счет‚
| ОборотыДтКт.ВидДвижения";

Запрос.УстановитьПараметр("НачалоПериода"‚ НачалоМесяца(ТекущаяДата));
Запрос.УстановитьПараметр("КонецПериода"‚ КонецМесяца(ТекущаяДата));
Запрос.УстановитьПараметр("СписокСчетов"‚ Новый СписокЗначений); // Заполнить нужными счетами

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

Для получения остатков на конец дня (например‚ для сверки с банком по счету 51):

Запрос.Текст = 
"ВЫБРАТЬ
| Остатки.Счет КАК Счет‚
| Остатки.Субконто1 КАК Подразделение‚
| Остатки.Субконто2 КАК Контрагент‚
| Остатки.Сумма КАК СуммаОстатка‚
| Остатки.Количество КАК КоличествоОстатка
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(
| &МоментВремени‚ 
| ‚ 
| Счет = &Счет51
| ) КАК Остатки";

Запрос.УстановитьПараметр("МоментВремени"‚ КонецДня(РабочаяДата));
Запрос.УстановитьПараметр("Счет51"‚ ПланыСчетов.Хозрасчетный.НайтиПоКоду("51"));

Работа с субконто: Получение понятных наименований

В запросе субконто приходят как ссылки (СправочникСсылка.Номенклатура и т.д.). Чтобы получить наименования‚ нужно соединять (JOIN) таблицы справочников. В 1С это делается через точечную нотацию или явный LEFT JOIN.

Вариант А: Точечная нотация (проще‚ но медленнее на больших выборках)

ВЫБРАТЬ
 Проводки.СубконтоДт1.Наименование КАК НоменклатураДт‚
 Проводки.СубконтоКт1.Наименование КАК КонтрагентКт
ИЗ
 РегистрБухгалтерии.Хозрасчетный.Проводки КАК Проводки

Вариант Б: Явный LEFT JOIN (профессиональный подход‚ быстрее)

ВЫБРАТЬ
 Проводки.Регистратор‚
 Проводки.СчетДт‚
 Проводки.СчетКт‚
 Номенклатура.Наименование КАК НоменклатураДт‚
 Контрагент.Наименование КАК КонтрагентКт
ИЗ
 РегистрБухгалтерии.Хозрасчетный.Проводки КАК Проводки
 ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
 ПО Проводки.СубконтоДт1 = Номенклатура.Ссылка
 ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагент
 ПО Проводки.СубконтоКт1 = Контрагент.Ссылка
ГДЕ
 Проводки.Регистратор = &Регистратор

Нюансы и частые ошибки

  1. Пустая выборка на платформе 8.3: Если запрос по ОборотыДтКт возвращает 0 записей‚ проверьте:
    • Правильность периода (включая границы: НачалоПериода‚ КонецПериода).
    • Наличие движений у регистратора (документ проведен?).
    • Права доступа (RLS) — пользователь может не видеть данные по организации/подразделению.
  2. Начальные остатки: Виртуальная таблица Обороты с параметром АвтоУпорядочивание или при получении сальдо «Входящие» корректно учитывает начальные остатки. Таблица Проводки, нет‚ она показывает только записи текущего периода.
  3. Производительность: Избегайте запросов к Проводки без отбора по Регистратор или Период на больших базах. Всегда используйте отборы по измерениям (Счет‚ Субконто) во втором параметре виртуальной таблицы (УсловиеОтбораПоИзмерениям).
  4. Мультивалютность: Поля Валюта и Курс заполняются только если счет валютный. В суммах (Сумма) всегда хранится сумма в валюте учета (рубли)‚ а в СуммаВал — в валюте счета.

Пример универсальной функции для получения проводок документа

Функция ПолучитьПроводкиДокумента(РегистрБухгалтерии‚ Регистратор) Экспорт
 
 Запрос = Новый Запрос;
 Запрос.Текст = 
 "ВЫБРАТЬ
 | Проводки.НомерСтроки КАК НомерСтроки‚
 | Проводки.СчетДт КАК СчетДт‚
 | Проводки.СчетКт КАК СчетКт‚
 | Проводки.Сумма КАК Сумма‚
 | Проводки.Количество КАК Количество‚
 | Проводки.Валюта КАК Валюта‚
 | Проводки.Курс КАК Курс‚
 | Проводки.СубконтоДт1 КАК СубконтоДт1‚
 | Проводки.СубконтоДт2 КАК СубконтоДт2‚
 | Проводки.СубконтоДт3 КАК СубконтоДт3‚
 | Проводки.СубконтоКт1 КАК СубконтоКт1‚
 | Проводки.СубконтоКт2 КАК СубконтоКт2‚
 | Проводки.СубконтоКт3 КАК СубконтоКт3
 |ИЗ
 | РегистрБухгалтерии." + РегистрБухгалтерии.Имя + ".Проводки КАК Проводки
 |ГДЕ
 | Проводки.Регистратор = &Регистратор";
  Запрос.УстановитьПараметр("Регистратор"‚ Регистратор);
 
 Возврат Запрос.Выполнить.Выгрузить; // Возвращаем ТаблицуЗначений для удобства
 
КонецФункции


// Использование:
ТаблицаПроводок = ПолучитьПроводкиДокумента(РегистрыБухгалтерии.Хозрасчетный‚ ДокументСсылка);
Для Каждого Стр Из ТаблицаПроводок Цикл
 // Стр.СчетДт‚ Стр.СубконтоДт1 и т.д.
КонецЦикла;

Получение проводок в 1С — задача стандартная‚ но требующая понимания архитектуры регистров бухгалтерии. Главные правила:

  • Используйте виртуальные таблицы (Проводки‚ ОборотыДтКт‚ Остатки)‚ а не физические.
  • Всегда ставьте отборы по измерениям (Счет‚ Субконто‚ Регистратор‚ Период) в параметрах виртуальной таблицы — это ключ к производительности.
  • Учитывайте тип регистра (Двойная запись vs Однонаправленные) при написании полей выборки (СчетДт/СчетКт vs Счет/ВидДвижения).
  • Для отчетов используйте ОборотыДтКт‚ для детального разбора документа, Проводки.

Соблюдение этих принципов позволит писать быстрые‚ надежные и поддерживаемые запросы к бухгалтерским данным.