Получение оборотов по регистру накопления в 1С:Предприятие — одна из самых востребованных задач как для бухгалтеров, так и для программистов. Эти данные нужны для анализа движения товаров, расчета остатков, формирования отчетности и проверки корректности учета. Однако не все пользователи знают, что существует как минимум 5 различных способов извлечь эти данные — от стандартных отчетов до сложных программных конструкций.
В этой статье мы разберем каждый метод подробно: когда какой уместно использовать, какие есть подводные камни, и как избежать типичных ошибок. Особое внимание уделим запросам на языке 1С и программному коду, так как они дают максимальную гибкость. Если вы работаете с 1С:Бухгалтерия 3.0, 1С:Управление торговлей 11 или 1С:ERP — инструкция подойдет для всех этих конфигураций с минимальными адаптациями.
Для новичков мы начнем с простых способов через интерфейс, а для опытных пользователей приведём примеры кода с комментариями. Также в статье есть уникальная таблица соответствия методов и типичных задач, которая поможет выбрать оптимальный подход под вашу ситуацию.
1. Стандартные отчеты 1С: быстрый способ без программирования
Самый простой метод — использовать встроенные отчеты конфигурации. Почти все типовые решения 1С содержат отчеты, которые автоматически формируют обороты по регистрам накопления. Например, в 1С:Бухгалтерия 3.0 это отчет Анализ субконто, а в 1С:Управление торговлей — Ведомость по товарам.
Чтобы получить обороты через стандартный отчет:
- 📊 Откройте раздел
Отчетыв главном меню вашей конфигурации. - 🔍 Найдите отчет, связанный с нужным регистром (например,
Обороты по складамдля регистраТоварыНаСкладах). - ⚙️ В настройках отчета укажите период, организацию и другие фильтры.
- 📤 Сформируйте отчет и при необходимости экспортируйте в Excel или PDF.
Преимущество этого метода — скорость и отсутствие необходимости в знаниях программирования. Однако стандартные отчеты часто не дают детализации по всем измерениям регистра или требуют дополнительной настройки. Если вам нужно получить обороты по нестандартному набору полей — придется использовать другие способы.
⚠️ Внимание: В некоторых конфигурациях (например, 1С:ERP 2.5) названия отчетов могут отличаться. Если не находите нужный отчет — проверьте разделВсе функции(клавишаF1→ поиск по ключевому слову, например, "обороты").
2. Консоль запросов: универсальный инструмент для любых регистров
Если стандартные отчеты не подходят, следующий шаг — использование консоли запросов. Этот инструмент доступен во всех конфигурациях 1С и позволяет писать запросы на встроенном языке, похожем на SQL. С его помощью можно получить обороты по любому регистру накопления с любой детализацией.
Пример запроса для получения оборотов по регистру ТоварыНаСкладах за месяц:
ВЫБРАТЬ
Товар КАК Товар,
Склад КАК Склад,
СУММА(Количество) КАК КоличествоПриход,
СУММА(Количество) КАК КоличествоРасход
ИЗ
РегистрНакопления.ТоварыНаСкладах.Обороты(
&НачалоПериода,
&КонецПериода,
,
Товар, Склад
)
ГДЕ
Товар В (&СписокТоваров)
СГРУППИРОВАТЬ ПО
Товар,
Склад
Чтобы выполнить этот запрос:
- Откройте консоль запросов через меню
Все функции(или нажмитеCtrl+Shift+Qв некоторых конфигурациях). - Вставьте текст запроса и настройте параметры (
&НачалоПериода,&КонецПериода,&СписокТоваров). - Нажмите
Выполнитьи проанализируйте результат.
Консоль запросов дает полный контроль над данными, но требует знания синтаксиса. Если вы никогда не писали запросы в 1С — рекомендуем начать с простых примеров и постепенно усложнять их. Для обучения можно использовать встроенную справку (F1) или официальную документацию по языку запросов.
Сохраняйте часто используемые запросы в текстовые файлы или в модуль внешней обработки. Это сэкономит время при повторном использовании.
3. Программный код: максимальная гибкость для разработчиков
Для программистов 1С самый мощный способ — получение оборотов через встроенный язык. Это позволяет не только извлечь данные, но и обработать их непосредственно в коде, например, для автоматического формирования отчетов или проверки учета.
Пример кода для получения оборотов по регистру ТоварыНаСкладах:
Процедура ПолучитьОборотыПоТоварам()
НачалоПериода = НачалоМесяца(ТекущаяДата());
КонецПериода = КонецМесяца(ТекущаяДата());
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОбороты.Товар КАК Товар,
| ТоварыНаСкладахОбороты.Склад КАК Склад,
| СУММА(ТоварыНаСкладахОбороты.КоличествоПриход) КАК Приход,
| СУММА(ТоварыНаСкладахОбороты.КоличествоРасход) КАК Расход
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Обороты(
| &НачалоПериода,
| &КонецПериода,
| ,
| Товар, Склад
| ) КАК ТоварыНаСкладахОбороты
|ГДЕ
| ТоварыНаСкладахОбороты.Склад В (&СписокСкладов)
|СГРУППИРОВАТЬ ПО
| ТоварыНаСкладахОбороты.Товар,
| ТоварыНаСкладахОбороты.Склад";
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
СписокСкладов = Новый Массив;
СписокСкладов.Добавить(Справочники.Склады.ОсновнойСклад);
Запрос.УстановитьПараметр("СписокСкладов", СписокСкладов);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(СтрШаблон("Товар: %1, Склад: %2, Приход: %3, Расход: %4",
Выборка.Товар, Выборка.Склад, Выборка.Приход, Выборка.Расход));
КонецЦикла;
КонецПроцедуры
Этот код можно вставить в любой модуль (например, в модуль объекта или внешней обработки). Преимущества программного подхода:
- 🔧 Полный контроль над логикой обработки данных.
- 📊 Возможность интеграции с другими механизмами 1С (например, отправка результатов по email).
- 🔄 Автоматизация рутинных операций (например, ежемесячное формирование отчета).
Однако для новичков этот метод может показаться сложным. Если вы не уверены в своих навыках программирования — начните с консоли запросов или стандартных отчетов.
Как оптимизировать запрос для больших объемов данных?
Для ускорения работы с большими регистрами (например, с миллионами записей) используйте:
1. Индексы — убедитесь, что в регистре настроены индексы по измерениям, которые вы используете в WHERE.
2. Виртуальные таблицы — вместо полного перебора данных используйте виртуальные таблицы оборотов (как в примере выше).
3. Пакетную обработку — если нужно обработать данные за большой период, разбейте запрос на несколько более коротких интервалов.
4. Внешние обработки и отчеты: готовые решения от сообщества
Если вам нужно быстро получить обороты без глубокого погружения в программирование — обратите внимание на внешние обработки. Многие разработчики и энтузиасты 1С выкладывают готовые решения для типичных задач.
Где искать внешние обработки:
- 🌐 Infostart — крупнейший портал с бесплатными и платными обработками.
- 📦 Пortal ITS — официальные и партнерские решения от 1С.
- 💬 Сообщества в Telegram или VK (например, "1С Программисты").
Пример популярных обработок для оборотов:
| Название обработки | Назначение | Поддерживаемые конфигурации |
|---|---|---|
| Универсальный отчет по регистрам накопления | Позволяет получить обороты и остатки по любому регистру с гибкой настройкой отбора | 1С:Бухгалтерия, УТ 11, ERP 2 |
| Анализ движений документа | Показывает, какие документы сформировали обороты по регистру | Любые конфигурации на базе 1С:Предприятие 8.3 |
| Сверка регистров накопления | Сравнивает обороты между двумя регистрами или периодами | 1С:Управление торговлей, ERP |
Преимущества внешних обработок:
- ⚡ Быстрое решение без написания кода.
- 🔧 Часто содержат дополнительные функции (экспорт в Excel, графики, сравнение периодов).
- 📱 Можно адаптировать под свои нужды (если есть исходный код).
⚠️ Внимание: Перед использованием внешней обработки проверьте её на тестовой базе. Некоторые решения могут содержать ошибки или конфликтовать с вашей конфигурацией. Также обращайте внимание на лицензию — некоторые обработки распространяются платно.
5. Прямой доступ к базе данных: SQL для опытных пользователей
Для администраторов и разработчиков, работающих с 1С на SQL-сервере (например, Microsoft SQL Server или PostgreSQL), есть возможность получить обороты напрямую из базы данных. Этот метод самый быстрый, но требует знаний SQL и прав доступа к серверу.
Пример SQL-запроса для получения оборотов по регистру ТоварыНаСкладах:
SELECT
T1._Fld1234 AS Товар, -- Замените на реальный ID поля "Товар"
T1._Fld5678 AS Склад, -- Замените на реальный ID поля "Склад"
SUM(CASE WHEN T1._RecKind = 1 THEN T1._Fld9101 ELSE 0 END) AS Приход,
SUM(CASE WHEN T1._RecKind = 2 THEN T1._Fld9101 ELSE 0 END) AS Расход
FROM
_AccumRg1234 T1 -- _AccumRg{ID регистра} - таблица регистра
WHERE
T1._Period BETWEEN '2026-01-01' AND '2026-01-31'
GROUP BY
T1._Fld1234, T1._Fld5678
Чтобы выполнить этот запрос:
- Подключитесь к базе данных 1С через SQL Server Management Studio или pgAdmin.
- Найдите таблицу регистра накопления (имя начинается с
_AccumRg, заканчивается ID регистра). - Замените псевдонимы полей (
_Fld1234) на реальные идентификаторы из вашей базы. - Выполните запрос и экспортируйте результаты.
Предупреждения при работе с SQL:
- 🔐 Никогда не изменяйте данные напрямую в таблицах 1С — это может нарушить целостность базы.
- 📊 Структура таблиц может меняться при обновлении конфигурации.
- 🔄 После прямых запросов рекомендуется выполнить
Тестирование и исправлениебазы в 1С.
⚠️ Внимание: Прямой доступ к базе данных может нарушать условия лицензионного соглашения 1С. Используйте этот метод только если вы администратор системы и понимаете риски.
6. Типичные ошибки и как их избежать
При работе с оборотами по регистрам накопления даже опытные пользователи допускают ошибки. Вот самые распространённые из них и способы их предотвращения:
| Ошибка | Причина | Как избежать |
|---|---|---|
| Некорректные остатки на конец периода | Не учтены движения документов за текущий день | Используйте функцию КонецДня() вместо ТекущаяДата() в запросах |
| Пустой результат запроса | Неверно указаны параметры виртуальной таблицы (например, перепутаны приход/расход) | Проверьте синтаксис виртуальной таблицы в документации |
| Долгое выполнение запроса | Отсутствуют индексы по измерениям регистра или запрос слишком широкий | Добавьте индексы или разбейте запрос на более мелкие периоды |
| Разница между отчетом и запросом | В отчете используются дополнительные фильтры или группировки | Сравните настройки отчета и текст запроса |
Ещё несколько советов для избежания ошибок:
- 🔍 Всегда проверяйте период в запросе — даже один лишний день может исказить результаты.
- 📋 Если используете
СУММА— убедитесь, что суммируете правильный ресурс (например,Количество, а неСумма). - 🔄 При работе с большими регистрами тестируйте запросы на тестовой базе.
☑️ Проверка корректности оборотов
Сравнение методов: какой выбрать?
Чтобы помочь вам определиться с оптимальным способом получения оборотов, мы составили таблицу соответствия методов и типичных задач:
| Задача | Стандартный отчет | Консоль запросов | Программный код | Внешняя обработка | SQL-запрос |
|---|---|---|---|---|---|
| Быстро получить обороты по стандартному регистру | ✅ | ⚠️ | ❌ | ❌ | ❌ |
| Получить обороты с нестандартной детализацией | ❌ | ✅ | ✅ | ✅ | ✅ |
| Автоматизировать формирование отчета | ❌ | ❌ | ✅ | ⚠️ | ❌ |
| Проанализировать большие объемы данных | ❌ | ⚠️ | ✅ | ✅ | ✅ |
| Нужен экспорт в Excel с форматированием | ⚠️ | ❌ | ✅ | ✅ | ❌ |
Легенда:
- ✅ — оптимальный метод
- ⚠️ — возможен, но с ограничениями
- ❌ — не подходит
Если вы не уверены, какой метод выбрать — начните с консоли запросов. Она дает хороший баланс между гибкостью и простотой. Для разовых задач подойдут стандартные отчеты, а для автоматизации — программный код.
Для большинства бухгалтерских задач достаточно стандартных отчетов или консоли запросов. Программный код и SQL нужны только для сложных или нестандартных сценариев.
FAQ: Ответы на частые вопросы
Как узнать имя регистра накопления для запроса?
Имя регистра можно посмотреть в конфигураторе (Конфигуратор → Объекты конфигурации → Регистры накопления) или через меню Все функции (в пользовательском режиме). Также имя регистра часто отображается в подсказках при наборе текста запроса в консоли.
Почему в запросе обороты не совпадают с отчетом?
Наиболее частые причины:
- В запросе не учтены все измерения регистра (например, забыли указать
Организация). - В отчете применяются дополнительные фильтры (например, по валюте или подразделению).
- Разные периоды: в отчете может быть установлен другой интервал дат.
Чтобы найти разницу, сравните текст запроса отчета (можно посмотреть через Все действия → Изменить вариант отчета → Запрос) с вашим запросом.
Можно ли получить обороты по регистру накопления в разрезе документов?
Да, для этого нужно использовать виртуальную таблицу РегистрНакопления.ИмяРегистра.ОборотыИОстатки или РегистрНакопления.ИмяРегистра.ОборотыСДетками. Пример:
ВЫБРАТЬ
ТоварыНаСкладахОбороты.Регистратор КАК Документ,
ТоварыНаСкладахОбороты.Товар КАК Товар,
СУММА(ТоварыНаСкладахОбороты.Количество) КАК Количество
ИЗ
РегистрНакопления.ТоварыНаСкладах.Обороты(
&НачалоПериода,
&КонецПериода,
Документ,
Товар
) КАК ТоварыНаСкладахОбороты
ГДЕ
ТоварыНаСкладахОбороты.Регистратор = &НужныйДокумент
СГРУППИРОВАТЬ ПО
ТоварыНаСкладахОбороты.Регистратор,
ТоварыНаСкладахОбороты.Товар
Как ускорить запрос по большому регистру накопления?
Скорость выполнения запроса зависит от нескольких факторов:
- 📌 Индексы: Убедитесь, что в регистре настроены индексы по тем измерениям, которые вы используете в условии
ГДЕ. - 📅 Период: Разбейте большой период на более мелкие интервалы (например, помесячно).
- 🔍 Фильтры: Максимально сузьте выборку с помощью параметров (например, по конкретному складу или номенклатуре).
- 🖥️ Аппаратные ресурсы: Если запрос выполняется на сервере 1С, убедитесь, что у него достаточно оперативной памяти.
Также можно использовать ПЛАН ВЫПОЛНЕНИЯ для анализа узких мест:
ОБЪЯСНИТЬ
ВЫБРАТЬ ...
ИЗ РегистрНакопления.ИмяРегистра.Обороты(...)
Можно ли получить обороты по регистру накопления в 1С:Зарплата и Управление Персоналом?
Да, принципы те же, но регистры будут другими. Например, для анализа начислений и удержаний используется регистр НачисленияУдержанияРасчеты. Пример запроса:
ВЫБРАТЬ
НачисленияОбороты.Сотрудник КАК Сотрудник,
НачисленияОбороты.ВидНачисления КАК ВидНачисления,
СУММА(НачисленияОбороты.Сумма) КАК Сумма
ИЗ
РегистрНакопления.НачисленияУдержанияРасчеты.Обороты(
&НачалоПериода,
&КонецПериода,
,
Сотрудник, ВидНачисления
) КАК НачисленияОбороты
ГДЕ
НачисленияОбороты.ВидНачисления = &НужныйВидНачисления
СГРУППИРОВАТЬ ПО
НачисленияОбороты.Сотрудник,
НачисленияОбороты.ВидНачисления
В 1С:ЗУП также есть стандартные отчеты, такие как Анализ начислений или Свод по зарплате, которые можно использовать вместо ручных запросов.