Имя: Пароль:
1C
1С v8
Управляемая блокировка в 1С 8.3
,
0 Dmitry1c
 
01.05.22
15:58
Управляемая блокировка в 1С 8.3

правильно понимаю, что наложение управляемой блокировки (с помощью объекта БлокировкаДанных) просто повышает уровень изоляции транзакции с READ COMMITTED до REPEATABLE READ на записи отбора при наложении?

И вся суть оптимизации и параллельности в 1С 8.3 управляемых блокировок сводится именно к грамотному повышению изоляции до REPEATABLE READ только там, где надо?
1 H A D G E H O G s
 
01.05.22
16:22
Нет, не правильно.
2 Dmitry1c
 
01.05.22
16:29
(1) а что не так, обладатель эксперта? :) я сдавать его не планирую, просто для новой работы требуется харды подтянуть.
3 Dmitry1c
 
01.05.22
16:41
>>Предназначен для явной блокировки данных от чтения или изменения другими сессиями.

вообще если читнуть в конфигураторе, то для блокировки от ЧТЕНИЯ или ИЗМЕНЕНИЯ

запрещает ли уровень изоляции REPEATABLE READ читать прочитанные ранее данные? В этом неправильность?
4 Dmitry1c
 
01.05.22
16:41
(3) запрещает ли уровень изоляции REPEATABLE READ читать прочитанные ранее данные другой транзакцией? В этом неправильность?

быстрофикс
5 Dmitry1c
 
01.05.22
17:09
Я еще не учел, что упр. блокировки бывают разделямые(S) и исключительные(X)

ы
6 Dmitry1c
 
01.05.22
17:18
(1) +охренеть, управляемые блокировки работают на уровне сервера 1С и вообще не имеют отношения к уровню изоляции транзакций в сервере СУБД ?
7 dreizehn
 
01.05.22
17:18
(2) > требуется харды подтянуть.

https://uc1.1c.ru/course/podgotovka-k-1s-ekspertu-po-tehnologicheskim-voprosam-osnovnoj-kurs/
Сдавать не обязятельно.
8 Dmitry1c
 
01.05.22
17:19
(7) я сейчас книгу эксперта читаю
9 H A D G E H O G s
 
01.05.22
17:29
(6) Вооот.
10 H A D G E H O G s
 
01.05.22
17:29
(6) Упр. блокировка - это уровень между RC и RR
11 Dmitry1c
 
01.05.22
17:37
Да, я понял, сейчас уже с ИТС перечитываю:
В 8.3 в режиме управляемых блокировкок клиент-серверная СУБД работает в режиме READ COMMITTED (SNAPSHOT)
и ни в каком другом режиме
А на уровне сервера 1С можно управлять дополнительно с помощью управляемых блокировок для обеспечения разделяемой (Shared) или исключительной (eXclusive) блокировки.

Сейчас столкнулся с тем, что не могу придумать, когда нужна разделяемая управляемая блокировка - когда ее надо кодить?
Ну надо, чтобы другая транзакция не могла записать данные, но могла прочитать. А живой пример этого - какой?
12 Dmitry1c
 
01.05.22
17:38
Посмотрел в ERP порядка 200 разделяемых блокировок и порядка 800 исключительных.
13 Dmitry1c
 
01.05.22
17:39
Короче разделяемый надо ставить тогда, когда мы записали объект (зачем-то), а потом планируем еще раз записать объект, но при этом в промежутках между этими двумя записями надо позволить другим транзакциям считать объект
14 Dmitry1c
 
01.05.22
17:42
Походу разделяемая блокировка предназначена для борьбы с фантомами, исключительная - с проблемой "неповторяемого" чтения
15 ДедМорроз
 
01.05.22
19:05
Исключительная блокировка - это когда мы что-то изменяем и хотим,чтобы до окончания транзакции никто не мог ни прочитать ни записать объект,другими словами,не позволяем транзакциям выполняться параллельно.
Разделяемая блокировка - это когда мы что-то читаем и хотим,чтобы параллельно никто туда не мог записать. Любая служебная информация для транзакции,которая в процессе транзакции не меняется,но может повлиять на ее ход,дрлжна блокировпться в разделяемом режиме.
16 Dmitry1c
 
01.05.22
19:48
(15) спасибо
17 Dmitry1c
 
03.05.22
07:12
(7) посмотрел содержание этого курса, там куча инфы про работу с ЦУП-ом.

Мне оно нафиг не надо.
18 Dmitry1c
 
03.05.22
16:57
Вот еще вопрос возник.

Нафига в регистре ЕРП "Партии прочих расходов" проиндексировано поле "Организация"?

поидее элементов в справончнике "Организация" немного, зачем его индексировать? ради т.н. "покрывающего индекса"?
19 ДедМорроз
 
