Работа с бухгалтерскими проводками программно, одна из базовых задач разработчика 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 = Контрагент.Ссылка
ГДЕ
Проводки.Регистратор = &Регистратор
Нюансы и частые ошибки
- Пустая выборка на платформе 8.3: Если запрос по
ОборотыДтКтвозвращает 0 записей‚ проверьте:- Правильность периода (включая границы:
НачалоПериода‚КонецПериода). - Наличие движений у регистратора (документ проведен?).
- Права доступа (RLS) — пользователь может не видеть данные по организации/подразделению.
- Правильность периода (включая границы:
- Начальные остатки: Виртуальная таблица
Оборотыс параметромАвтоУпорядочиваниеили при получении сальдо «Входящие» корректно учитывает начальные остатки. ТаблицаПроводки, нет‚ она показывает только записи текущего периода. - Производительность: Избегайте запросов к
Проводкибез отбора поРегистраторилиПериодна больших базах. Всегда используйте отборы по измерениям (Счет‚ Субконто) во втором параметре виртуальной таблицы (УсловиеОтбораПоИзмерениям). - Мультивалютность: Поля
ВалютаиКурсзаполняются только если счет валютный. В суммах (Сумма) всегда хранится сумма в валюте учета (рубли)‚ а вСуммаВал— в валюте счета.
Пример универсальной функции для получения проводок документа
Функция ПолучитьПроводкиДокумента(РегистрБухгалтерии‚ Регистратор) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Проводки.НомерСтроки КАК НомерСтроки‚
| Проводки.СчетДт КАК СчетДт‚
| Проводки.СчетКт КАК СчетКт‚
| Проводки.Сумма КАК Сумма‚
| Проводки.Количество КАК Количество‚
| Проводки.Валюта КАК Валюта‚
| Проводки.Курс КАК Курс‚
| Проводки.СубконтоДт1 КАК СубконтоДт1‚
| Проводки.СубконтоДт2 КАК СубконтоДт2‚
| Проводки.СубконтоДт3 КАК СубконтоДт3‚
| Проводки.СубконтоКт1 КАК СубконтоКт1‚
| Проводки.СубконтоКт2 КАК СубконтоКт2‚
| Проводки.СубконтоКт3 КАК СубконтоКт3
|ИЗ
| РегистрБухгалтерии." + РегистрБухгалтерии.Имя + ".Проводки КАК Проводки
|ГДЕ
| Проводки.Регистратор = &Регистратор";
Запрос.УстановитьПараметр("Регистратор"‚ Регистратор);
Возврат Запрос.Выполнить.Выгрузить; // Возвращаем ТаблицуЗначений для удобства
КонецФункции
// Использование:
ТаблицаПроводок = ПолучитьПроводкиДокумента(РегистрыБухгалтерии.Хозрасчетный‚ ДокументСсылка);
Для Каждого Стр Из ТаблицаПроводок Цикл
// Стр.СчетДт‚ Стр.СубконтоДт1 и т.д.
КонецЦикла;
Получение проводок в 1С — задача стандартная‚ но требующая понимания архитектуры регистров бухгалтерии. Главные правила:
- Используйте виртуальные таблицы (
Проводки‚ОборотыДтКт‚Остатки)‚ а не физические. - Всегда ставьте отборы по измерениям (Счет‚ Субконто‚ Регистратор‚ Период) в параметрах виртуальной таблицы — это ключ к производительности.
- Учитывайте тип регистра (Двойная запись vs Однонаправленные) при написании полей выборки (СчетДт/СчетКт vs Счет/ВидДвижения).
- Для отчетов используйте
ОборотыДтКт‚ для детального разбора документа,Проводки.
Соблюдение этих принципов позволит писать быстрые‚ надежные и поддерживаемые запросы к бухгалтерским данным.