Почему в 1С:ERP некоторые отчеты строятся по документам, а не по регистрам, и какой подход выбрать для своих разработок?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет IT и автоматизация бизнеса
← На главную

В практике разработки на платформе 1С:Предприятие 8 существует классическая дилемма: использовать для построения отчетов данные из регистров или обращаться напрямую к табличным частям документов. С одной стороны, методология 1С и требования экзамена 1С:Специалист однозначно указывают на приоритет регистров. С другой — в таких сложных системах, как 1С:ERP 2.2/2.5, мы встречаем типовые отчёты (например, «Состояние выполнения»), которые читают данные из документов. Разберем эту ситуацию подробно, проанализируем риски и выясним, как правильно спроектировать отчет по заказам и отгрузкам.

Методологический стандарт 1С: Регистр как «точка истины»

Для начала вспомним, почему 1С настаивает на использовании регистров. Согласно требованиям аттестации, получение расчетных данных не из регистра считается серьезной ошибкой. Проанализируем основные причины этого правила:

  1. Достоверность данных: Информация в документах — это лишь «намерение» пользователя. Регистр накопления — это результат проведения, подтвержденный программными проверками. Если документ записан, но не проведен (или проведен с ошибками), данные в его табличных частях могут быть неактуальны или противоречивы.
  2. Производительность: Регистры накопления специально оптимизированы для быстрого получения итогов. Платформа хранит предварительно рассчитанные итоги в специальных таблицах СУБД. Обращение к ним происходит мгновенно, в то время как запрос к табличным частям документов требует сканирования (Full Scan) огромных таблиц.
  3. Разделение логики: Регистры позволяют абстрагироваться от конкретных типов документов. Например, данные о продажах могут записывать и РеализацияТоваровУслуг, и ОтчетОРозничныхПродажах. Отчету по регистру ВыручкаИСебестоимостьПродаж не важно, какой именно документ сделал запись.

Почему в ERP встречаются отчеты по документам?

Проанализируем ситуацию с отчетом СостояниеВыполненияДокументов. Почему разработчики 1С отошли от собственных правил? Рассмотрим несколько причин:

Отображение состояний «вне учета». В ERP бизнес-процесс часто требует видеть состояние заказов, которые еще не проведены, находятся в статусе «Черновик» или на согласовании. В регистрах накопления таких данных просто нет, так как они попадают туда только в момент проведения.

Сложные статусы и флаги. Логика состояний в ERP (например, «Готов к обеспечению», «Закрыт», «Отменено») завязана на реквизиты шапки и строк документа. Чтобы не раздувать структуру регистров десятками служебных измерений, часть оперативной логики выносится на уровень документов.

Построчный анализ. Если отчет должен выводить специфические текстовые комментарии из строк документа или аналитику, которая не является ключевой для учета (и не включена в состав регистра), разработчикам приходится обращаться к первоисточнику — табличным частям.

Технические риски: чем грозит отчет по документам через год

Если мы решим последовать примеру этого отчета и построим свой общий отчет по Заказам клиентов и Заказам на перемещение через их табличные части, мы столкнемся с рядом проблем. Разберем их по шагам:

Деградация производительности. SQL-сервер отлично справляется с выборкой, когда база пустая. Однако через год-два, когда количество строк в таблицах ЗаказКлиента.Товары и ЗаказНаПеремещение.Товары достигнет сотен тысяч или миллионов, время формирования отчета вырастет экспоненциально. В отличие от регистров, у табличных частей часто отсутствуют необходимые индексы по полям, используемым в условиях (например, по произвольным реквизитам).

Блокировки данных. При чтении табличных частей в момент активной работы (когда другие менеджеры записывают новые заказы) могут возникать конфликты блокировок. Это замедлит работу всей системы, так как операции чтения будут конкурировать с операциями записи в одни и те же таблицы документов.

Как правильно реализовать отчет «Заказано и Отгружено»

Если нам нужен аналитический отчет по всем заказам сразу (клиентов и перемещений), правильным подходом будет использование регистров накопления. Рассмотрим, как это реализовать.

В ERP для этих целей существуют универсальные регистры. Проанализируем ситуацию: данные о потребностях (заказах) и их обеспечении (отгрузках) обычно аккумулируются в регистрах:

Разберем пример построения запроса к виртуальной таблице ОстаткиИОбороты регистра накопления. Это позволит нам увидеть и сколько было заказано (Приход), и сколько было отгружено (Расход).


ВЫБРАТЬ
    ЗаказыОстаткиИОбороты.Заказ КАК ДокументЗаказа,
    ЗаказыОстаткиИОбороты.Номенклатура КАК Номенклатура,
    ЗаказыОстаткиИОбороты.КоличествоПриход КАК Заказано,
    ЗаказыОстаткиИОбороты.КоличествоРасход КАК Отгружено,
    ЗаказыОстаткиИОбороты.КоличествоКонечныйОстаток КАК ОсталосьОтгрузить
ИЗ
    РегистрНакопления.ЗаказыКлиентов.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК ЗаказыОстаткиИОбороты

Для объединения данных по разным типам заказов (клиентов и перемещений) следует использовать оператор ОБЪЕДИНИТЬ ВСЕ, собирая данные из соответствующих регистров. Это будет работать в разы быстрее, чем попытка соединить огромные таблицы документов.

Использование регистров сведений для оптимизации

Если данных в существующих регистрах накопления не хватает для реализации специфической логики статусов, рассмотрим современный подход 1С: использование **Регистров сведений**. В последних версиях ERP многие состояния документов пишутся в специализированные регистры сведений (например, СостоянияЗаказовКлиентов). Чтение из индексированного регистра сведений всегда предпочтительнее, чем чтение из табличной части документа.

Выводы и рекомендации

Подведем итог нашему анализу. Выбор источника данных зависит от задачи:

  1. Для оперативного анализа конкретного документа: Если вам нужно открыть форму и увидеть «здесь и сейчас» состояние строк текущего заказа (включая черновики) — использование табличных частей допустимо, так как выборка идет по конкретной ссылке и не нагружает систему.
  2. Для сводного аналитического отчета: Если нужно увидеть общую картину по сотням заказов за период — используйте только регистры. Если в типовых регистрах нет нужного разреза данных, правильнее будет расширить проведение документов (через расширение конфигурации), чтобы они записывали нужные данные в новый или существующий регистр.

Помните: то, что в типовых конфигурациях встречаются отклонения от стандартов, часто обусловлено историческим наследием или экстремальной необходимостью визуализации. При разработке собственных механизмов всегда придерживайтесь правила: «Отчеты — по регистрам, формы документов — по данным объектов». Это обеспечит стабильную работу вашей системы на долгие годы.

← На главную