03.05.22
17:59
(18)здрасьте,приехали.
А отбор по организации как делать?
20 H A D G E H O G s
 
03.05.22
18:00
(18) По идее вам рановато такие темы создавать
21 Dmitry1c
 
03.05.22
19:32
(19) (20) хорошо.

почему в регистре "ТоварыНаСкладах" в той же ЕРП поле "Номенклатура" не проиндексировано?
22 piter3
 
03.05.22
19:33
(21) идешь в тп и там спрашиваешь
23 H A D G E H O G s
 
03.05.22
19:38
(21) "поидее элементов в справончнике "Организация" немного, зачем его индексировать?"

Почему ты задал этот вопрос?
24 Dmitry1c
 
03.05.22
19:41
(23) ну вот есть у тебя три юрлица в базе.

Как будет работать индекс для 1000 записей в таблице (предположим, что по 333 записи на каждую организацию)

у тебя индекс на первом уровне уведет тебя в 333 записи ... и среди них потом будет обычный TABLE SCAN? профит от этого индекса - в 3 раза быстрее скорость будет?
25 hhhh
 
03.05.22
19:47
(21) вы ЮМОРИСТ. каждый первоклассник знает, что по первому измерению регистр индексируется всегда. Поэтому галку Индексировать на нем никто не ставит. И в типовых нигде ее нет. В Товары на складах первый индекс по номенклатуре.
26 H A D G E H O G s
 
03.05.22
19:47
(24) А, не, я испугался, что ты применимость индекса оцениваешь по количеству элементов в справочнике, а не по селективности основной таблицы.

А по ситуации с ПартииПрочихРасходов - я думаю, там проеб 1С, ставить на первое место Организацию и индексировать ее - ну такое.
27 H A D G E H O G s
 
03.05.22
19:48
(25) Для таблицы движений это не так.
28 Dmitry1c
 
03.05.22
19:48
(25) ерп 2.5, регистр "ПартииПрочихРасходов", первое измерение - Организация, проиндексировано
29 Dmitry1c
 
03.05.22
19:49
(26) понял, спасибо
30 Dmitry1c
 
03.05.22
19:51
(25) он не по первому измерению, а по всем измерениям, включая первое. Я по сути сам себе и ответил, почему "Номенклатура" в регистре "Товары на складах" не проиндексирована: не нужно, она входит в кластерный составной индекс, который создается для всех измерений, входящих в регистр
31 H A D G E H O G s
 
03.05.22
19:54
(30) Вы все забываете про таблицу движений
32 Dmitry1c
 
03.05.22
19:54
(30) +только опять же противоречие у себя выявил: а в каком случае надо для регистра измерение ставить "Индексировать"? если есть всегда кластерный составной индекс, в который входят все измерения.

Он в работает получается медленнее для не первого измерения в сравнении с индивидуальным индексом измерения?
33 hhhh
 
03.05.22
19:56
(30) ну да, похоже потому что измерение номенклатура первое в составном индексе, делать по нему отдельный индекс не имеет смысла.
34 ДедМорроз
 
04.05.22
18:18
Вообще,там есть галка основной отбор,позволяющая делать отбор по этому измерению.
И,в подчиненном регистре первое индексированное поле - регистратор,по которому и отобрать можно.
Селективность индекса - это отдельный вопрос,но,в любом случае,index scan лучше,чем full scan.
С учетом того,что при full scan нужно прочитать каждую запись,а по индексу мы записи читать будем,если к нас доп.условия или уже в процессе получения и выдачи результата.
35 H A D G E H O G s
 
04.05.22
18:25
(34) "index scan лучше,чем full scan.
С учетом того,что при full scan нужно прочитать каждую запись,а по индексу мы записи читать будем,если к нас доп.условия или уже в процессе получения и выдачи результата."
Настало время интересных историй.
36 Timon1405
 
04.05.22
18:31
(34) галка основной отбор, позволяющая делать отбор по этому измерению
делать отбор где?
37 H A D G E H O G s
 
04.05.22
18:45
(36) При обмене в планах обмена. Но к делу это мало относится. Просто надо знать, что будет еще один отдельный индекс по измерениям, которые указаны этими галками, если только этот индекс не совпадает по полям с уже существующими.
38 Fragster
 
гуру
04.05.22
18:49
(37) вроде не только
39 H A D G E H O G s
 
04.05.22
18:58
40 ДедМорроз
 
04.05.22
19:06
Еще в независимом регистре,включающая отбор по измерениям.
41 H A D G E H O G s
 
04.05.22
19:09
(40) А еще и больше нет других регистров и их типов, в которых есть "основной отбор"

Живу в России я, а жил в Союзе я --
А это все была иллю-зи-я.
На самом деле весь мир нам кажется,
Вокруг нас матрица, как в фильме "Матрица".
42 ДедМорроз
 
