Управляемые блокировки 1С

Содержание

Работа с управляемыми блокировками в примерах. Новая схема проведения документов 1с 8.2.

Будем рассматривать принципы работы управляемых блокировок на некоторой тестовой конфигурации. Учет ведется в разрезе номенклатуры и свойств номенклатуры. Приходная накладная (ПН) ничего не блокирует, но пишет данные в регистр накопления «Остаток товара». На примере документа Расходная накладная (РН) изучим, как работают управляемые блокировки, а затем посмотрим на новую схему проведения документов. В ПН и РН есть одинаковые по структуре табличные части (ТЧ) СписокНоменклатуры, в которых содержится список Номенклатуры, Свойств, Количество, Сумма, Цена:

В Регистре накопления есть соответсвующие измерения: Номенклатура, Свойство и два ресурса — Сумма и Количество.

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

Обратим внимание, что в файловой версии можно устанавливать блокировки только на таблицы целиком (см. таблицу ниже), построчные (в разрезе выбранных движений из регистра накопления, например) блокировки в файловом режиме не работают. Примеры тестировались на 1С 8.2 + MS SQL 2008 R2 Express.

Детальнее про поддерживаемые режимы блокировок тут: http://v8.1c.ru/overview/Term_000000642.htm

Примеры рассматриваются на следующих РН и ПН:

ПН — 01

ПН — 02

РН — 01

Пример 1. Блокировка по конкретно известной номенклатурной позиции.

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

Движения.ОстаткиНоменклатуры.Записывать = Истина;

//Далее идет заполнение движений

Как это работает:

Если в процессе проведение РН — 01, сделать попытку провести ПН — 01, то она будет ожидать завершения блокировки регистра накопления по измерению «Номенклатура» с наименованием «Ботинки» и ПН — 02 будет ожидать завершения блокировки регистра накопления по измерению «Номенклатура» с наименованием «Ботинки».

Пример 2. Блокировка по конкретно известной паре номенклатурная позиция — свойство.

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

Как это работает:

Если в процессе проведение РН — 01, сделать попытку провести ПН — 01, то она будет ожидать завершения блокировки регистра накопления по паре измерений «Номенклатура» (с наименованием «Ботинки») -«Свойство» (с наименованием «черные 42 размера»), а ПН — 02 проведется без ожидания, так как в ее ТЧ СписокНоменклатуры нет пары «Номенклатура»-«Свойство», которая будет образовывать соответвствующее движение.

Пример 3. Блокировка на всю таблицу регистра накопления.

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

//Далее идет заполнение движений

Как это работает:

Если в процессе проведение РН — 01, сделать попытку провести ПН — 01, то она будет ожидать завершения блокировки таблицы регистра накопления и ПН — 02 будет ожидать завершения блокировки таблицы регистра накопления.

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

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

//Далее идет заполнение движений

Как это работает:

Если в процессе проведение РН — 01, сделать попытку провести ПН — 01, то она будет ожидать завершения блокировки регистра накопления по измерению «Номенклатура» и значением «Ботинки» из источника СписокНоменклатуры и ПН — 02 будет ожидать завершения блокировки регистра накопления по измерению «Номенклатура» и значением «Ботинки» из источника СписокНоменклатуры (так как именно такое значение реквизита «Номенклатура» в переданной как источник ТЧ).

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

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

Блокировка = Новый БлокировкаДанных;

//Далее идет заполнение движений

Как это работает:

Если в процессе проведение РН — 01, сделать попытку провести ПН — 01, то она будет ожидать завершения блокировки регистра накопления по паре измерений «Номенклатура» значение «Ботинки» из переданного источника — «Свойство» значение «черные 42 размера» из переданного источника, а ПН — 02 проведется без ожидания, так как в ее ТЧ СписокНоменклатуры нет пары «Номенклатура»-«Свойство», которая будет образовывать соответвствующее значениям полей источника блокировки движение.

