Имя: Пароль:
1C
1С v8
БлокировкаДанных. Метод ИспользоватьИзИсточникаДанных
, ,
0 ИсчадиеADO
 
25.03.13
19:08
нужно наложить блокировку на сочетание измерений
погуглил, делаю так, как советует Радченко: http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=572655

ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Измерение1,Измерение2","ПолеТЧ1,ПолеТЧ2");

ошибка: не найдено поле источника данных Измерение1,Измерение2

ни в УПП, ни в УТ не нашел примера...

может кто подскажет, как грамотно сделать?
1 Fragster
 
гуру
25.03.13
19:16
а по одной?
2 Max Street
 
25.03.13
19:19
может неправильно указал ИсточникДанных? в качестве источника данных можно указывать результат запроса, табличная часть, набор записей или таблица значений
3 Reset
 
25.03.13
19:23
Разве так можно ? "Измерение1,Измерение2"
4 Reset
 
25.03.13
19:25
У кого-то, кроме радченко, оно так работает? ;)
5 ИсчадиеADO
 
25.03.13
19:28
по одной работает. Ошибка относится не к "Измерение1,Измерение2", а к "ПолеТЧ1,ПолеТЧ2" (просто они у меня одинаковые)
вроде все проверил, все верно написано. Поля есть
6 ИсчадиеADO
 
25.03.13
19:29
(2) попробовал и табличную часть, и таблицу значений (грешил на то, что может из-за того, что поля не по порядку)
7 ИсчадиеADO
 
25.03.13
19:30
(4) О! или работало, но в 12-13 релизах?
8 ИсчадиеADO
 
25.03.13
19:37
ахах, поставил режим совместимости с 13ым, заработало :)
9 ИсчадиеADO
 
25.03.13
19:38
у кого партнерка есть, отпишитесь плиз в 1с
10 Reset
 
25.03.13
19:45
(8) Проверил, подтверждаю :)
8.2.16.363, без режима совместимости говорит ошибку, с установкой в "Версия 8.2.13" - ошибку не дает
11 ИсчадиеADO
 
25.03.13
19:50
у меня 8.2.18.44
12 simol
 
25.03.13
20:00
А вы проверьте. может он теперь задается по одному, но так как это таблица то именно пары блокирует
13 Reset
 
25.03.13
20:02
Еще потестил, помоему вариант (0) просто наклыдывает блокировку как на то, так и на другое измерение (а не на сочетание), в отличие от
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Измерение1","ПолеТЧ1");
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Измерение2","ПолеТЧ2");
14 Reset
 
25.03.13
20:04
т.е.
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Измерение1,Измерение2","ПолеТЧ1,ПолеТЧ2");

аналогично
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Измерение1","ПолеТЧ1");
...
ЭлементБлокировки = Блокировка.Добавить();
...
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Измерение1","ПолеТЧ1");

Блокировка.Заблокировать();
15 simol
 
25.03.13
20:05
(14)Вот и я о том же
16 simol
 
25.03.13
20:06
Даже без ЭлементБлокировки = Блокировка.Добавить();
17 Reset
 
25.03.13
20:07
(16) Без добавление нового элемента блокирует таки сочетания
18 simol
 
25.03.13
20:07
Жаль вечер, проверил бы
19 Reset
 
25.03.13
20:22
мне показалось что при использовании
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Измерение1,Измерение2","ПолеТЧ1,ПолеТЧ2");
вообще тупо весь регистр блокирует.

То есть просто ошибка для "Измерение1,Измерение2" не выдается, получается, как если не задали "отбор" вообще.
20 Reset
 
25.03.13
20:25
то есть (14) не верно,
а
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Измерение1,Измерение2","ПолеТЧ1,ПолеТЧ2");
при совместимости "Версия 8.2.13" - не делает _Ничего_,
а без режима совместимости - дает ошибку (и правильно)
21 Reset
 
25.03.13
20:32
Т.е. как советует радченка по ссылке, не работало ни "тогда", ни сейчас.
Или я гоню под вечер. Ушел домой.
22 scanduta
 
25.03.13
21:21
Я вот так делал на экзамене на спеца по платформе все работало:

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

ЭлементБД = БД.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
ЭлементБД.ИсточникДанных = СписокНоменклатуры;
ЭлементБД.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");


БД.Заблокировать();


П.с.


В свойствах конфы должно стоять"Режим управления блокировкой данных" - "Управляемый"
23 scanduta
 
25.03.13
21:24
Если несколько измерений из твоеей же ссылки там написано:

Вот как!

Т.е. если указать ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура, Склад", "Номенклатура, Склад"), то заблокируются записи с номенклатурой и складом из ТЧ, а если эту строчку разделить на две, как указано в примере, то заблокируются все записи с такой номенклатурой и все записи с таким складом независимо друг от друга?

А если указать через запятую в использовании из источника данных, но также использовать "УстановитьЗначение", то заблокируются только записи с "объединённой" информацией - номенклатурой из ТЧ, складом из ТЧ и установленным качеством (в каждой записи все три условия выполняются)?
24 simol
 
25.03.13
23:24
Провел исследование.

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

Блокирует именно комбинации склад+номенклатура из таблицы. Прочие комбинации Склад+другаяноменклатура в другом сеансе без проблем блокируется.
25 simol
 
25.03.13
23:25
8.2.17



