Планирование архитектуры информационной системы на платформе 1С:Предприятие требует глубокого понимания различий между типами регистров. Чаще всего разработчики сталкиваются с дилеммой: использовать регистр сведений или регистр накопления. Когда речь заходит об учете товарно-материальных ценностей, денежных средств или взаиморасчетов с контрагентами, без регистра накопления не обойтись.
Существует два основных вида таких регистров: остаточные и оборотные. Если для остаточных регистров система автоматически рассчитывает текущее состояние на любую дату, то оборотные регистры требуют особого подхода к настройке. Они предназначены для анализа активности за определенный период, а не просто для хранения конечного баланса.
В этом материале мы детально разберем процесс создания оборотного регистра накопления, специфику его измерений и особенностей написания кода для проведения документов. Вы узнаете, как правильно настроить структуру хранения данных, чтобы обеспечить высокую производительность выборки отчетов.
Отличия оборотного регистра от остаточного
Главное отличие заключается в том, какие данные система агрегирует при формировании виртуальных таблиц. В остаточном регистре (тип Остатки) 1С суммирует все приходы и расходы, чтобы показать, сколько осталось "на руках" на конкретную дату. В оборотном регистре (тип Обороты) акцент смещается на движение за период.
При создании такого объекта конфигурации вы получаете доступ к виртуальной таблице Обороты, которая позволяет быстро получать данные о приходе и расходе за выбранный интервал времени. Это критически важно для отчетов типа "Оборотно-сальдовая ведомость" или "Анализ продаж по менеджерам".
Использование оборотного типа имеет смысл, когда вам не так важен текущий остаток, как скорость получения данных о том, сколько товара было продано или закуплено за месяц. Однако стоит помнить, что для таких регистров таблица остатков не формируется автоматически.
⚠️ Внимание: Если вы выберете тип "Обороты", но в отчетах попытаетесь получить срез последних остатков, система выдаст ошибку или пустые значения. Для получения остатков по оборотному регистру придется писать сложные запросы с суммированием движений.
Если вам нужны и остатки, и обороты, рассмотрите возможность создания двух отдельных регистров или использования специализированных механизмов учета в типовых конфигурациях.
Настройка структуры регистра в конфигураторе
Процесс начинается в окне конфигуратора. Вам необходимо добавить новый объект метаданных, выбрав ветку "Регистры накопления". После создания объекта перейдите на вкладку "Данные". Здесь определяется вся логика хранения информации.
В поле "Вид регистра" необходимо жестко установить значение Обороты. Это фундаментальное свойство, которое нельзя изменить после сохранения конфигурации без удаления регистра и потери структуры. Далее следует определить состав измерений.
Измерения — это аналитические разрезы, по которым будет вестись учет. Например, для склада это могут быть "Номенклатура", "Склад" и "Организация". Каждое измерение должно иметь тип данных и длину. Не создавайте лишних измерений, так как это напрямую влияет на размер таблицы в базе данных SQL.
- 📊 Измерения определяют детализацию учета (кто, что, где).
- 💰 Ресурсы содержат количественные и суммовые показатели.
- 📅 Периодичность задает точность времени (до секунды, дня или месяца).
После измерений переходим к ресурсам. Именно здесь хранятся цифры. Для оборотного регистра важно правильно задать тип ресурса: количество, сумма или булево значение. Часто используется составной тип, например, Число(15, 2) для денежных сумм.
Конфигурирование движений и типов записей
Любой регистр накопления функционирует за счет движений. Движение — это запись о том, что произошло изменение состояния объекта. В оборотном регистре каждое движение имеет тип: Приход или Расход.
При написании кода в модуле документа вы должны явно указывать вид движения. Если документ отражает поступление товара, создается запись с видом Приход. Если это реализация — запись со видом Расход. Ошибка в указании вида движения приведет к искажению данных в отчетах.
Важно настроить реквизиты движений, если стандартных полей недостаточно. Например, вам может понадобиться хранить номер партии или ставку НДС непосредственно в движении регистра. Это делается на вкладке "Реквизиты" в форме редактирования регистра.
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = ДатаДокумента;
Движение.Сумма = СуммаТовара;
⚠️ Внимание: Никогда не меняйте тип движения у уже проведенной записи напрямую в базе данных. Это нарушит целостность учета. Для исправления ошибок используйте механизм сторнирования или создание корректирующего документа.
Особенности виртуальных таблиц и запросов
Основная сила регистров накопления раскрывается при использовании виртуальных таблиц в запросах. Для оборотного регистра основной таблицей является РегистрНакопления.ИмяРегистра.Обороты. Она позволяет получать агрегированные данные без ручного суммирования.
При формировании запроса вы можете использовать специальные параметры периода: НачалоПериода и КонецПериода. Система сама оптимизирует выборку, обращаясь только к нужным партиям данных. Это обеспечивает высокую скорость работы даже при миллионах записей.
Рассмотрим пример структуры выборки. Вы можете группировать данные по измерениям, получая итоговые обороты в разрезе каждого склада или контрагента. Синтаксис запроса 1С позволяет гибко управлять отбором.
| Параметр запроса | Описание | Пример использования |
|---|---|---|
| Период | Интервал времени для анализа | Между &ДатаНач и &ДатаКон |
| ВидДвижения | Фильтр по приходу или расходу | ГДЕ ВидДвижения = Приход |
| Измерения | Поля для группировки | ПО Склад, Номенклатура |
| Ресурсы | Суммируемые поля | СУММА(Количество), СУММА(Сумма) |
Оптимизация запросов к виртуальным таблицам
При использовании виртуальной таблицы Обороты система 1С автоматически использует индексы по полям периода и измерений. Не пытайтесь вручную оптимизировать такой запрос через временные таблицы, если нет специфических требований к производительности.
Проведение документов и запись движений
Самый ответственный этап — написание кода в модуле объекта документа. Процедура ОбработкаПроведения должна содержать логику формирования набора записей. Сначала необходимо очистить старые движения этого документа, чтобы избежать дублирования при перепроведении.
Затем создается новый набор записей. Для каждого элемента табличной части документа создается соответствующая запись в регистре. Важно следить за соответствием типов данных: нельзя записать строку в числовое поле ресурса.
Код должен быть устойчив к изменениям. Используйте константы или общие модули для получения ссылок на элементы справочников, если они жестко заданы логикой. Однако лучше ссылаться на объекты метаданных, а не на конкретные UUID.
- 🗑️ Обязательно удаляйте старые движения перед записью новых.
- ✅ Проверяйте заполненность всех обязательных полей перед записью.
- 🔄 Обеспечьте возможность отмены проведения (обработка удаления).
После формирования всех записей вызывается метод Записать(). Именно в этот момент данные физически попадают в таблицу базы данных. Если в процессе возникнет ошибка транзакции, все изменения будут отменены.
☑️ Проверка перед записью движений
Анализ данных и типичные ошибки
После внедрения регистра необходимо протестировать его работу. Создайте тестовые документы, проведите их и сформируйте отчет по виртуальной таблице. Сравните полученные цифры с первичными документами.
Частой ошибкой является неправильная настройка периодичности. Если вы выбрали периодичность "Месяц", а документы проводятся с точностью до минуты, данные могут агрегироваться некорректно для внутридневных отчетов. Для оперативного учета всегда используйте периодичность В пределах секунды.
Еще одна проблема — дублирование записей. Это происходит, если в обработке проведения забыли вызвать метод очистки набора записей. В результате при каждом перепроведении документа обороты будут удваиваться, что приведет к катастрофическим искажениям в учете.
⚠️ Внимание: Интерфейс и возможности платформы 1С могут обновляться. Всегда сверяйте синтаксис методов работы с регистрами в официальной документации для вашей версии платформы (8.3.x), так как некоторые устаревшие методы могут быть помечены как нерекомендуемые.
Правильная организация движений и очистка старых записей — залог корректной работы оборотного регистра и отсутствия задвоения данных.
FAQ: Часто задаваемые вопросы
Можно ли изменить тип регистра с "Обороты" на "Остатки" после создания?
Нет, это невозможно. Тип регистра является фундаментальным свойством, определяющим структуру таблиц в базе данных. Если вам нужен другой тип, придется создать новый регистр и переписать обработку проведения документов.
Почему отчет по оборотному регистру показывает нулевые остатки?
Потому что оборотный регистр не хранит остатки. Он хранит только движения за период. Для получения остатков нужно использовать регистр с типом "Остатки" или писать сложный запрос, суммирующий все движения с начала времен до текущей даты.
Какое максимальное количество измерений можно создать?
Технических ограничений на количество измерений нет, но рекомендуется не превышать 5-7 основных аналитик. Большое количество измерений замедляет запись и выборку данных, а также усложняет поддержку конфигурации.
Нужно ли индексировать поля регистра вручную?
Платформа 1С автоматически создает индексы по полям периода и основным измерениям. Ручное индексирование требуется только в редких случаях специфических выборок, которые не покрываются стандартными индексами.
Что делать, если документы проводятся задним числом?
Оборотные регистры корректно обрабатывают документы задним числом. При формировании отчета за период система автоматически учтет движения, дата которых попадает в выбранный интервал, независимо от даты регистрации документа в системе.