Пример 6. Блокировка по двум полям из источника данных для блокировки.

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

//условие «И» — будут заблокированы и записи для номенклатуры из ТЧ СписокНоменклатуры

// с любыми свойствами и записи для любой номенклатуры со свойствами из ТЧ СписокНоменклатуры
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = «РегистрНакопления.ОстаткиНоменклатуры»;
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Номенклатура», «Номенклатура»);
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = «РегистрНакопления.ОстаткиНоменклатуры»;
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Свойство», «Свойство»);
Блокировка.Заблокировать();

//Далее идет заполнение движений

Как это работает:

Если в процессе проведение РН — 01, сделать попытку провести ПН — 01, то она будет ожидать завершения блокировки регистра накопления по измерению «Номенклатура» значение «Ботинки» с любыми свойствами и отдельно по «Свойству» со значением «черные 42 размера» для любой номенклатуры, в ПН — 01 есть и номенклатура «Ботинки» и номенклатура со свойствами «черные 42 размера». Аналогично ПН — 02 будет ожидать завершения блокировки, так как в ПН — 02 есть номенклатура «Ботинки».

Пример 7. Новая схема проведения (чем же отличается БлокироватьДляИзменеия = Истина от блокировок при помощи объекта БлокировкаДанных).

Код процедуры ОбработкаПроведения(Отказ, Режим) модуля объекта документа РасходнаяНакладная:

//Новая схема (без механизма контроля остатков)

//Разбор БлокироватьДляИзменения = Истина
Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
Движения.ОстаткиНоменклатуры.Записать(); //Набор пустой, нет значений полей пространства блокировки. нечего блокировать.
//очень упрощенный пример создания движений расходной
Для Каждого СтрокаН Из СписокНоменклатуры Цикл
Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = СтрокаН.Номенклатура;
Движение.Количество = СтрокаН.Количество;
Движение.Сумма = СтрокаН.Сумма;

Движение.Свойство = СтрокаН.Свойство;
КонецЦикла;

//1
Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
Движения.ОстаткиНоменклатуры.Записать(); //Набор не пустой будет выполнена блокировка, источник — ТЧ СписокТоваров

//Далее должен идти механизм контроля остатков

Как это работает:

Если в процессе проведение РН — 01, сделать попытку провести ПН — 01, то она будет ожидать завершения блокировки регистра накопления по паре измерений «Номенклатура» значение «Ботинки» из переданного источника — «Свойство» значение «черные 42 размера» из переданного источника, а ПН — 02 проведется без ожидания, так как в ее ТЧ СписокНоменклатуры нет пары «Номенклатура»-«Свойство», которая будет образовывать соответвствующее значениям полей источника блокировки движение.

При использовании команды БлокироватьДляИзменения = Истина на регистр накопления по значениям измерений движений установится исключительная блокировка. Никаких конструкций с использованием объекта БлокировкаДанных для этого писать не нужно.

Код под комментарием //1 выше аналогичен следующему коду:

//Работает аналогично, как и 1
Движения.ОстаткиНоменклатуры.Записать();
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = «РегистрНакопления.ОстаткиНоменклатуры»;
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = Движения.ОстаткиНоменклатуры.Выгрузить();
Для Каждого Измерение Из Метаданные.РегистрыНакопления.ОстаткиНоменклатуры.Измерения Цикл
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(Измерение.Имя, Измерение.Имя);
КонецЦикла;
Блокировка.Заблокировать();

//Далее должен идти механизм контроля остатков

P.S. Отличие исключительных блокировок от разделяемых в изложенных выше примерах в том, что при разделяемом режиме блокировок возможны разделяемые блокировки при параллельном проведении других документов по тем же полям источников данных, что и в заблокированных в данном документе данных.

Переключение объекта в управляемый режим

Необходимо начинать с самых «загруженных» документов. Переключите документ в режим блокировок «Управляемый»:

Перевод регистров в управляемый режим