04.05.22
20:02
(41)естественно,что нету,так как все остальные подчинены решистратору,и если не рассматривать регистр сведений,то все остальные регистры используют решистратор и номер записи как первичный ключ.
43 rsv
 
04.05.22
20:08
(0) когда устанете , в свойствах конфы поставте
Режим блокировок автомат , все последовательно начнут.
44 ДедМорроз
 
04.05.22
20:12
(43) вот не надо.
Блокировки начнут работать на уровне sql,и очень большая вероятность столкновений будет.
А так,две транзакции,не затронувшие общие ресурсы вполне себе параллельно выполняться будут.
45 Dmitry1c
 
04.05.22
20:52
(43) для однопользовательской работы покатит
46 ДедМорроз
 
04.05.22
21:05
(45)для однопользовательской и управляемый режим годится - блокировки-то можно не ставить вообще.
47 Dmitry1c
 
05.05.22
08:13
https://its.1c.ru/db/metod8dev#content:5842:hdoc

Основные индексы, создаваемые 1С:Предприятием:

    индекс по уникальному идентификатору (ссылке) для всех объектных сущностей (справочники, документы и т.д.);
    индекс по регистратору (ссылке на документ) для таблиц движений регистров, подчиненных регистратору;
    индекс периоду и значениям всех измерений для __итоговых таблиц__ регистров накопления;
    индекс периоду, счету и значениям всех измерений для итоговых таблиц регистров бухгалтерии.


Вот ответ, зачем индексируется первое измерение "Организация" в регистрах накопления. Для взаимодействия с физическими таблицами, а не виртуальными. Там нет индекса, а он нужен.
48 Dmitry1c
 
