Журналы документов. Почему следует их использовать

18 апреля 2013

Файлы для загрузки:

Информационная база с примером

Что это за зверь

Журнал документов

Платформа 1С:Предприятие в составе доступных для использования объектов конфигурации имеет возможность создавать "журналы документов". Общие сведений о них Вы можете посмотреть здесь. В статье же коснемся вопроса о причинах их использования, а также о способе их хранения в базе данных.

В качестве СУБД в нашем примере будем использовать Microsoft® SQL Server® 2008 Express with Advanced Services.

Также рассмотрим альтернативный способ получения списка документов без создания журнала документов.

Без него - никуда

Складские документыРабота пользователей с программой в абсолютном большинстве случает заключается в создании/изменении каких-либо документов. Кассиры работают с чеками, оптовики с реализациями товаров, кладовщики со складскими ордерами и так далее. У каждого свои документы для работы, которые часто логически связаны. Не уходя далеко, рассмотрим пример из складского учета.

В тестовой конфигурации у нас есть документы: "Приходный ордер", "Расходный ордер" и "Заявка". На основе документа "Заявка" создается "Приходный ордер", а далее на основе приходного документа "Расходный ордер".

Пользователям было бы удобней работать с документами как с единым списком, в котором бы они видели последовательность их ввода, а также необходимые значения реквизитов этих документов.

Стандартные реквизиты журнала документовВ обычном приложении для работы со списками документов или элементов справочника использовались специальные классы объектов "ДокументСписок" и "СправочникСписок" соответственно. Но их возможности были ограничены. Они не могли выводить список, состоящий из нескольких видов документов. То есть получить единый список складских документов нашей тестовой конфигурации с помощью этих классов мы бы не смогли.

Вот тут то и выходит на сцену журнал документов. Указав состав журнала и настроив графы для вывода значений реквизитов, выбранных в составе документов, мы получим список документов, отсортированных по моменту времени их создания. 

На следующем скриншоте представлены настройки журнала документов "СкладскиеДокументы".

Настраиваем состав журнала документов и соответствия выводимых реквизитов

В соответствии с настройками пользователь будет видеть в журнале список документов "Приходный ордер", "Расходный ордер" и "Заявка". Отображаться будут все стандартные реквизиты, плюс дополнительные поля, добавленные как графы журнала документов.

В итоге перед пользователями предстанет следующий список:

Журнал документов в режиме 1С:Предприятия

В управляемых формах список журнала документов будет выглядеть аналогичным образом. Единственное отличие: на обычной форме список документов журнала выводятся с помощью класса "ЖурналДокументовСписок", в то время как в управляемой форме используется динамический список с запросом к таблице журнала.Запрос динамического списка, результат которого аналогичен списку журнала документов

Таким образом, использование журналов документов в обычном приложении обосновано, ведь другие способы вывода списка из различных документов трудозатратней по времени разработки. 

Но зачем использовать журналы документов в управляемом приложении, ведь мы могли бы написать произвольный запрос ко всем необходимым документам и отображать результат в динамическом списке.

Ответ, на самом деле, очевиден. Работать динамический список будет намного медленнее. Сам принцип работы динамического списка заключается в порционном получении данных. Если мы в произвольный запрос вставим выборку с помощью вложенных запросов, то при каждом пролистывании списка платформа будет получать большие порции излишних данных, а выводить на экран 5% от всего результата. Использование динамического считывания данных в списке также будет недоступно, так как выбрать основную таблицу для такого произвольного запроса нельзя. В результате, в списке будет содержаться минимум 1000 записей, что соответствует размеру порции выборки при таких настройках списка. 

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

Подробнее о работе динамического списка Вы можете прочитать в предыдущей статье "Динамический список. Как это работает?". Сейчас же заглянем "за кулисы" платформы 1С:Предприятия и рассмотрим основные моменты работы журнала документов на стороне СУБД.

Заглядываем внутрь

Обратимся к нашему примеру. В журнал документов мы добавили три объекта: "Приходный ордер", "Расходный ордер" и "Заявка". Соответственно, SQL-таблица журнала дублирует данные из соответствующих таблиц документов по выводимым в журнале полям. На следующем скриншоте представлена структура SQL-таблицы и ее содержимое для нашего примера (нажмите на скриншот, чтобы увидеть оригинальный размер).

SQL-таблица журнала документов "Складские документы"

На скриншоте также подписаны колонки в том виде, в котором пользователь их видит в режиме 1С:Предприяития. Поле "Документ-основание" представлена тремя колонками, так как имеет составной ссылочный тип данных. В одной из строк в них присутствует значение NULL. Так происходит, поскольку реквизита с ссылкой на основание нет у документа "Заявка".

Подробнее о соответствии типов данных 1С:Предприяитя и MS SQL Server 2008 Вы можете прочитать в соответствующей статье "Типы данных 1С:Предприятие 8.x в MS SQL 2008".

Как мы видим, данные из соответствующих SQL-таблиц документов дублируются в таблице журнала документов. Это может показаться не рациональным на первый взгляд, так как из-за дублирования информации будет раздуваться размер информационной базы. Однако с точки зрения разработки, и в частности производительности прикладного решения, такой подход решает достаточно серьезные проблемы:

  1. Упрощается запрос на получение списка документов, что позволяет быстрее его получать  и работать с отборами по выводимым полям.
  2. Поумолчанию индексируются поля "Дата", "Ссылка" и "Тип". Разработчик может включить индексирование для любых других полей. В конечном счете, индексирование позволит ускорить процесс отбора документов.
  3. Упрощается разработка в случаях, когда в список выводимых документов нужно добавить еще один. Никаких запросов переписывать не придется, достаточно отредактировать состав журнала документов и выполнить реструктуризацию информационной базы.

Индексы для полей SQL-таблицы журнала "Складские документы"

Отметим и отрицательные стороны:

  1. Дублирование информации увеличивает размер информационной базы.
  2. При записи документа, входящего в состав журнала, выполняется SQL-запрос на добавление/обновление/удаление информации в SQL-таблице журнала документов, что также в какой-то мере влияет на скорость работы системы (особенно в многопользовательской среде).

Вот так, например, выглядит SQL-запрос для обновления информации о документе "Заявка" в журнале "Складские документы" при записи:

SQL-запрос обновления записи в журнале документов при записи документа

Если сравнить отрицательные и положительные стороны, то конечно же вывод будет в пользу использования журнала документов. Другие стандартные возможности платформы не справятся так хорошо с построением списка документов.

Делайте выводы

Надеюсь, что статья ответила Вам точно на вопрос: "Почему необходимо использовать журналы документов?". В свое время считал этот объект излишним, однако в последствии при решении задач, подобных приведенному выше примеру, однозначно определил для себя всю пользу этого объекта.

Выводы же делать только Вам! И только для конкретных задач!


comments powered by Disqus