Необходимо перевести ВСЕ регистры 1С (накопления, бухгалтерии, сведений, расчета), которые производят движения данным документом, в режим управляемых блокировок:

Найти все транзакции с этими объектами

Необходимо найти все транзакции с этими объектами метаданных. Как явные, так и не явные.

Явные — те, которые вызываются в коде с помощью метода «НачатьТранзакцию()».

НЕ явные — те, которые вызываются в обработчиках объектов — «ПриЗаписи», «ОбработкаПроведения» и т.д.

Корректировка программного кода в транзакция

Для явных транзакций необходимо передать в параметр метода «НачатьТранзакцию()» параметр «РежимУправленияБлокировкойДанных.Управляемый».

Для НЕ явных транзакций установить блокировки с помощью объекта системы «БлокировкаДанных».

Пример использования блокировки:

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить(«РегистрНакопления.ТоварыНаСкладах»);
ЭлементБлокировки.УстановитьЗначение(«Качество», Справочники.Качество.НайтиПоКоду(«1»));
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = ДокументОбъект.ВозвратнаяТара;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Номенклатура», «Номенклатура»);
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Склад», «Склад»);
Блокировка.Заблокировать();

Заменить конструкцию ДЛЯ ИЗМЕНЕНИЯ

Эта конструкция не отрабатывает в режиме управляемых блокировок. Данную конструкцию следует заменить объектом «БлокировкаДанных».

Если Вам необходим партнер для перевода конфигурации в управляемый режим блокировок, просто обратитесь к нам! Подробности — услуги 1С.

Печать (Ctrl+P)

Управляемые формы. Платформа 1С 8.3

Объект конфигурации Нумераторы в дереве документов обеспечивает порядок нумерации стандартного реквизита документов – Номер .

Для обеспечения порядка нумерации других реквизитов документа типа число или строка приходится создавать собственные нумераторы ( или счетчики) в виде регистра сведений.

Например, в одной конфигурации создан вид документа
“Страховой полис”, который кроме стандартного реквизита номер , содержит еще реквизит Номер полиса , порядок нумерации которого от контрагента ( исполнителя) документа ( страховой компании).

Для обеспечения уникальности нумерации реквизита Номер полиса в разрезе контрагента, я создал периодический в приделах года, регистр сведения Нумератор Полиса . Этот регистр содержал одно измерение – Контрагент и один ресурс – Номер

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

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

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

ЗаблокироватьДанныеДляРедактирования(<Ключ>, <ВерсияДанных>, <ИдентификаторФормы>)

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

Проблема была решена после блокировки счетчика перед чтением с помощью объекта блокировкаДанных:

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить(«РегистрСведений._НумерацияДоговоровСтраховыхКомпаний»);
Блокировка.Заблокировать();

Средствами встроенного языка установка управляемых блокировок внутри явной или скрытой (неявной) транзакции происходит с помощью специального объекта БлокировкаДанных, описание доступных свойств и методов которого можно посмотреть в синтакс-помощнике в ветви Общие объекты ( См рис 1).

Объект блокировкаДанных предназначен для явной блокировки данных от чтения или изменения другими сессиями. Метод заблокировать() устанавливает управляемые блокировки и ждет, когда это возможно – когда блокировка в другой сессии будет снята . По истечению времени ожидания возникает прерывание системы и вызывается ошибка СУБД.

Отмена ( снятие) блокировки происходит автоматически при выходе из транзакции . У данного объекта нет метода типа отмены или снятия блокировки.

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

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

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

Не удалось заблокировать нумератор полиса. Документ полис не может быть записан . Повторите попытку!

Решение этого примера выполняется в теле обработчика события ПередЗаписьюНаСервере.

Данное событие вызывается перед записью полиса на сервере и выполняется вне транзакции. Можно отменить запись полиса если в теле процедуры-обработчика установить отказ = истина.

&НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) Если Не ЗначениеЗаполнено(ТекущийОбъект.НомерПолиса) Тогда НомерПолиса = ПолучитьНомерПолиса (ТекущийОбъект.Контрагент); Если НомерПолиса = 0 Тогда Отказ = Истина; Сообщить(» Не удалось записать полис!. Повторите попытку»); Иначе ТекущийОбъект.НомерПолиса = НомерПолиса; КонецЕсли; КонецЕсли; КонецПроцедуры

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

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

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

&НаСервере Функция ПолучитьНомерПолиса (Контрагент) НачатьТранзакцию(); Попытка Отбор = Новый Структура; Отбор.Вставить(«Контрагент», Контрагент); КлючЗаписи = РегистрыСведений._НумераторПолиса.СоздатьКлючЗаписи(Отбор); ЗаблокироватьДанныеДляРедактирования(КлючЗаписи); // БлокировкаДанных Предназначен для явной блокировки данных от чтения // или изменения другими сессиями. Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить(«РегистрСведений._НумерацияДоговоровСтраховыхКомпаний»); Блокировка.Заблокировать(); Номер=0; Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ |_НумераторПолисаСрезПоследних.Номер КАК Номер |ИЗ |РегистрСведений._НумераторПолиса.СрезПоследних(, Контрагент = &Контрагент) КАК _НумераторПолисаСрезПоследних ; Запрос.УстановитьПараметр(«Контрагент», Контрагент); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Номер = Выборка.Номер; КонецЕсли; Номер = Номер+1; запись = РегистрыСведений._НумераторПолиса.СоздатьМенеджерЗаписи(); запись.Контрагент = Контрагент; запись.Период = ТекущаяДата(); запись.Номер =Номер; Запись.Записать(); РазблокироватьДанныеДляРедактирования(КлючЗаписи); ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); Сообщить( «Не удалось заблокировать нумератор. Он уже заблокирован»; Возврат 0; КонецПопытки; Возврат Номер; КонецФункции

Обратите внимание, что блокировка записи происходит до выполнения запроса о чтении номера. Если запись заблокирована вызывается исключение и функция возвращает 0.

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

Процедура СтартоватьОтложенныйПроцесс(БизнесПроцесс) Экспорт НачатьТранзакцию(); Попытка ЗаблокироватьДанныеДляРедактирования(БизнесПроцесс); БизнесПроцессОбъект = БизнесПроцесс.ПолучитьОбъект(); // Стартуем бизнес процесс и регистрируем этот старт в регистре. БизнесПроцессОбъект.Старт(); РегистрыСведений.ПроцессыДляЗапуска.ЗарегистрироватьСтартПроцесса(БизнесПроцесс); РазблокироватьДанныеДляРедактирования(БизнесПроцесс); ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = НСтр(«ru = ‘Во время отложенного старта этого процесса произошла ошибка: |%1 |Попробуйте запустить процесс вручную, а не отложенно.'»); Описание = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ТекстОшибки, ОписаниеОшибки); РегистрыСведений.ПроцессыДляЗапуска.ЗарегистрироватьОтменуСтарта(БизнесПроцесс, Описание); КонецПопытки; КонецПроцедуры 0

Осторожно, управляемые блокировки.

Данная статья относится к релизу платформы 8.2.13.219 и наверное более ранним.

Начну с технических параметров. Платформа 8.2.13.219, конфигурация «Типовая Торговля для РБ 2.0» очень доработанная, одновременно работающих пользователей 130-140, свойство конфигурации «Режим управления блокировкой» — «Автоматический».

При интенсивном вводе документов стали часто возникать взаимоблокировки. С помощью ЦУП были выявлены участки кода, где происходило большинство блокировок. Код и запросы максимально были оптимизированы, но блокировки все равно остались. После этого было решено частично перевести основные документы на работу в управляемых блокировках.