05.05.22
09:59
Можно еще вопрос. В ЕРП есть следующий программный код в модуле менеджера документа "Этап производства"

                Блокировка = Новый БлокировкаДанных;
                
                ЭлементБлокировки = Блокировка.Добавить("Документ.ЭтапПроизводства2_2");
                ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка);
                
                Блокировка.Заблокировать();
                
                ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
                Если ДокументОбъект = Неопределено ИЛИ ДокументОбъект.Статус <> СтатусСформирован Тогда
                    ВызватьИсключение НСтр("ru = 'Обрабатываемый объект не соответствует условиям отбора.';
                                            |en = 'Processed object does not match filter conditions.'");
                КонецЕсли;
                
                ДокументОбъект.Статус = Перечисления.СтатусыЭтаповПроизводства2_2.КВыполнению;
                
                ДокументОбъект.УстановитьРежимПакетнойПередачиКВыполнению();
                
                ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
                
                ЗафиксироватьТранзакцию();

зачем здесь блокировка?
49 Dmitry1c
 
05.05.22
10:01
(48) сам задал, сам отвечу: пока мы манипулируем с объектом, чтобы другой с ним также не "проманипулировал" ...

несмотря на то, что это три безобидные и мгновенные строчки кода
50 Dmitry1c
 
05.05.22
10:06
&НаСервере
Функция ОбновитьЦелевыеПараметрыНаправления(ЦелевыеПараметры)
    
    ДанныеСохранены = Истина;
    
    НачатьТранзакцию();
    Попытка
        
        БлокировкаДанных = Новый БлокировкаДанных;
        ЭлементБлокировкиДанных = БлокировкаДанных.Добавить("Справочник.НаправленияДеятельности");
        ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", НаправлениеДеятельности);
        ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный;
        БлокировкаДанных.Заблокировать();
        
        НаправлениеОбъект = НаправлениеДеятельности.ПолучитьОбъект();
        ЗаполнитьЗначенияСвойств(НаправлениеОбъект, ЦелевыеПараметры);
        НаправлениеОбъект.Записать();
        
        ЗафиксироватьТранзакцию();
        
    Исключение
        
        ОтменитьТранзакцию();
        
        ДанныеСохранены = Ложь;
        
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
            НСтр("ru = 'Для направления деятельности не удалось сохранить новые целевые значения.';
                |en = 'Cannot save new target values for line of business.'"),
            ,
            "Контракт");
        
    КонецПопытки;
    
    Возврат ДанныеСохранены;
    
КонецФункции







вот тут тоже самое: но непонятно, когда надо блокировку ставить, а когда не надо? мы же частенько через ПолучитьОбъект() меняем объекты, что теперь, каждый раз блокировку управляемую хреначить и транзакцию явно открывать?
51 ptiz
 
05.05.22
10:25
(50) Может там ПриЗаписи еще другие объекты меняются? Чтоб уж гарантированно "кашу" не получить.
52 Dmitry1c
 
05.05.22
10:26
(51) вот хотелось бы понять, откуда ваще это появилось ... ибо я не понимаю
53 ptiz
 
05.05.22
10:28
(52) Хотя один фиг это в одной транзакции происходит. Возможно, планировали и другие объекты менять в этой процедуры.
54 lodger
 
05.05.22
10:34
(52) так в самой первой статье про Управляемые Блокировки же написано
...
Явная управляемая блокировка должна устанавливаться перед чтением данных:
- если считываются данные, которые в дальнейшем должны быть изменены;
...
https://its.1c.ru/db/v8std/content/460/hdoc
55 rozer76
 
05.05.22
10:34
56 rozer76
 
05.05.22
10:36
+ (55) без этого есть риск словить дедлок
57 Dmitry1c
 
05.05.22
10:56
(54) (55) спасибо, погляжу сейчас.
58 H A D G E H O G s
 
05.05.22
10:58
(47) welcome to the club body!
https://youtu.be/yrHXMhrs6Qg
59 Dmitry1c
 
05.05.22
11:01
(54) т.е. это по сути все равно что каждый раз, когда программист пишет Объект = ОбъектныйТип.ПолучитьОбъект(); с целью дальнейшей записи объекта необходимо открывать явную транзакцию и создавать управляемую блокировку?
60 Dmitry1c
 
05.05.22
11:29
Кажется я еще понял одну причину, по которой следует использовать ОбщегоНазначения.ЗначенияРеквизитовОбъекта - в данном случае не требуется, согласно стандартам, накладывать управляемую блокировку, т.к. чтение происходит не в объектной модели, а запросом.
61 lodger
 
05.05.22
11:40
(59) (60) ну если следовать простой формальной логике и простой оптимизации, то метод ПолучитьОбъект() нужен ТОЛЬКО для того чтобы записать его в дальнейшем.
а значит, все места с методом ПолучитьОбъект() надо оформить в управляемую блокировку.
если нужны данные объекта, пускай даже все - получите запросом.
62 Dmitry1c
 
05.05.22
11:41
(61) просто я всегда ранее использовал ПолучитьОбъект() - в целях обработки данных - и никогда не использовал упр. блокировок
63 lodger
 
05.05.22
12:24
(62) если не нужно его записывать и лень разбираться в запросах, то можно через точку ковыряться в реквизитах - эффект тот же.
64 Dmitry1c
 
05.05.22
13:04
(63) через точку у тебя объект прочитается вместе с таб. частями, даже если данные табличных частей тебе не нужны
65 lodger
 
05.05.22
14:15
(64) через ПолучитьОбъект, как в (62) будто ТЧ не прочитаются?
66 Dmitry1c
 
13.05.22
22:54
Про индексы вопросы остались


1. для регистра сведений 1С создает "составной индекс" - что сие есть?
просто соединяет колонки, входящие в индекс?
например, индекс состоит из

Период|Измерение1СсылочныйТип|Измерение2СсылочныйТип
сам индекс физически будет содержать значения вида "ПериодГуид1Гуид2" или как-то по-другому?

2. можно ли средствами 1С создать т.н. покрывающий индекс?
67 H A D G E H O G s
 
13.05.22
22:58
(66)
1. Да
2. Можно для всех других порядков измерений.
68 H A D G E H O G s
 
13.05.22
23:00
Проиндексируй
Измерение2СсылочныйТип
и 1С создаст тебе некластерный индекс
"ПериодГуид2Гуид1"
который будет покрывающим
69 Dmitry1c
 
14.05.22
09:12
(68) прошу прощения, но ты различаешь покрывающий индекс и составной индекс?

составной индекс, это индекс, создаваемый конструкцией к SQL вида
SELECT OrderID, OrderDate
FROM Sales
WHERE OrderID = 12345;

покрывающий индекс, это индекс, который создается конструкцией SQL вида

CREATE NONCLUSTERED INDEX ix_orderid
ON dbo.Sales(OrderID)
INCLUDE (OrderDate);

Т.е. в первом случае КАК Я СЕЙЧАС ПОНИМАЮ идет конкатенация полей (?верно), а во втором случае - конкатенация составной части индекса и добавление отдельных столбцов С ДАННЫМИ для того, чтобы индекс стал покрывающим
70 Dmitry1c
 
14.05.22
09:13
(69) просто в курсах от 1с и от курсы-по-1с.рф я описание этих различий о составном и о покрывающем индексе НЕ встретил
71 Dmitry1c
 
14.05.22
09:22
(69) первый пример запроса некорректный, там должно быть что-то вроде

CREATE NONCLUSTERED INDEX ix_orderid

ON dbo.Sales(OrderID, OrderDate)
72 Dmitry1c
 
14.05.22
09:25
У 1С почему-то "покрывающим" индексом называется такой индекс, который является составным и просто "покрывает"-содержит- все поля, которые будут в условии запроса по этому индексу

мне кажется опять что-то где-то 1Сники напортачили
73 Dmitry1c
 
14.05.22
10:54
Вот в итоге ключевой вопрос философии индексов 1С

Если проиндексировать поле "Реквизит1" у простого справочника, то он создаст индекс

а) Конструкцией вида