Процедура ПопыткаБлокировки(Вариант)
   
   РезультатЗапроса = ПолучитьТаблицу();
   ТаблицаБлокирования = РезультатЗапроса[2].Выгрузить();
   ТаблицаПопыткиБлокирования = РезультатЗапроса[3].Выгрузить();
   
   ОбщегоНазначения.СообщитьОбОшибке("Вариант1: Блокируем пары:");
   ОбщегоНазначения.СообщитьОбОшибке("Склад: " + ТаблицаБлокирования[0].Склад.Код + " Номенклатура: " + ТаблицаБлокирования[0].Номенклатура.Код);
   ОбщегоНазначения.СообщитьОбОшибке("Склад: " + ТаблицаБлокирования[1].Склад.Код + " Номенклатура: " + ТаблицаБлокирования[1].Номенклатура.Код);
   
   ОбщегоНазначения.СообщитьОбОшибке("Вариант2: Попробуем заблокировать пару:");
   ОбщегоНазначения.СообщитьОбОшибке("Склад: " + ТаблицаПопыткиБлокирования[0].Склад.Код + " Номенклатура: " + ТаблицаПопыткиБлокирования[0].Номенклатура.Код);
   
   НачатьТранзакцию();
   
   Блокировка = Новый БлокировкаДанных;
   ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
   Если Вариант = 1 Тогда
       ЭлементБлокировки.ИсточникДанных = ТаблицаБлокирования;
   Иначе
       ЭлементБлокировки.ИсточникДанных = ТаблицаПопыткиБлокирования;
   КонецЕсли;    
   ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Склад", "Склад");
   ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
   ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
   Блокировка.Заблокировать();
   
   Предупреждение("Заблокировали " + Вариант);
   
   ЗафиксироватьТранзакцию();
   
   
КонецПроцедуры

Функция ПолучитьТаблицу()
   
   
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1000
                  |    ТоварыНаСкладах.Склад,
                  |    ТоварыНаСкладах.Номенклатура,
                  |    МАКСИМУМ(ТоварыНаСкладах.Период) КАК Период
                  |ПОМЕСТИТЬ ТаблицаВсего
                  |ИЗ
                  |    РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
                  |
                  |СГРУППИРОВАТЬ ПО
                  |    ТоварыНаСкладах.Склад,
                  |    ТоварыНаСкладах.Номенклатура
                  |
                  |УПОРЯДОЧИТЬ ПО
                  |    Период
                  |;
                  |
                  |////////////////////////////////////////////////////////////////////////////////
                  |ВЫБРАТЬ ПЕРВЫЕ 2
                  |    ТаблицаВсего.Склад,
                  |    ТаблицаВсего.Номенклатура
                  |ПОМЕСТИТЬ ТаблицаБлокируем
                  |ИЗ
                  |    ТаблицаВсего КАК ТаблицаВсего
                  |;
                  |
                  |////////////////////////////////////////////////////////////////////////////////
                  |ВЫБРАТЬ
                  |    ТаблицаБлокируем.Склад,
                  |    ТаблицаБлокируем.Номенклатура
                  |ИЗ
                  |    ТаблицаБлокируем КАК ТаблицаБлокируем
                  |;
                  |
                  |////////////////////////////////////////////////////////////////////////////////
                  |ВЫБРАТЬ ПЕРВЫЕ 1
                  |    ТаблицаВсего.Склад,
                  |    ТаблицаВсего.Номенклатура
                  |ИЗ
                  |    ТаблицаВсего КАК ТаблицаВсего
                  |        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаБлокируем КАК ТаблицаБлокируем
                  |        ПО ТаблицаВсего.Склад = ТаблицаБлокируем.Склад
                  |            И ТаблицаВсего.Номенклатура = ТаблицаБлокируем.Номенклатура
                  |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                  |            ТаблицаБлокируем.Склад КАК Склад
                  |        ИЗ
                  |            ТаблицаБлокируем КАК ТаблицаБлокируем
                  |        
                  |        СГРУППИРОВАТЬ ПО
                  |            ТаблицаБлокируем.Склад) КАК ВложенныйЗапрос
                  |        ПО ТаблицаВсего.Склад = ВложенныйЗапрос.Склад
                  |ГДЕ
                  |    ТаблицаБлокируем.Склад ЕСТЬ NULL ";
   Результат = Запрос.ВыполнитьПакет();
   
   Возврат Результат;
   
КонецФункции    

Процедура ОсновныеДействияФормыВариант1(Кнопка)
   ПопыткаБлокировки(1);
КонецПроцедуры

Процедура ОсновныеДействияФормыВариант2(Кнопка)
   ПопыткаБлокировки(2);
КонецПроцедуры

26 simol
 
25.03.13
23:26
В одной сеансе блокирую пары:
Склад: 000000007 Номенклатура: ОС000000007
Склад: 000000001 Номенклатура: 258
И не завершаю транзакцию.

Во втором удачно блокируется пара:
Склад: 000000001 Номенклатура: 265
27 Reset
 
26.03.13
09:41
(24) Так это, кхм, очевидно было и так. Но, хотя наверняка есть куча мануалов и примеров на эту тему, кому-то лишний раз ткнуть вполне пойдет, пусть будет :)

Тема изначально была про странную запись через запятую в ИспользоватьИзИсточникаДанных, которая для меня оказалась неожиданностью, не встречал ранее. Теперь понятно почему :) - такого варианта использования никогда и не было.