Задать два ключа блокировки из собственной таблицы

Учебные задачи

Создаём таблицу с колонкой Ключ, связываем её с измерением КлючРезерва и устанавливаем разделяемую блокировку в собственной транзакции.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Только собственная пустая УчебнаяКонфигурацияСинтаксиса. Создайте независимый регистр сведений УчебныеРезервы, периодичность В пределах секунды, измерение КлючРезерва типа Строка длиной 50 и ресурс Количество типа Число. Записи регистра для уроков не нужны.

  2. В собственной учебной конфигурации задайте Режим управления блокировкой данных=Управляемый. Создайте серверный общий модуль УчебныеЗадачи и процедуру ВыполнитьПример() Экспорт; каждый код вставляйте в её тело отдельно.

  3. Вызывайте из собственной учебной обработки вне уже открытой транзакции. Не проводите рабочие документы, не запускайте в КА2/УНФ/УТ и не меняйте их режим блокировок ради опыта.

  4. Первый урок только создаёт описание. Остальные реально устанавливают краткую управляемую блокировку в собственной транзакции и затем отменяют её. Данные не записываются и не удаляются.

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

Разбор по шагам

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

  2. ИсточникДанных — таблица. ИспользоватьИзИсточникаДанных связывает поле пространства КлючРезерва с колонкой источника Ключ; имена намеренно разные.

  3. Поля коллекции показывают эту связь. Значение поля, заданного через источник, не следует выдавать за одну строку guide-book: источник содержит два ключа.

  4. Разделяемый режим отличается от Исключительный по совместимости блокировок. Он не является правом доступа и сам по себе не разрешает запись данных.

  5. Заблокировать выполняется в собственной короткой транзакции с отменой; доказательство конфликтов режимов требует отдельного опыта двумя сеансами.

Как проверить результат

  1. Две предварительные Истина: источник содержит два ключа и выбран Разделяемый. Связь поля указывает КлючРезерва → Ключ.

  2. При успешном завершении активной транзакции нет. Таблица осталась собственным источником, записи регистра не изменились.

Ожидаемый результат

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

На что обратить внимание

  1. Пустой/неполный источник или пропущенное сопоставление может изменить область блокировки. Не подменяйте таблицу рабочим запросом без проверки.

  2. Разделяемая блокировка не заменяет исключительную для конкурирующей операции записи по бизнес-контракту.

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

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.