При разработке учетных систем и систем управления проектами часто возникает задача организации поэтапного ввода данных. Например, один пользователь регистрирует проект или документ, второй вносит технические параметры и указывает исполнителя, третий заполняет производственные показатели и передает задачу дальше по цепочке. Разберем особенности платформенных блокировок 1С, выясним, почему прямая одновременная работа с одним документом вызывает конфликты, и рассмотрим проверенные архитектурные варианты решения этой задачи.
Прежде чем выбирать архитектуру, проанализируем ограничения платформы 1С:Предприятие при попытке одновременного редактирования одного и того же объекта:
ЗаблокироватьДанныеДляРедактирования). Другой пользователь при попытке открыть или отредактировать этот же документ получит предупреждение о том, что объект уже заблокирован.ВерсияДанных. Если первый пользователь записал свои изменения, а второй в это время держал открытой старую копию данных, при попытке сохранения вторым пользователем возникнет исключение: «Данные были изменены или удалены другим пользователем».Таким образом, прямое одновременное редактирование одного объекта разными пользователями технически невозможно без конфликтов блокировок. Рассмотрим основные подходы к правильной организации такого бизнес-процесса.
Если бизнес-процесс линейный и пользователям не требуется вносить данные абсолютно в один и тот же момент времени, самым простым и надежным решением является использование одного документа со статусной моделью.
Разберем реализацию этого подхода по шагам:
Статус (ссылка на перечисление или справочник этапов) и ТекущийИсполнитель (ссылка на справочник Пользователи).ПриЧтенииСозданииНаСервере управляем доступностью реквизитов и элементов формы в зависимости от текущего статуса и текущего пользователя сеанса:
&НаСервере
Процедура ПриЧтенииСозданииНаСервере()
ТекущийПользователь = ПараметрыСеанса.ТекущийПользователь;
ЭтоТекущийИсполнитель = (Объект.ТекущийИсполнитель = ТекущийПользователь);
// Блокируем или открываем доступ к группам реквизитов
Элементы.ГруппаТехническиеДанные.Доступность =
(Объект.Статус = Перечисления.СтатусыПроекта.ТехническаяЭкспертиза) И ЭтоТекущийИсполнитель;
Элементы.ГруппаИсполнение.Доступность =
(Объект.Статус = Перечисления.СтатусыПроекта.ВРаботе) И ЭтоТекущийИсполнитель;
КонецПроцедуры
Если цепочка согласований и ввода данных разветвленная, содержит параллельные ветки или требует строгого контроля сроков исполнения, правильным решением является использование стандартного механизма платформы Бизнес-процессы и Задачи.
Разберем логику работы механизма:
БизнесПроцесс (например, СогласованиеПроекта), в карте маршрута которого описываются все шаги: создание, техническое согласование, назначение исполнителя, выполнение.Задача (например, ЗадачаИсполнителя). При переходе на точку маршрута платформа автоматически генерирует задачи для конкретных пользователей или ролей.Если пользователям необходимо вносить независимые блоки информации параллельно (без ожидания завершения этапа коллегой), не следует хранить все реквизиты в одном объекте-документе. Рассмотрим подход с разделением данных:
ТехническиеПараметрыПроектов, ПлановыеПоказателиПроектов). Измерением регистра выступает ссылка на проект, а ресурсами — конкретные показатели.
&НаСервере
Процедура ЗаписатьДанныеЭтапаНаСервере(СсылкаНаПроект, ЗначениеПараметра)
НаборЗаписей = РегистрыСведений.ТехническиеПараметрыПроектов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Проект.Установить(СсылкаНаПроект);
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Проект = СсылкаНаПроект;
НоваяЗапись.Параметр = ЗначениеПараметра;
НоваяЗапись.АвторИзменения = ПараметрыСеанса.ТекущийПользователь;
// Запись набора не блокирует сам документ проекта и другие регистры
НаборЗаписей.Записать();
КонецПроцедуры
Такой подход полностью исключает возникновение ошибок блокировки версий объекта (ВерсияДанных), так как разные пользователи пишут данные в независимые таблицы базы данных.
Если каждый этап работы представляет собой законченную хозяйственную операцию, методологически верно создавать цепочку подчиненных документов:
ЗаявкаНаПроект).ТехническоеЗадание, НарядНаВыполнениеРабот, АктПриемки).Для простых цепочек из 3–4 последовательных шагов оптимальным решением будет статусная модель в одном документе. Для сложных и ветвящихся процессов следует использовать бизнес-процессы или независимые регистры сведений.