CREATE NONCLUSTERED INDEX ИмяИндекса
ON dbo.Sales(Реквизит1, Ссылка)

б) Конструкцией вида

CREATE NONCLUSTERED INDEX ИмяИндекса
ON dbo.Sales(Реквизит1)
INCLUDE (Ссылка);
74 Dmitry1c
 
14.05.22
11:02
Короче куплю сегодня лицензию на сервер 1С... для разработчка которая, посмотрю и отпишусь
75 ДедМорроз
 
14.05.22
12:14
Когда индекс не кластерный,то есть вторичный,то он создает соответствие индексировпнных полей класткрному индексу,то есть первичносу ключу,так как другой ссылки на записи в базе нет.
Если бы в базе был некластерный первичный индекс,а записи располагались в порядке добавления,то разница бы была.
А так,по идее,две конструкции дадут одно и то же на выходе.
76 ДедМорроз
 
14.05.22
12:19
А блокировку ставят,чтобы избежать ошибки параллельного выполнения.
Если два потока (на сервере) будут одеовременно изменять один и тот же документ,то прочитают до изменения они одно и то же,а вот при записи будет проверка версии - первый запишет,а второй получит ошибку различия версии объекта.
77 Dmitry1c
 
14.05.22
13:33
Вот индекс в MS SQL включая Include-поля

https://i0.wp.com/www.malinga.me/wp-content/uploads/2020/07/physical-design-example-non-clustered-index-with-includes-3.png?resize=1024%2C993&ssl=1

создает ли 1С include-поля ?
78 ДедМорроз
 
14.05.22
13:52
Там где индексировать с доп.упорядочиваниеи,вполне вероятно,что используются включаемые поля по полям упорядочивания.
В остальных случаях явно нет.
79 ДедМорроз
 
14.05.22
14:09
https://use-the-index-luke.com/blog/2019-04/include-columns-in-btree-indexes
Здесь можно почитать,как индекс с включаемыми полями работает.
И понять,что раз Oracle его не умеет,то 1с его использовать не будет из-за кросплатформенной совместимости,хотя postgresql его умеет без проблем с 11-той версии.
80 Dmitry1c
 
14.05.22
14:10
(79) т.е. в платформе 1С покрывающие индексы при работе не создаются

а то что 1С называет покрывающим индексом, это просто составной индекс ?
81 ДедМорроз
 
14.05.22
14:52
В 1с есть промежуточный уровень sdbl,который абстрагирован от способностей конкретного sql-сервера,а уже после все действия преобразуются в команды для конкретного sql-сервера.
Можно получить структуру хранения для всей базы и посмотреть,что она из себя представляет и понять,что в ней нет места include.
82 ДедМорроз
 
14.05.22
15:01
Вообще,в терминах sql покрывающий индекс рассматривается для конкретного запроса - это индекс,позволяющий выполнить этот запрос.
Разница в том,что при определении включаемых полей есть разница между покрывающим индексом и композитным (который тоже покрывпющий,но содержит все необходимые поля в структуре индексирования).
Соответственно,1с будет называть покрывающим конпозитный индекс.

Еще следует отметить,что все верно доя баз данных,использующих кластерный индекс для первичного ключа,так как в дополнительных индексах хранится значение первичного ключа по которому нужно искать запись.
В базах,где нет кластерного индекса,в индексе хранится ссылка на запись,и ее поиск так много времени не занимает,поэтому там нет смысла в дополнительных полях в индексе.
83 ДедМорроз
 
14.05.22
15:06
Например, ibm db требует явно указать,что для таблицы применяется кластерный индекс по первичному ключу,соответственно,если этого не сказано,то механизм индексирования будет работать по-другому.
Но,насколько я понимаю,1с требует кластерный индекс для своих таблиц.
84 Dmitry1c
 
14.05.22
15:45
(73) проверил

создает индекс, включая в ключ индекса поле "Ссылка"
85 Dmitry1c
 
14.05.22
15:46
А нельзя через Management Studio посмотреть содержимое листьев индекса в виде таблицы?
86 Dmitry1c
 
14.05.22
15:49
Получается платформа 1С лишает возможности использовать механизм включения столбцов основной таблицы в индексы

Очень жаль, поидее хороший с точки зрения производительности механизм
87 Dmitry1c
 
14.05.22
16:00
Чет я не догоняю

Если у нас справочник и мы ведем поиск по неиндексированному реквизиту, у нас всегда будет CLUSTERED INDEX SCAN?

мы TABLE SCAN никогда не увидим, потому что существует кластерный индекс для этой таблицы ?
88 ДедМорроз
 
14.05.22
16:10
Кластерный индекс - это и есть сама таблица.
Table scan - это если для таблицы нет кластерного индекса.
Например,если в таблице вообще нет первичного ключа.
89 H A D G E H O G s
 
14.05.22
17:57
(86) Мелочи, в сравнении с отсутствием сделать составной индекс для нескольких полей объектного типа. Приходится извращаться с отдельными регистрами поиска
90 ptiz
 
14.05.22
18:14
(89) "извращаться с отдельными регистрами поиска" - это как? Можно пример?
91 H A D G E H O G s
 
14.05.22
18:30
(90) Не уверен, что смогу объяснить, но вот запрос к регистру АСФКлючиПоискаДиапазоновМарок, в которые вынесены поля НачалоПолногоДиапазона, КонецПолногоДиапазона из справочника ДиапазоныМарок.

Да, только в 2 из 3 случаев будет использован индекс полностью, без остаточного предиката, но и то хлеб.


    "ВЫБРАТЬ
    |    ТаблицаДиапазонов.НачалоДиапазона КАК НачалоДиапазона,
    |    ТаблицаДиапазонов.КонецДиапазона КАК КонецДиапазона,
    |    ТаблицаДиапазонов.ИдентификаторСтроки КАК ИдентификаторСтроки,
    |    ТаблицаДиапазонов.СостояниеМарок КАК СостояниеМарок
    |ПОМЕСТИТЬ ТаблицаДиапазонов
    |ИЗ
    |    &ТаблицаДиапазонов КАК ТаблицаДиапазонов
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    Диапазоны.Диапазон КАК Диапазон,
    |    Диапазоны.НачалоПолногоДиапазона КАК НачалоДиапазона,
    |    Диапазоны.КонецПолногоДиапазона КАК КонецДиапазона,
    |    ТаблицаДиапазонов.НачалоДиапазона КАК НачалоДиапазонаПоиска,
    |    ТаблицаДиапазонов.КонецДиапазона КАК КонецДиапазонаПоиска,
    |    ТаблицаДиапазонов.ИдентификаторСтроки КАК ИдентификаторСтроки,
    |    ТаблицаДиапазонов.СостояниеМарок КАК СостояниеМарок
    |ПОМЕСТИТЬ ПромежуточныеДиапазоны
    |ИЗ
    |    РегистрСведений.АСФКлючиПоискаДиапазоновМарок КАК Диапазоны
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаДиапазонов КАК ТаблицаДиапазонов
    |        ПО Диапазоны.НачалоПолногоДиапазона <= ТаблицаДиапазонов.НачалоДиапазона
    |            И Диапазоны.КонецПолногоДиапазона > ТаблицаДиапазонов.НачалоДиапазона
    |
    |ОБЪЕДИНИТЬ
    |
    |ВЫБРАТЬ
    |    Диапазоны.Диапазон,
    |    Диапазоны.НачалоПолногоДиапазона,
    |    Диапазоны.КонецПолногоДиапазона,
    |    ТаблицаДиапазонов.НачалоДиапазона,
    |    ТаблицаДиапазонов.КонецДиапазона,
    |    ТаблицаДиапазонов.ИдентификаторСтроки,
    |    ТаблицаДиапазонов.СостояниеМарок
    |ИЗ
    |    РегистрСведений.АСФКлючиПоискаДиапазоновМарок КАК Диапазоны
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаДиапазонов КАК ТаблицаДиапазонов
    |        ПО Диапазоны.НачалоПолногоДиапазона < ТаблицаДиапазонов.КонецДиапазона
    |            И Диапазоны.КонецПолногоДиапазона >= ТаблицаДиапазонов.КонецДиапазона
    |
    |ОБЪЕДИНИТЬ
    |
    |ВЫБРАТЬ
    |    Диапазоны.Диапазон,
    |    Диапазоны.НачалоПолногоДиапазона,
    |    Диапазоны.КонецПолногоДиапазона,
    |    ТаблицаДиапазонов.НачалоДиапазона,
    |    ТаблицаДиапазонов.КонецДиапазона,
    |    ТаблицаДиапазонов.ИдентификаторСтроки,
    |    ТаблицаДиапазонов.СостояниеМарок
    |ИЗ
    |    РегистрСведений.АСФКлючиПоискаДиапазоновМарок КАК Диапазоны
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаДиапазонов КАК ТаблицаДиапазонов
    |        ПО Диапазоны.КонецПолногоДиапазона < ТаблицаДиапазонов.КонецДиапазона
    |            И Диапазоны.НачалоПолногоДиапазона > ТаблицаДиапазонов.НачалоДиапазона
    |;
92 ДедМорроз
 
14.05.22
18:51
Ваши марки хрень полная.
Хэш-индекс нужно использовать,который ms5 и в guid его родимый.
Ну и на случай совпадения проверять само значение,и никаких проблем с префиксами и прочим мусором не будет.
По крайней мере,абзацы текста переменной длины по хэш-индексу искались на ура,а длина у них поболее будет,чем марки.
93 H A D G E H O G s
 
