Редактирование таблицы несколькими пользователями в реальном времени

05 марта 2013

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

Конфигурация с примеромДемобаза

Поступила задача

Сегодня мы с Вами решим нестандартную задачу на платформе 1С:Предприятие 8.x. А именно: пользователям необходимо вводить рейтинг для подразделений, при этом редактирование должно осуществляться в одной таблице. Необходимо предусмотреть одновременное редактирование таблицы несколькими пользователями. Рейтинг вводится за фиксированный период - месяц, который может быть выбран пользователем.

Таблица с возможностью параллельного изменения несколькими пользователями

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

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

Ближе к делу

Для параллельной работы пользователей с таблицей необходимо каким-либо образом логически разграничивать данные по строкам и колонкам. То есть, если "Пользователь 1" вводит значение для "Подразделение 2", то редактирование этой ячейки должно быть заблокировано для других пользователей.

Блокировка ячейки

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

Структура регистра сведений для хранения значений из таблицы

Тип данных измерений будет "СправочникСсылка.ХарактеристикиТаблицы". "ХарактеристикиТаблицы" - это справочник, в котором хранятся все возможные значения строк и колонок. Для сочетания характеристик "Строка <-> Колонка" значения хранятся в ресурсе регистра сведений "ОнлайнТаблица" с типом число. Соответственно, уникальность значений для этих пар значений поддерживается в разрезе периодичности регистра, то есть месяца.

Справочник с возможными значениями строк и колонок и перечисление для задания положения  характеристики в таблицеДля того, чтобы отличать характеристики строк от характеристик колонок, было добавлено перечисление "Положение" с двумя значениями: "Горизонтальное" и "Вертикальное". Соответственно, "Горизонтальное" - строки таблицы, "Вертикальное" - колонки таблицы. Значение данного перечисления выбирается для каждого элемента справочника.

Созданная структура метаданных тестовой конфигуарции позволит сохранять значения в разрезе месяцев и пары значений "Строка<->Колонка", представленной значениями справочника "ХарактеристикиТаблицы".

Пример значений в регистре сведений "ОнлайнТаблица" представлен на следующем скриншоте.

Пример заполнения регистра сведений "ОнлайнТаблица"

Теперь перейдем к написанию алгоритмов интерактивной работы пользователя с данной таблицей.

Реализация

Работа пользователей с данной таблицей будет осуществляться из общей формы "ОнлайнТаблица". Основными алгоритмами при интерактивной работе пользователей будут:

  • Программная инициализация таблицы на форме в соответствии с созданными характеристиками колонок и строк.
  • Заполнение/обновление таблицы актуальными значениями в соответствии с выбранным периодом.
  • Редактирование значений для пар "Строка<->Колонка" в таблице.

Теперь по порядку. Инициализация таблицы будет происходить при создании формы на сервере. Делается это следующим программным кодом:

Программный код для инициализации таблицы формы

Как было сказано выше, код выполняется при создании управляемой формы на сервере. Теперь нам необходимо заполнить таблицу по данным регистра сведений. При этом необходимо учитывать текущий период, выбранный пользователем. На следующем скриншоте представлен достаточно простой алгоритм заполнения редактируемой таблицы значениями из регистра сведений:

Заполнение таблицы актуальными значениями

Описанный выше алгоритм выполняется после инициализации таблицы на сервере, при изменении значения в ячейке пользователем или при вызове команды "Обновить".

Самая простая часть - это редактирование значения в ячейке. Выполняется это через открытие связанной записи регистра сведений по ключу. Вот так выглядит программный код для открытия формы записи регистра сведений:

Открытие записи регистра сведений по ключу

После выполнения записи значения выполняется оповещение зависимой формы. На основной форме при обработке оповещения происходит обновление значений таблицы.

Запускаем 1С:Предприятие

Как созданный механизм будет работать в режиме 1С:Предприятия смотрите на следующем видео.

На видео был продемонстрирован пример, когда ячейка таблицы была заблокирована для изменения, пока пользователь ее редактировал.
ПРИМЕЧАНИЕ: Параллельная работа нескольких пользователей с таблицей способом, описанным в статье, возможен только для клиент-серверного варианта работы. В файловом варианте при записи в регистр одним пользователем будет накладываться блокировка на всю таблицу регистра, что сделать параллельную работу невозможной.

КАК МОЖНО ПОВЫСИТЬ ПАРАЛЛЕЛЬНОСТЬ РАБОТЫ?

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

Мы не будем рассматривать все варианты увеличения параллельности работы пользователей. Это тема отдельных статей. Предложу самый простой в реализации вариант. Все что нам понадобится - добавить дополнительное измерение в регистр. Назовем его "Месяц", настроим его тип как "Дата". Сделаем его первым в структуре измерений.

 Изменение в структуре регистра сведений для повышения параллельности работы пользователей

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

ПОДВОДИМ ИТОГИ

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

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

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


comments powered by Disqus