Подсчёт количества — одна из самых частых задач при работе с 1С:Предприятие.hether вы бухгалтер, который проверяет количество документов за месяц, кладовщик, инвентаризирующий товары, или программист, оптимизирующий отчёты — умение быстро и правильно посчитать строки, записи или элементы справочников сэкономит часы работы. В этой статье разберём 5 основных способов подсчёта в 1С: от ручных методов для пользователей до программных решений для разработчиков.
Важно понимать, что инструменты подсчёта зависят от конкретной задачи. Например, количество строк в табличной части документа считается иначе, чем число уникальных контрагентов в базе за год. Мы рассмотрим:
- 📊 Встроенные функции платформы (например,
Количество()) - 🔍 Запросы на языке 1С (с группировкой и условиями)
- 📑 Отчёты и обработки (включая стандартные и кастомизированные)
- 🖥️ Программные методы для разработчиков (циклы, коллекции)
- ⚠️ Типичные ошибки и как их избежать
Все примеры приведены для актуальных версий 1С:Предприятие 8.3 (включая последние релизы 2026 года). Если вы работаете со старой конфигурацией (например, 7.7), некоторые методы могут не поддерживаться — уточняйте синтаксис в документации вашей версии.
1. Подсчёт количества строк в табличных частях документов
Самая простая задача — узнать, сколько строк в табличной части документа (например, Товары в Реализации товаров и услуг). Здесь не нужны запросы или программирование: платформа предоставляет готовые методы.
Чтобы посчитать строки в открытом документе:
- Откройте документ (например,
Поступление товаров). - Перейдите на вкладку с табличной частью (например,
Товары). - Внизу таблицы вы увидите строку состояния с надписью «Итого: N», где
N— количество строк.
Если нужно получить это значение программно (например, для проверки в обработке), используйте свойство Количество():
КоличествоСтрок = ДокументОбъект.Товары.Количество();
⚠️ Внимание: СвойствоКоличество()возвращает физическое число строк, включая пустые. Если вам нужны только заполненные строки, добавьте проверку на пустые значения:КоличествоЗаполненныхСтрок = 0;Для Каждого Строка Из ДокументОбъект.Товары Цикл
Если НЕ ПустаяСтрока(Строка.Номенклатура) Тогда
КоличествоЗаполненныхСтрок = КоличествоЗаполненныхСтрок + 1;
КонецЕсли;
КонецЦикла;
Для быстрого подсчёта в пользовательском режиме можно использовать контекстное меню табличной части: правая кнопка мыши →
Итоги→Количество.☑️ Проверка количества строк в документе
Выполнено: 0 / 42. Использование функции Количество() для справочников и регистров
Функция
Количество()работает не только с табличными частями, но и со справочниками, регистрами и другими объектами метаданных. Синтаксис зависит от контекста:
Объект Пример кода Что считает Справочник Количество = Справочник.Номенклатура.Количество();Все элементы справочника, включая группы Регистр сведений Количество = РегистрыСведений.ЦеныНоменклатуры.Количество();Все записи регистра (может быть ресурсоёмко!) Документ (выборка) Количество = Документы.ПоступлениеТоваров.Выбрать().Количество();Количество документов за весь период Таблица значений Количество = МояТаблица.Количество();Количество строк в таблице значений Важный нюанс: для больших справочников (например, Номенклатура с 50 000 позиций) вызов
Количество()может занять несколько секунд. В таких случаях лучше использовать запросы (раздел 3).Пример с фильтром (подсчёт только активных номенклатурных позиций):
Запрос = Новый Запрос;Запрос.Текст =
"ВЫБРАТЬ КОЛИЧЕСТВО(RAZNOST) КАК КоличествоАктивных
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ПометкаУдаления = ЛОЖЬ
И Номенклатура.ЭтоГруппа = ЛОЖЬ";
Результат = Запрос.Выполнить();
КоличествоАктивных = Результат.Выбрать().Следующий().КоличествоАктивных;
⚠️ Внимание: Если вы работаете с распределённой базой данных (РИБ), функцияКоличество()может возвращать неактуальные данные до синхронизации. В таких случаях используйте управляемые блокировки или запросы с явным указанием узла РИБ.3. Подсчёт с помощью запросов (самый гибкий метод)
Запросы — самый мощный инструмент для подсчёта в 1С. Они позволяют:
- 🔹 Считать с условиями (по дате, контрагенту, статусу)
- 🔹 Группировать данные (например, количество документов по месяцам)
- 🔹 Объединять несколько таблиц (связи
СОЕДИНИТЬ)- 🔹 Оптимизировать производительность (индексы, временные таблицы)
Базовый синтаксис для подсчёта:
ВЫБРАТЬКОЛИЧЕСТВО(*) КАК ОбщееКоличество
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
Примеры практических запросов:
Запрос
Количество документов за текущий месяц:ВЫБРАТЬ
КОЛИЧЕСТВО(*) КАК КоличествоДокументов
ИЗ
Документ.ПоступлениеТоваров КАК Поступление
ГДЕ
МЕСЯЦ(Поступление.Дата) = МЕСЯЦ(&ТекущаяДата)
И ГОД(Поступление.Дата) = ГОД(&ТекущаяДата)
Запрос с группировкой (количество документов по контрагентам):
ВЫБРАТЬРеализация.Контрагент КАК Контрагент,
КОЛИЧЕСТВО(*) КАК КоличествоДокументов
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
Реализация.Контрагент
Запрос сjoin условием (количество номенклатуры в остатках):
ВЫБРАТЬОстаткиТоваров.Номенклатура КАК Номенклатура,
СУММА(ОстаткиТоваров.КоличествоОстатков) КАК Остаток
ИЗ
РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров
ГДЕ
ОстаткиТоваров.КоличествоОстатков > 0
⚠️ Внимание: При работе с большими выборками (более 100 000 строк) избегайте конструкцииКОЛИЧЕСТВО(*)без условий. Это может заблокировать базу. Используйте фильтры по дате или другим индексированным полям.Для ускорения запросов добавляйте условие по периоду, даже если вам нужны "все данные". Например, вместо
ГДЕ ИСТИНАиспользуйтеГДЕ Дата > '01.01.2000'— это заставит СУБД использовать индексы.4. Стандартные отчёты 1С для подсчёта
Если вы не программист, многие задачи по подсчёту можно решить с помощью встроенных отчётов. Они уже оптимизированы и учитывают особенности конфигурации.
Где искать:
- 📌 Отчёты по продажам/закупкам:
Отчёты → Продажи → Анализ продаж(количество документов, строк, сумм)- 📌 Остатки товаров:
Отчёты → Склад → Остатки товаров(количество номенклатуры в остатках)- 📌 Ведомость по документам:
Отчёты → Ведомость по документам(количество документов по типам)- 📌 Анализ субконто: для подсчёта записей по регистрам бухгалтерии
Пример: чтобы посчитать количество реализаций за квартал:
- Перейдите в
Отчёты → Продажи → Ведомость по реализациям.- Установите период (например,
01.01.2026 — 31.03.2026).- В настройках отчёта добавьте группировку по
Тип документа.- В результатах будет колонка «Кол.» с количеством документов.
Для бухгалтерских задач (например, количество проводок по счёту) используйте отчёт
Оборотно-сальдовая ведомостьс детализацией по субконто.⚠️ Внимание: В некоторых конфигурациях (например, 1С:Бухгалтерия 3.0) стандартные отчёты могут не показывать количество строк, а только суммы. В этом случае добавьте в настройки отчёта колонкуКоличествоили используйте запрос (раздел 3).5. Программный подсчёт в циклах (для разработчиков)
Если вам нужно посчитать количество элементов с дополнительной логикой (например, только те, что удовлетворяют сложному условию), используйте циклы.
Примеры:
1. Подсчёт элементов справочника с проверкой:
Количество = 0;Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.ЭтоГруппа = ЛОЖЬ И Выборка.Артикул <> "" Тогда
Количество = Количество + 1;
КонецЕсли;
КонецЦикла;
2. Подсчёт уникальных значений в таблице:
УникальныеКонтрагенты = Новый Массив;Для Каждого Строка Из МояТаблица Цикл
Если НЕ УникальныеКонтрагенты.Найти(Строка.Контрагент) Тогда
УникальныеКонтрагенты.Добавить(Строка.Контрагент);
КонецЕсли;
КонецЦикла;
КоличествоУникальных = УникальныеКонтрагенты.Количество();
3. Рекурсивный подсчёт элементов в иерархическом справочнике:
Функция ПодсчитатьЭлементыВГруппе(Группа)Количество = 0;
Выборка = Справочники.Номенклатура.Выбрать(Группа);
Пока Выборка.Следующий() Цикл
Если Выборка.ЭтоГруппа Тогда
Количество = Количество + ПодсчитатьЭлементыВГруппе(Выборка.Ссылка);
Иначе
Количество = Количество + 1;
КонецЕсли;
КонецЦикла;
Возврат Количество;
КонецФункции;
Для больших массивов данных (более 10 000 элементов) циклы могут работать медленно. В таких случаях:
- 🔹 Используйте запросы (раздел 3).
- 🔹 Применяйте промежуточные таблицы для хранения результатов.
- 🔹 Разбивайте обработку на пакеты (например, по 1000 элементов).
⚠️ Внимание: При работе с транзакциями не выполняйте длительные подсчёты в циклах внутри транзакции — это может заблокировать другие сеансы. Выносите такие операции за пределы транзакций или используйтеПопытка...Исключениедля обработки таймаутов.Циклы удобны для сложной логики, но для простого подсчёта лучше использовать запросы или встроенные функции — они работают быстрее и не блокируют базу.
6. Типичные ошибки и как их избежать
Даже опытные пользователи и разработчики допускают ошибки при подсчёте в 1С. Вот самые распространённые:
Ошибка Причина Как избежать Подсчёт с учётом пометок удаления Функция Количество()считает все элементы, включая помеченные на удаление.Добавляйте условие ПометкаУдаления = ЛОЖЬ.Игнорирование прав доступа Пользователь не видит все данные, но запрос возвращает общее количество. Используйте ПраваДоступаили проверяйте видимость данных.Забытые группировки в запросах Запрос с КОЛИЧЕСТВОбезСГРУППИРОВАТЬ ПОвернёт одно значение для всей выборки.Всегда проверяйте структуру запроса. Подсчёт в транзакции Длительный подсчёт блокирует таблицы, вызывая таймауты у других пользователей. Выносите подсчёт за пределы транзакций или используйте УровеньИзоляции.Неучтённые пустые строки Табличные части могут содержать пустые строки, которые тоже считаются. Добавляйте проверку на ПустаяСтрока()илиЗначениеЗаполнено().Критическая ошибка: использование
КОЛИЧЕСТВО(DISTINCT)без индексов. В больших базах это может занять часы. Всегда проверяйте, есть ли индекс на поле, по которому считаете уникальные значения.Пример неправильного запроса (долго выполняется):
ВЫБРАТЬКОЛИЧЕСТВО(RAZNOST(Контрагент)) КАК УникальныеКонтрагенты
ИЗ
Документ.РеализацияТоваровУслуг
Исправленный вариант (с условием по дате для использования индекса):
ВЫБРАТЬКОЛИЧЕСТВО(RAZNOST(Контрагент)) КАК УникальныеКонтрагенты
ИЗ
Документ.РеализацияТоваровУслуг
ГДЕ
Дата > '01.01.2023'
7. Автоматизация подсчёта: обработки и регламентные задания
Если подсчёт нужно выполнять регулярно (например, ежедневно считать количество новых заказов), автоматизируйте процесс:
1. Создание обработки:
- 🔧 Используйте конструктор обработок для визуального создания формы.
- 🔧 Добавьте кнопку
Подсчитатьс кодом из разделов 3 или 5.- 🔧 Сохраните обработку в базу или как внешний файл (
.epf).2. Регламентные задания:
- 🕒 Настройте автоматический запуск подсчёта по расписанию (
Администрирование → Регламентные задания).- 📊 Результаты можно сохранять в регистр сведений для истории.
- 📧 Настройте оповещения по email при превышении пороговых значений.
Пример кода для регламентного задания (подсчёт новых клиентов за день):
Процедура Выполнить() ЭкспортЗапрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ КОЛИЧЕСТВО(RAZNOST(Контрагент)) КАК НовыеКлиенты
ИЗ Документ.ЗаказКлиента
ГДЕ Дата = &ТекущаяДата";
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
Результат = Запрос.Выполнить().Выбрать().Следующий().НовыеКлиенты;
// Сохранение результата в регистр
Запись = РегистрыСведений.СтатистикаКлиентов.СоздатьМенеджерЗаписи();
Запись.Дата = ТекущаяДата();
Запись.Количество = Результат;
Запись.Записать();
// Оповещение
Если Результат > 10 Тогда
ОтправитьEmail("admin@company.ru", "Новые клиенты", "Зарегистрировано " + Результат + " новых клиентов");
КонецЕсли;
КонецПроцедуры
Для отображения результатов пользователям можно создать дашборд на основе регистра сведений или использовать 1С:Drive для визуализации данных.
⚠️ Внимание: При настройке регламентных заданий учитывайте нагрузку на сервер. Если подсчёт занимает более 5 минут, разбейте задачу на части или перенесите её на ночное время.FAQ: Частые вопросы по подсчёту в 1С
Как посчитать количество уникальных значений в таблице?
Используйте запрос с
КОЛИЧЕСТВО(RAZNOST):ВЫБРАТЬКОЛИЧЕСТВО(RAZNOST(Поле)) КАК УникальныеЗначения
ИЗ
ВашаТаблица
Для больших таблиц добавьте условие по индексированному полю (например, дате), чтобы ускорить выполнение.
Почему функция Количество() возвращает неверное значение?
Вероятные причины:
- 🔸 Учтёны помеченные на удаление элементы (добавьте фильтр
ПометкаУдаления = ЛОЖЬ).- 🔸 Не обновлён кэш метаданных (перезапустите 1С или обновите конфигурацию).
- 🔸 Работаете с подчинённым справочником (например, Номенклатура в Управлении торговлей), где есть дополнительные фильтры.
Проверьте запросом:
ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ Справочник.ВашСправочникКак посчитать количество документов по дням недели?
Используйте запрос с группировкой по
ДЕНЬНЕДЕЛИ():ВЫБРАТЬДЕНЬНЕДЕЛИ(Дата) КАК ДеньНедели,
КОЛИЧЕСТВО(*) КАК КоличествоДокументов
ИЗ
Документ.ВашДокумент
ГДЕ
Дата МЕЖДУ &Начало И &Конец
СГРУППИРОВАТЬ ПО
ДЕНЬНЕДЕЛИ(Дата)
Для русскоязычных названий дней используйте
ВЫРАЗИТЬ(ДЕНЬНЕДЕЛИ(Дата) КАК Строка).Можно ли посчитать количество без программирования?
Да, используйте:
- 📄 Стандартные отчёты (раздел 4).
- 🔍 Расширенный фильтр в списках документов (кнопка
Ещё → Фильтр).- 📊 Сводные таблицы в 1С:Аналитике (если подключена).
Для Управления торговлей 11 и ERP 2 есть встроенные дашборды с виджетом «Количество документов».
Как ускорить подсчёт в большой базе (100 000+ записей)?
Рекомендации:
- 🚀 Используйте индексированные поля в условиях (
Дата,Ссылка).- 🚀 Заменяйте циклы на запросы.
- 🚀 Разбивайте данные на периоды (например, считайте помесячно).
- 🚀 Используйте временные таблицы для промежуточных результатов.
- 🚀 Настройте сервер 1С на оптимальное использование памяти (параметр
/MemLimitвragent.conf).Для критичных задач рассмотрите вынос исторических данных в архивную базу.