14.05.22
18:52
(92) Ваше мнение очень важно для нас.
94 ДедМорроз
 
14.05.22
20:29
Ладно,не хотел вас ни чем обидеть.
Просто,в некоторых случаях хэш дает такой прирост в скорости,что потом кажется,что можно внзде использовать.

С марками же - порядок не важен,основная последовптельность (исключая криптохвост)уникальна и важно только совпадение.
Да,конечно,может потребоваться найти марку,похожую на другую в пределах какого-то числа символов,но это,в общем случае,без полного сканирования таблицы невозможно,так как обычный индекс тут ни чем не поможет.
95 ДедМорроз
 
14.05.22
20:32
Задачп поиска килобайта с одним-двумя изменениями требует использования кодов рида-соломона и прогулки по ближайшим в пространстве этих кодов.
96 H A D G E H O G s
 
14.05.22
20:40
(94) (95) Ага. Все верно. Проблема только в том, что в (91) - не марки.
97 ДедМорроз
 
14.05.22
21:56
Ну там интервалы.
С интервалами интереснее.
Тут одним индексом не обойдешься,так как нужно и по началу (и возможно с концом) и по концу,или переводить интервалы в неперекрывающиеся,тогда можно начало и конец положить в один индекс и все находить сканированием индекса.
98 Dmitry1c
 
15.05.22
10:13
Вот еще вопрос достойный 1С Экспертов


Каким образом происходит индексирование в соответствии, если в соответствии ключом является составной тип данных ?
99 Dmitry1c
 
15.05.22
10:15
(98) ну, не составной конечно, не обязательно.
100 H A D G E H O G s
 
15.05.22
10:40
(98) в соответствие пихается
Хэшключа
Ключ
Значение

Ищется, естественно по хэшу
101 rphosts
 
15.05.22
10:55
(100) откуда инфа? Снифером снял или утечка из конторы?
102 H A D G E H O G s
 
15.05.22
10:59
(101) я бы сделал так.
103 Dmitry1c
 
15.05.22
11:09
(100)

блин, круто.


Вообще аналог в ЯВУ соответствия - это HashMap

поэтому очевидно предположить, что ключ соответствия хэшируется и индекс создается уже по хэшам, а не по самому значению ключа.
ну я это так думаю, тут уже надо у разрабов платформы спрашивать
104 rphosts
 
15.05.22
11:13
(102) ну это почти очевидно, но порой в конторе делают несколько не так как все от них ждут
105 Dmitry1c
 
15.05.22
11:14
а у объекта ТаблицаЗначений создаются какие-нибудь индексы ?
106 rphosts
 
15.05.22
11:14
(103) даже для длинного хэша значения хэша могут совпадать для разных исходных значений хэш-функции.
107 Dmitry1c
 
15.05.22
11:15
Опа

ТЗ.Индексы.Добавить("Колонка1");

я и не знал о таком ...
108 rphosts
 
15.05.22
11:15
(105) продам СП... дорого....
109 rphosts
 
15.05.22
11:15
(107) эх, уже не продать...
110 Dmitry1c
 
15.05.22
11:16
спустя 10 лет работы узнать что таблицу значений можно проиндексировать :) нормально так
111 xXeNoNx
 
15.05.22
11:42
(0) сдается мне я знаю в какую контору ты пришел и зачем тебе kvm.
112 H A D G E H O G s
 
15.05.22
11:44
(111) Сдается мне, я знаю, какой веткой ты ошибся..
113 xXeNoNx
 
15.05.22
11:45
(112) нет, если бы не эта ветка, я бы этого не понял.
114 ptiz
 
15.05.22
12:32
(91) Я понял так:
- есть огромный список документов/справочник
- создаем РС, в который ПриЗаписи каждого документа пишутся поля (измерения), которые используются для поиска в тяжелых запросах
- в этих тяжелых запросах для быстрого поиска лезем в РС (а его поля индексированы в нужном нам порядке) и быстро находим Ссылку на документ
Тут, видимо, аналогично, только уже не надо лезть в таблицу самого документа/справочника, т.к. все данные уже в АСФКлючиПоискаДиапазоновМарок.
115 H A D G E H O G s
 
15.05.22
12:43
(114) Да
116 ДедМорроз
 
15.05.22
12:46
При желании,индекс можно создать и по самим значениям,точнее,для объектов,сначпла по типу,а потом по адресу,ничуть не медленнее будет,но будет двухуровневый индекс,а в случае хэша - одноуровневый.
117 H A D G E H O G s
 
15.05.22
12:49
(116) Ну давай, расскажи нам.
118 Dmitry1c
 
15.05.22
14:22
(116) ?! это как
119 ДедМорроз
 
