Разработчики, переходящие на работу с крупными корпоративными решениями вроде 1С:ERP Управление предприятием или 1С:Комплексная автоматизация, часто сталкиваются с неожиданным открытием: в интерфейсе системы полностью отсутствует привычный общий журнал документов (операций), который был так удобен в «1С:Бухгалтерии» или старых версиях платформы «1С:Предприятие 7.7». Попытки найти готовое расширение или внешнюю обработку часто приводят к предупреждениям от опытных коллег: «Это очень плохая идея, система будет жутко тормозить».
В этой статье мы подробно разберем технические причины такого архитектурного решения фирмы «1С», проанализируем ограничения систем управления базами данных (СУБД) и рассмотрим эффективные встроенные инструменты и альтернативные методы разработки, которые позволяют решать задачи администратора по поиску и исправлению ошибок в данных без ущерба для производительности системы.
Для того чтобы понять, почему создание общего журнала документов в 1С:ERP противопоказано, заглянем на уровень СУБД (MS SQL Server, PostgreSQL или Oracle). Проанализируем, как устроена структура метаданных системы:
UNION ALL или выполнять множественные левые соединения (LEFT JOIN).По этой причине создание классического общего журнала документов в конфигураторе 1С:ERP является грубейшей архитектурной ошибкой. Выясним, как решать стандартные задачи анализа данных без применения этого механизма.
Рассмотрим типичную ситуацию, с которой часто сталкивается администратор или аналитик (описанную в сообщении №11 форума): пользователи сообщают, что в итоговых данных за период (месяц или квартал) содержится ошибка. Нам необходимо на копии базы проанализировать, какие документы были введены за этот период, и провести с ними сервисные манипуляции (например, отменить проведение некоторых из них для локализации проблемы).
Для решения этой задачи в типовой конфигурации 1С:ERP предусмотрен целый арсенал штатных инструментов. Разберем их по шагам.
Мало кто знает, но в ERP существует скрытый по умолчанию, но чрезвычайно полезный инструмент — Журнал документов регламентированного учета. В этот журнал автоматически попадают абсолютно все хозяйственные операции оперативного контура, которые делают или в перспективе могут делать проводки в бухгалтерском и налоговом учете.
Чтобы открыть его, выполним следующие действия:
Этот журнал работает оптимально, поскольку его структура спроектирована под задачи бухгалтера и содержит ограниченный, оптимизированный состав реквизитов, позволяющий быстро фильтровать документы по периоду, организации и статусу отражения в учете.
Если наша цель — пакетное изменение статуса проведения документов определенного типа за период, использовать журналы вообще не требуется. В платформу встроен мощный низкоуровневый инструмент:
Этот метод работает напрямую с объектной техникой платформы 1С, минуя сложные запросы к интерфейсным спискам, что гарантирует максимальную скорость выполнения операции.
Для более гибкой выборки документов и изменения их состояния (например, пометки на удаление или отмены проведения по сложным критериям) воспользуемся стандартной обработкой из состава БСП (Библиотеки стандартных подсистем):
Если перед нами стоит задача понять: «Что именно пользователи занесли в систему за этот период?», наиболее правильным решением будет использование административных отчетов:
Бывают ситуации, когда специфика бизнес-процессов или отладочные работы на копии базы требуют наличия единого рабочего места для просмотра разнородных документов. Рассмотрим два профессиональных архитектурных подхода, как реализовать такую задачу без ущерба для производительности СУБД.
Вместо использования динамического списка на управляемой форме, создадим внешний отчет или обработку с использованием Системы компоновки данных (СКД). Основная идея заключается в том, что запрос выполняется разово (по кнопке «Сформировать») за жестко ограниченный период времени, а результат выводится в обычную таблицу значений.
Проанализируем пример построения пакетного запроса для СКД, выбирающего только ключевые торговые документы за период. Такой подход не блокирует СУБД, так как не производит постоянное считывание порций данных при скроллинге:
ВЫБРАТЬ
Ссылка КАК ДокументСсылка,
Дата КАК ДатаДокумента,
Проведен КАК СтатусПроведения,
Организация КАК Организация,
"Реализация товаров услуг" КАК ТипДокумента
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Ссылка,
Дата,
Проведен,
Организация,
"Приобретение товаров услуг"
ИЗ
Документ.ПриобретениеТоваровУслуг КАК Приобретение
ГДЕ
Приобретение.Дата МЕЖДУ &НачалоПериода И &КонецПериода
Использование параметров &НачалоПериода и &КонецПериода является обязательным. Это позволяет СУБД использовать индексы по полям дат документов и мгновенно возвращать результат выборки.
Если пользователям необходим именно динамический список, работающий в реальном времени с возможностью быстрого поиска и сортировки по всей базе, применим паттерн проектирования «Индексный регистр». Этот паттерн часто используется разработчиками в высоконагруженных системах.
Разберем этот метод по шагам:
РеестрДокументов.Ссылка (тип: ДокументСсылка).Дата (тип: Дата), Проведен (тип: Булево), Организация (тип: СправочникСсылка.Организации), СуммаДокумента (тип: Число), ТипДокумента (тип: Строка).ПередЗаписьюДокумента или ПриЗаписиДокумента для регистрации изменений в нашем регистре.Напишем обработчик подписки на событие для регистрации метаданных:
Процедура ЗарегистрироватьДокументВРеестре(Источник, Отказ) Экспорт
// Исключаем влияние на обмен данными
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Создаем менеджер записи для нашего индексного регистра
МенеджерЗаписи = РегистрыСведений.РеестрДокументов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Ссылка = Источник.Ссылка;
// Заполняем реквизиты для быстрого поиска
МенеджерЗаписи.Дата = Источник.Дата;
МенеджерЗаписи.Проведен = Источник.Проведен;
МенеджерЗаписи.ПометкаУдаления = Источник.ПометкаУдаления;
МенеджерЗаписи.ТипДокумента = Источник.Метаданные().Синоним;
// Проверяем наличие реквизита "Организация" у документа программно
Если ОбщегоНазначения.ЕстьРеквизитОбъекта("Организация", Источник.Метаданные()) Тогда
МенеджерЗаписи.Организация = Источник.Организация;
КонецЕсли;
Попытка
МенеджерЗаписи.Записать(Истина);
Исключение
// Записываем ошибку в журнал регистрации, чтобы не блокировать транзакцию проведения
ЗаписьЖурналаРегистрации(
"РеестрДокументов.Регистрация",
УровеньЖурналаРегистрации.Ошибка,
Источник.Метаданные(),
Источник.Ссылка,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())
);
КонецПопытки;
КонецПроцедуры
После первоначального заполнения этого регистра (которое можно выполнить простой одноразовой обработкой), мы сможем построить динамический список нашего "Общего журнала" на основе всего лишь одной физической таблицы регистра сведений РеестрДокументов. Поиск, сортировка и фильтрация по такому журналу будут выполняться мгновенно, не нагружая СУБД сложными запросами к таблицам документов.
Таким образом, мы выяснили, почему классический общий журнал документов отсутствует в 1С:ERP, научились использовать мощные штатные инструменты для анализа данных и перепроведения, а также разобрали безопасные с точки зрения производительности способы проектирования кастомных решений.