В свойство конфигурации «Режим управления блокировкой» было установлено «Автоматический и управляемый», все регистры, подчиненные регистратору, были переведены в управляемый режим. В модулях где в запросах использовалась конструкция «ДЛЯ ИЗМЕНЕНИЯ» использовался объект конфигурации «БлокировкаДанных».

В модулях часто использовалась конструкция для блокировок, где одновременно встречались методы «УстановитьЗначение» и «ИспользоватьИзИсточника»

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки = Блокировка.Добавить(«РегистрНакопления.ТоварыНаСкладах»);
ЭлементБлокировки.УстановитьЗначение(«Качество», Справочники.Качество.НайтиПоКоду(«1»));
ЭлементБлокировки.ИсточникДанных = Товары;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Номенклатура», «Номенклатура»);
Блокировка.Заблокировать();

Сразу после перехода в такой режим работы менеджер класстера стал аварийно вылетать по нескольку раз на день. Все рекомендации найденные в интернете не приводили к положительному результату. Так проработали более месяца. Затем после выхода официального релиза 8.2.15 было решено переходить на новый релиз. При тестировании конфигурации на релизе 8.2.15 пришлось доработать блокировки в текущей конфигурации. Было убрано одновременное использование «УстановитьЗначение» и «ИспользоватьЗначение». В релизе 8.2.15 — это запрещено.

Как только изменения были применены к рабочей базе (релиз платформы 8.2.13.219), то аварийное завершение менеджера кластера прекратилось.

Популярность: 11%

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

Особенности управляемого режима блокировок

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

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

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

Еще одной распространенной проблемой блокировок в 1С является импорт документов. Многие разработчики используют достаточно простое решение – при загрузке не проводить документы, а только создавать. А после, с помощью простого механизма, провести все загруженные данные в многопоточном режиме по ключевым характеристикам – номенклатуре, партнерам или складам.

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

Переключение в управляемый режим

Несмотря на то, что ниже будет представлен полный алгоритм перехода на режим управляемых блокировок, выполнять его должен опытный специалист. Если не понимать принципов работы механизма блокировок в 1С и СУБД, то вряд ли получится правильно написать ограничения. Но это относиться к сложным конфигурациям. Для простых конфигураций начинающие разработчики могут успешно закончить процесс переключения режима и набраться опыта:

  • В первую очередь нужно изменить режим управления блокировкой данных для конфигурации. Для этого в конфигураторе откройте дерево конфигурации и в свойствах корневого элемента в разделе «Совместимость» измените режим. Выберите пункт «Автоматический и управляемый», чтобы не возникало ошибок до того, как все объекты будут переведены на новый режим;

Выберите пункт «Автоматический и управляемый»

  • Теперь настает очередь документов. Ведь именно с их помощью мы регистрируем все события, которые нужно контролировать. Начинать перевод на управляемые блокировки 1С нужно с самых загруженных документов. На вкладке «Прочее» указываем режим блокировок «Управляемый»;
  • Находим все регистры, связанные с уже обработанным документом и переводим их в управляемый режим по аналогичному документам методу;
  • Следующий этап включает в себя поиск и изменение всех транзакций с измененными объектами. Сюда входят и явные изменения, включающие ключевые слова «НачатьТранзакцию()», так и все обработчики документов и регистров, включающие транзакции;

НачатьТранзакцию() Для Каждого ДокументНаУдаление ИЗ СпискаДокументов Цикл ОбъектДокумента = ДокументНаУдаление.ПолучитьОбъект(); Попытка ОбъектДокумента.УстановитьПометкуУдаления(Истина); Исключение Отказ = Истина; ОтменитьТранзакцию(); Сообщить(«Не удалось удалить документ » + ОбъектДокумента); Прервать; КонецПопытки; КонецЦикла; ЗафиксироватьТранзакцию();

  • Исключить оператор языка запросов «ДЛЯ ИЗМЕНЕНИЯ». Заменить его можно объектом «БлокировкаДанных» с необходимостью изменить запрос и алгоритм его вызова и обработки.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *