A1sCode библиотека 1С

A1sQ.CountQ

Назначение: получить число строк «в одно действие».
Два сценария:
  • передали имя таблицы + опциональное условие → функция сама соберёт ВЫБРАТЬ КОЛИЧЕСТВО(*);
  • передали текст запроса (начинается с «ВЫБРАТЬ») → выполнит его как есть и возьмёт значение из [0,0].

Сигнатура

Function CountQ(QueryText,
                Condition = "",
                Value1 = Undefined, Value2 = Undefined, Value3 = Undefined, Value4 = Undefined,
                Value5 = Undefined, Value6 = Undefined, Value7 = Undefined, Value8 = Undefined) Export

Как работает (по исходнику)

FinalQueryText = QueryText;

// Если это не SELECT, а простое имя таблицы — соберём запрос через QT()
If StrFind(Upper(QueryText), "ВЫБРАТЬ") = 0 Then
    FinalQueryText = QT("КОЛИЧЕСТВО(*)", QueryText, Condition);
EndIf;

// Выполним и вернём первую ячейку, по умолчанию 0
Return ValueQ(FinalQueryText, 0, Value1, Value2, Value3, Value4, Value5, Value6, Value7, Value8);
QT() — это хелпер, который формирует строку запроса вида "ВЫБРАТЬ <Что> ИЗ <Откуда> [ГДЕ <Условие>]". Здесь он используется как QT("КОЛИЧЕСТВО(*)", Таблица, Условие).

Параметры

  • QueryText — либо имя таблицы (например, "Справочник.Номенклатура"), либо текст SELECT.
  • Condition — строка условия для варианта с именем таблицы (вставляется после ГДЕ как есть).
  • Value1..Value8 — значения параметров для запроса (если они используются в тексте).

Возвращает

Число — результат КОЛИЧЕСТВО(*) или значения [0,0] пользовательского SELECT.
При ошибке выполнения/ошибке синтаксиса ValueQ вернёт 0 (и запишет ошибку в лог).

Примеры

1) Считать активные элементы справочника

N = A1sQ.CountQ("Справочник.Номенклатура", "НЕ ПометкаУдаления");

2) С условием по периоду

N = A1sQ.CountQ("Документ.ПоступлениеТоваровУслуг",
                "Дата МЕЖДУ &D1 И &D2",
                НачалоПериода, КонецПериода);

3) Передать готовый SELECT

N = A1sQ.CountQ("ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ Справочник.Пользователи ГДЕ НЕ Заблокирован");

Нюансы и ограничения

✅ Удобно: имя таблицы → авто‑COUNT(*)
✅ Безопасно: ошибки → 0 (через ValueQ c Try/Except)
❗ При передаче «готового SELECT» ответственность за корректность лежит на вас — функция просто берёт [0,0]
❗ Строка Condition не экранируется — используйте параметры (&Param), а значения передавайте через аргументы Value1..Value8
❗ Если нужно лишь проверить наличие, используйте ExistsQ — быстрее благодаря «ПЕРВЫЕ 1»
  • ValueQ — получить [0,0] с дефолтом при ошибке.
  • ExistsQ — проверка существования строк (быстрее для булевой проверки).
  • QT — формирование простых SELECT‑ов из частей.
  • IsEmptyResult / IsNotEmptyResult — альтернативные проверки результата.