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