8.х Управляемые блокировки для изменения РС

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Aerisdef, 5 сен 2016.

  1. TopicStarter Overlay
    Aerisdef
    Offline

    Aerisdef Опытный в 1С

    Регистрация:
    29 авг 2011
    Сообщения:
    319
    Симпатии:
    0
    Баллы:
    26
    Подскажите пожалуйста как с помощью управляемых блокировок можно заблокировать РС для изменения. Суть проблемы опишу на упрощенном примере, поэтому не ищите в нем логику и не предлагайте переделать структуру данных:

    Есть регистр сведений, измерение - Студент(ссылка студенты), ресурсы - группа(ссылка группы), факультет(ссылка факультеты).

    Задача: для всех студентов конкретной группы установить факультет.

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

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.573
    Симпатии:
    717
    Баллы:
    204
    Все это дело нужно обернуть в транзакцию, причем выполнение запроса должно быть внутри этой транзакции.
  3. TopicStarter Overlay
    Aerisdef
    Offline

    Aerisdef Опытный в 1С

    Регистрация:
    29 авг 2011
    Сообщения:
    319
    Симпатии:
    0
    Баллы:
    26
    Так ведь в комментарии и написал, что предполагается весь код в транзакции. Поправьте меня если я не прав, но таки блокировка устанавливается после метода Заблокировать(), а это где-то в середине транзакции будет.
  4. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
  5. TopicStarter Overlay
    Aerisdef
    Offline

    Aerisdef Опытный в 1С

    Регистрация:
    29 авг 2011
    Сообщения:
    319
    Симпатии:
    0
    Баллы:
    26
    Тему не заметил, извиняюсь, но конструкция ДЛЯ ИЗМЕНЕНИЯ не решит проблему. Данная конструкция запроса работает только в режиме автоматических блокировок, насколько мне известно. В управляемых она просто игнорируется.
  6. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    Да понятно - там про это и написали. используйте Заблокировать у объекта и все
  7. TopicStarter Overlay
    Aerisdef
    Offline

    Aerisdef Опытный в 1С

    Регистрация:
    29 авг 2011
    Сообщения:
    319
    Симпатии:
    0
    Баллы:
    26
    Код:
    Да понятно - там про это и написали. используйте Заблокировать у объекта и все
    Там в принципе вопрос был другим - как заблокировать для редактирования пользователем(т.е. на длительное время). А у меня вопрос как заблокировать внутри транзакции. Для этого, насколько я понимаю, и был придуман объект блокировка данных. Вопрос только в том, что не получается им заблокировать то, что нужно, т.к. данные в любой момент могут измениться. Для объектов типа справочника или документа, вопрос на уровне платформы решен - добавить дополнительное поле блокировки данных и заблокировать по нему, но вот у РС такой опции нет.

    П.С. в конкретной задаче можно после блокировки еще раз пробежаться по данным и выкинуть "неверные". Но вопрос то в глобальном смысле все равно не решится. А вдруг после запроса добавили еще одного студента с нужной группой, он ведь в выборку вообще не попадет. Получается что никаким образом нельзя удостоверится в том, что мы меняем записи всех студентов конкретной группы.
  8. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.573
    Симпатии:
    717
    Баллы:
    204
    Еще раз:
    Начинаем транзакцию.
    Блокируем, что нужно.
    Выполняем запрос.
    Изменяем, что нужно.
    Завершаем транзакцию.
  9. TopicStarter Overlay
    Aerisdef
    Offline

    Aerisdef Опытный в 1С

    Регистрация:
    29 авг 2011
    Сообщения:
    319
    Симпатии:
    0
    Баллы:
    26
    Код:
    Блокируем, что нужно.
    
    Для того чтобы узнать что блокировать нужно выполнить запрос, поэтому последовательность все-таки такая:

    Начинаем транзакцию.
    Выполняем запрос.
    Вот тут происходит вмешательство транзакции другого пользователя.
    Блокируем, что нужно(по запросу уже не актуальному).
    Изменяем, что нужно.
    Завершаем транзакцию.
  10. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.573
    Симпатии:
    717
    Баллы:
    204
    У вас известна группа студентов, по ней и блокируйте - никто другой не сможет изменить группу у студента, пока не завершится ваша транзакция.
    Группу и факультет необходимо сделать измерением, ибо это даст уникальность принадлежности студента группе и факультету.
    Сейчас у вас один студент может попасть в разные группы и факультеты, что физически не возможно, разве что разнесены по времени обучения.
  11. TopicStarter Overlay
    Aerisdef
    Offline

    Aerisdef Опытный в 1С

    Регистрация:
    29 авг 2011
    Сообщения:
    319
    Симпатии:
    0
    Баллы:
    26
    Сейчас измерение студент, а значит контроль уникальности не даст ему присвоить разные группы или факультеты. Если сделать факультет и группу измерением - тогда как раз наоборот у одного студента могут быть различные группы/факультеты. Блокировать по группе нельзя - т.к. блокировка в РС осуществляется только по измерениям. Пример вымышленный, в настоящем регистре много ресурсов, если каждый из них делать измерением, то можно серьезно поплатиться производительностью при построении кластерного индекса.
  12. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.573
    Симпатии:
    717
    Баллы:
    204
    Прошу прощения, ступил про измерения. Все верно у вас.
    В вашем случае задача блокировки не решается в текущей структуре метаданных.
    Так понимаю, у вас должно быть измерением группа, а студент - ресурсом.
    Aerisdef нравится это.
  13. TopicStarter Overlay
    Aerisdef
    Offline

    Aerisdef Опытный в 1С

    Регистрация:
    29 авг 2011
    Сообщения:
    319
    Симпатии:
    0
    Баллы:
    26
    У всех бывает. Про возможность переноса ресурса в измерение я думал, но не хотелось грузить регистр лишними измерениями, поэтому и решил спросить тут. Вдруг существует иной путь, но это похоже единственно возможный. Спасибо за участие в проблеме.

Поделиться этой страницей