15.05.22
14:38
И что тут такого сложного?
Для типов есть rtti
А что такое объект в памяти? Это адрес,где размещаются какие-то данные объекта,и этого достаточно для того,чтобы различать объекты.
Правда,чтобы не спутать два интерыейса одного объекта,обычно,договариваются,по какому или по каким интерыейсам идентифицировать объект.
Собственно говоря,хэш-то тоже от этого значения будет строится.
Можно,конечно,сериализовать объект и построить хэш от его данных,но тут можно получить что два документа й1с полученные из одной ссылки,будут одинаковыми,пока в них не запишут разные значения.
Опять же,не зря 1с придумала термин МутабельныйОбъект.
120 H A D G E H O G s
 
15.05.22
17:04
(119) Ты втираешь какую-то дичь
121 ДедМорроз
 
15.05.22
17:22
Какая дичь?
Это основы программирования на Си.
Как в Си можно сравнить два объекта? Только сравнить ссылки.
Ну и ничего не мешает упорядочить объекты по адресу в памятм и так их искать - все остальные методы тркбуют хоть что-то знать о внутренностях объекта.
Да,наверное,людям,которые не программировпли на ассемблере,сложно понять,что есть объекты и что есть данные.
122 Dmitry1c
 
16.05.22
08:09
Вот еще прикол.

У меня есть самописная учетная система для личных финансов.
Закинул ее на клиент-серверный режим.

В итоге замером профайлера при проведении документа увидел:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRANSACTION


А где SNAPSHOT ?
123 Dmitry1c
 
16.05.22
15:12
https://infostart.ru/1c/articles/936914/

вот здесь вот, кстати, в разделе
>>Можно ли сделать покрывающий индекс

нашелся ответ на ранее поставленный мной вопрос про INCLUDE и некорректность термина "покрывающий индекс" у 1С
124 Dmitry1c
 
16.05.22
17:00
Еще прикол из-за разделителя ОбластьДанныхОсновныеДанные:

сделал запрос по индексированному измерению регистра сведений, и не по индексированному измерению регистра сведений

в обоих случаях получаю Clustered Index Seek в визуализации плана запроса, пушо первым полем индекса идет разделитель ... хотя во втором случае явно происходит сканирование таблицы

что помогает - надпись Missing Index (Impact 94) ...
125 H A D G E H O G s
 
16.05.22
18:06
(124) Ничего не понял, но очень интересно.
126 Dmitry1c
 
16.05.22
18:08
(125) из-за разделителя областей данных не очевидно, что Clustered Index Seek на самом деле является Scan'ом

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

а потом идет сканирование всего индекса

но план запроса отображает как будто идет SEEK, хотя от SEEK по факту там нулевой разделитель области данных
127 H A D G E H O G s
 
16.05.22
18:12
(126) Да, есть такое.
128 H A D G E H O G s
 
16.05.22
18:13
(126) Но ты молодец, редко такое упорство встретишь.
129 Merkalov
 
17.05.22
02:27
Вопрос по объеду "БлокироваДанных".
В СП и на its написано что в качестве источника данных может выступать НаборЗаписей, но не может.
"Ошибка при установке значения атрибута контекста (ИсточникДанных)
по причине:
Несоответствие типов"

Прошелся поиском в типовых конфигурациях - БП и УТ, не нашел использований набора записей в качестве источника.

Меня что, обманули?
130 lodger
 
17.05.22
10:35
(129) НЗ у тебя от РС? подчинен регистратору?
131 Merkalov
 
18.05.22
03:05
(130) Попробовал на РС с регистратором - та же ошибка.
132 lodger
 
18.05.22
09:32
(131) слушай, а куда ты там собрался набор записей совать?
есть такой синтаксис:
Бл=Новый БлокировкаДанных;
Эл=Бл.Добавить("РегистрСведений.ЦеныНоменклатуры.НаборЗаписей");
Эл.Режим=РежимБлокировкиДанных.Исключительный;
Эл.УстановитьЗначение("Регистратор",Ссылка);
Бл.Заблокировать();

а ты со своим НЗ прочитанным из базы наверное хочешь его же и заблочить? так вот нет. в ИсточникДанных можно сунуть только РезультатЗапроса, Табличная часть, ТаблицаЗначений.
133 Merkalov
 
18.05.22
10:52
(132)
https://its.1c.ru/db/metod8dev/content/5839/hdoc
>В качестве источника данных можно указывать результат запроса, табличную часть, набор записей или таблицу значений.
А мне сказали, что всунуть можно и сам набор записей..
"на заборе тоже написано"
134 lodger
 
18.05.22
11:01
(133) забавно. в СП одно, и исполняемый код ему вторит, а в доке другое.
https://its.1c.ru/db/v8320doc#bookmark:dev:TI000000535
135 lodger
 
18.05.22
11:02
может уровень совместимости надо снять?