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