Прессуем Булево в Биты

10.05.23

Разработка - Инструментарий разработчика

Попытка разобраться с возможностями хранения десятков однообразных реквизитов в "спрессованном" виде. Надеюсь, из глубины выплывут киты и покритикуют отбор по маске в цикле, потому, как пока не придумал другой способ )

Скачать исходный код

Наименование Файл Версия Размер
Прессуем Булево в Биты:
.dt 53,53Kb
8
.dt 53,53Kb 8 Скачать бесплатно

Попытка представить отборы в Динамическом списке, в СКД уж "до кучи" описал. Интересна возможность получения Запроса с отбором по битовой маске - получается громоздко, в цикле, но все остальные операции происходят на клиенте, что теоретический выигрышнее.

Хочется получить пользу от такой технологии, все таки для Булево достаточно одного бита, а хранение в 32 битном Числе позволяет паковать целые месяцы (ака графики дежурств).

Знаю, что 1С внедрила методы не для хранения, а для работы с заголовками и с оборудованием (штрихкодами) начиная с 11 версии.

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

Создавал на конфигурации 8.3.20.2184, но .dt будет работать на любой с 8.3.12 версии. 

Бит Булево хранение побитовое

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    124812    682    389    

732

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 руб.

06.10.2023    7753    24    6    

42

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 руб.

10.11.2023    4265    12    2    

36

SALE! %

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

3600 2280 руб.

14.01.2013    178623    1083    0    

861

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99605    239    97    

298

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18376    6    8    

40

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23853    16    15    

33

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28309    3    10    

16
Отзывы
16. user-z99999 67 10.05.23 14:49 Сейчас в теме
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. soft_wind 10.05.23 11:04 Сейчас в теме
да-да! очень актуально "экономить" какие-то биты! когда рядом в регистре(ах) лежат миллионы (не оптимизированных) записей!
плюс куча говно_кода! (где сотни вложенных циклов с запросами)

ваши изыскания оптимизации использования битов помогут это решить?
Naumov; vv2; DesertPunk; siamagic; +4
2. Rafaraf 37 10.05.23 11:12 Сейчас в теме
(1) если рядом лежат кучи неоптимизированных записей - это же не значит что надо набрасывать сверху еще ) - может все таки начинать разгребать потихоньку ?
Теоретически можно получить выигрыш в чтении-записи в размере КолвоРеквизитов-1*КолвоПользователей, при сотнях юзеров это может быть заметно на глаз
+
3. karamazoff 96 10.05.23 11:15 Сейчас в теме
(2)Ну начните! При нынешних мощностях процессоров, объемов оперативной памяти и дискового пространства разработчики уже давно не оптимизируют. Ассемблер ваше все! (это я по доброму, сам на нем вырос)
+
4. Rafaraf 37 10.05.23 11:22 Сейчас в теме
(3) Ассемблер хорошая штука - сам писал перекодировщик на русский для польского принтера D-100 в лохматых годах под DOS)
главная награда - ускорение чтения и записи субд - самых тяжелых и медленных операциях.
Надо бы исследования на больших объемах проводить...
+
5. пользователь 10.05.23 11:43
Сообщение было скрыто модератором.
...
21. user1880116 10.05.23 22:19 Сейчас в теме
(4)
главная награда - ускорение чтения и записи субд
...
Надо бы исследования на больших объемах проводить
То есть ты... не проверял?
+
23. Rafaraf 37 11.05.23 13:36 Сейчас в теме
(20)
(21) исследования проводил на Динамическом списке - понятно, что он получает порции по 35 записей, главная задача была сделать множественные отборы (собирать маску в любом конфигурации и накладывать отбор). все работает шустро как минимум с 8 реквизитами, делал и 16, но уже заметно торможение. Работа с реквизитами выбранного объекта по сути мгновенная.
+
27. user1880116 11.05.23 17:39 Сейчас в теме
(23)
порции по 35 записей
(23)
делал и 16, но уже заметно торможение


Хе-хе. Хе-хе-хе.

И сразу после этого, этот же пациент в (24) предлагает хранить весь год в одной записи. Нет, рановато вас выписывать, рановато...
+
6. soft_wind 10.05.23 11:44 Сейчас в теме
(4) вот в 1С как раз очень трудно представить большие объемы данных задаваемые булевыми Да/Нет
в основном ссылочные данные и числовые со строковыми.
+
7. starik-2005 3036 10.05.23 11:46 Сейчас в теме
(6)
большие объемы данных задаваемые булевыми Да/Нет
Любые бинарные признаки (галочки) и куча всего, что к ним в итоге может быть приведено. Просто 1С-неги часто действительно не умеют программировать. Но кто сейчас это умеет?
karamazoff; +1
8. karamazoff 96 10.05.23 11:49 Сейчас в теме
(6)Ну почему-же? Для темы вопроса лепим пустую конфу, в ней документ, в нем реквизит булево и заполняем обработиной в течении 3 дней - вот и макет для тестирования!
+
9. starik-2005 3036 10.05.23 11:50 Сейчас в теме
(0)
Прессуем Булево в Биты
В паскале лет сто назад была такая конструкция, как packed array, которая, внезапно, лепила именно это.
+
10. Rafaraf 37 10.05.23 11:56 Сейчас в теме
можете подсказать способ как делать отбор по маске - в этом только затык в скорости формирования отбора - приходится перебирать в цикле соответствие искомому биту ? до 8 бит - перебор 256 вариантов еще норм
(9)
В паскале лет сто назад была такая конструкция, как packed array, которая, внезапно, лепила именно это.
+
11. starik-2005 3036 10.05.23 12:03 Сейчас в теме
(10) Не знаю, умеет ли 1С-ный лайтовый скульный запросник бинарный "and". Если умеет - ваще просто, если не умеет - ужас-кошмар. Сиквел умеет.
+
19. user1880116 10.05.23 22:04 Сейчас в теме
(9)
В паскале лет сто назад
была нормальная работа с типом set
+
33. Alxby 1144 15.05.23 10:07 Сейчас в теме
(9)В Си тоже были...
+
12. soft_wind 10.05.23 12:07 Сейчас в теме
(10) Ладно в коде вы что-то выиграть пытаетесь.
а запросы 1С-ные с вашими упакованными битами вы как себе представляете?
допустим 5 реквизитов вы упаковали в один бит
как к нему условие на Истина/Ложь написать?
(да еще что бы это читабельно было?)
+
15. Rafaraf 37 10.05.23 14:14 Сейчас в теме
(12) сначала не внимательно прочитал про запрос: условие к запросу пишется также как и условие на отбор в предложенном решении, отбирается, засовывается в список возможных вариантов - скармливается запросу.
Вопрос - а зачем делать выборку по Бинарному реквизиту ? можно отбирать по периоду, по сотруднику (в данном примере) и потом уже на клиенте спокойно распаковать
+
20. user1880116 10.05.23 22:09 Сейчас в теме
(15)
а зачем делать выборку по Бинарному реквизиту
ГДЕ НЕ ПометкаУдаления
Хе-хе. Хе-хе-хе.
+
13. SerVer1C 750 10.05.23 12:14 Сейчас в теме
Бесполезные оптимизации. Манипуляции с битами в 1с по времени съедят весь выигрыш от их использования по сравнению с применением булевских типов.
triviumfan; user1880116; PowerBoy; +3
14. starik-2005 3036 10.05.23 13:43 Сейчас в теме
(13)
по сравнению с
Есть многое на Свете, друг Горацио,
Что неизвестно нашим мудрецам.
+
16. user-z99999 67 10.05.23 14:49 Сейчас в теме
17. lmnlmn 69 10.05.23 16:08 Сейчас в теме
(0) Этим бы надо на уровне СУБД озадачиваться. На уровне конфигурации 1С овчинка выделки не стоит и, предположу, вредит.
PlatonStepan; +1
18. Said-We 10.05.23 16:29 Сейчас в теме
(1)
РЛС - и усё. Вам права надо на каждый и разные, а вы их упаковали.
Выигрыш в производительности - это запросы 1С доработать в части тех же оконных функциях, работе со строками, конвертации простых типов и т.д. Это платформа. Только ждать маны небесной от 1С или уже не от 1С.
PlatonStepan; user1880116; Rafaraf; +3
22. PlatonStepan 38 11.05.23 07:58 Сейчас в теме
Чем меньше обработчиков и кода - тем быстрее отработает программа.
Непонятно, с чем вы конкурируете и где гешефт. Может пример не тот...

Сколько можно "запрессовать" состояний в один реквизит?
В чтении/записи есть разница при разном количестве полей ничтожной длины?

Допустим, у вас несколько десятков миллионов записей.
Как индексируется ваш бинарный реквизит СУБД?
Что будет при выводе нескольких таких полей с пересечениями их значений?
для субд это будет:
select t.* from t where t.bin_a in(@a_list) and t.bin_b in(@b_list)

вместо
select t.* from t where t.state1 = @state1 and ... and t.stateN = @stateN

или
select t.* from t where (t.state1,..., t.stateN) IN (@state1,..., @stateN)

что быстрее подготовит 1С на клиенте, на сервере и отработается на субд или в файловой ИБ?

вопросов - море )
+
24. Rafaraf 37 11.05.23 13:48 Сейчас в теме
(22)
Сколько можно "запрессовать" состояний в один реквизит?
В чтении/записи есть разница при разном количестве полей ничтожной длины?

32 булевских реквизита легко - считывание происходит лишь одного числа, распаковка и упаковка идет на клиенте мгновенно. По сути идет работа с одним числом и всё.
зачем бинарный реквизит индексировать ? это просто свойство какой то сущности, которую (сущность) индексировать нужно
Гипотетически: мы храним график работы уборщиц - Сущность "Уборщица" и реквизит типа Число "График работы" куда весь месяц пакуется.
двенадцать чисел по названиям месяцев и у нас в одной записи из "Объект" "N1"....."N12" хранится год графиков. Мы считываем одну запись из СУБД и рассматриваем (меняем график на год) на клиенте, не трогая сервер. Заливаем одну запись обратно...
так как битов 32, остается резервный, который пустим, например, на "Отпуск", отдельно помечая отпускной месяц(ы)
сколько будет весить стандартный год работы в РС ? 356 записей в два поля "Объект" и "Булево" мы считываем 356 записей, да еще и группировать придется по датам серверу. Потом запись измененных значений, опять же придется все залить обратно
П.С. упростил поле Период и там и там, хотя опять же с бинарным реквизитом нам не надо хранить дату на каждую запись, достаточно хранить лишь номер года на запись.
Вопрос - сколько миллионов записей я смогу сэкономить ?
+
26. user1880116 11.05.23 17:36 Сейчас в теме
(24)
Вопрос - сколько миллионов
блокировок ты получишь при каком-нибудь планировании отпусков и согласовании графиков.
+
25. user856012 13 11.05.23 14:19 Сейчас в теме
28. 967@4520.ru 12.05.23 20:28 Сейчас в теме
У меня есть словарь неких сущностей, их порядка полумиллиона, живет в регистре сведений и дополняется не каждый квартал на ~2000 записей. У каждого "слова" есть куча (около 30) фиксированных свойств разнообразной "битности". Грубая аналогия сущностей со словами русского языка:
1. Род -муж/жен/сред, перечисление.
2. Падеж - 6 состояний, перечисление
3. Длина сущности, число от 1 до 50
4. Число ед/множ, булево,
Всего вариантов свойств около 20 тысяч.
ПВХ дико тормозил в запросах, и я сначала тоже пытался запихать всë в упакованное булево.
Пока не осознал что словарь уникальных сущностей с автонумерацией и ссылка на него в регистр сведений решает 101% прикладных задач любой извращенности. Например запрос "выбери все не среднего рода с четной длиной больше 8" пишется элементарно.
Rafaraf; +1
29. SlavaKron 12.05.23 22:12 Сейчас в теме
(28) Что делать, если число свойств не фиксировано?
+
31. Said-We 13.05.23 21:00 Сейчас в теме
(29)
Что делать, если число свойств не фиксировано?

А в чем проблема собрать необходимые свойства по объекту?
(30)
Закладываем в справочник избыточное число полей Свойство1..... Свойство128

Зачем такие сложности? Собираешь все необходимые свойства разом. Зачем поля городить?
+
32. SlavaKron 15.05.23 09:08 Сейчас в теме
(31)
А в чем проблема собрать необходимые свойства по объекту?
Обсуждается не возможность "собрать необходимые свойства", а поиск оптимального решения, чтобы потом можно было быстро делать гибкие отборы по свойствам. Меня интересовало конкретно это. Подсистема "Свойства" БСП для больших объемов не подходит.
В рамках интересующей меня задачи, решение больше похоже на регистр бухгалтерии, где сущность – это проводка, а субконто – динамический набор свойств.
+
34. Said-We 15.05.23 10:32 Сейчас в теме
(32)
БСП для больших объемов не подходит.

Это понятно, что она не подходит. Хранятся свойства нормально, Вы как свойства по объекту собирали?
+
35. SlavaKron 15.05.23 10:54 Сейчас в теме
(34) У меня свойства хранятся в табличной части справочника, сущность которого заключается в уникальном наборе этих свойств.
Условная схема на картинке. В такой схеме есть проблема быстродействия отборов по свойствам.
Прикрепленные файлы:
+
30. 967@4520.ru 13.05.23 03:50 Сейчас в теме
(29) По ситуации
1. Переходим на ПВХ/свойства со всеми прелестями.
2. Закладываем в справочник избыточное число полей Свойство1..... Свойство128 предопределенного типа "Наши свойства" и пишем прокладку маппинга пользовательских имен в СвойствоХ.
+
36. Said-We 15.05.23 10:58 Сейчас в теме
(35) Когда из БСП данные выбирали, то как это делали?
+
37. SlavaKron 15.05.23 11:14 Сейчас в теме
(36) Я не выбирал данные из БСП, хотя принцип был бы тот же, если речь про дополнительные реквизиты в ТЧ объекта.
+
38. Said-We 15.05.23 11:24 Сейчас в теме
Не стал использовать БСП, так как медленно. Своя выборка была или стандартная БСП?
+
39. SlavaKron 15.05.23 11:39 Сейчас в теме
(38) Это мне вопрос? О какой выборке идёт речь? О выборке с условиями к различным свойствам? Моя конфигурация не на БСП. Изначально БСП мною была упомянута как образец решения через ПВХ.
Сам запрос строится динамически в зависимости от количества свойств, на которые накладываются условия. К основной таблице справочника присоединяются табличные части (для каждого свойства своя), в которых накладывается условие на свойство.
+
40. Said-We 15.05.23 12:03 Сейчас в теме
(39)
К основной таблице справочника присоединяются табличные части
Есть же более быстрый вариант, чем куча левых соединений.
+
41. Said-We 15.05.23 13:28 Сейчас в теме
(39) Грубо говоря у тебя есть вертикальная таблица со свойствами к объекту. Тебе нужно развернуть (трансформировать) вертикальную таблицу со свойствами в горизонтальную. Это стандартная задача. В том же MS SQL это задача решается с помощью PIVOT. Обратная задача, когда нужно из горизонтальной таблицы построить вертикальную решается с помощью UNPIVOT.
Пример:
WITH vt_data as (
sel ect 'ob_1' as o, 1 as s, 11 as z
UNI ON ALL  sel ect 'ob_1', 2, 12
UNI ON ALL  select 'ob_1', 3, 13
UNI ON ALL  select 'ob_1', 8, 18
UNI ON ALL  select 'ob_1', 9, 19
UNI ON ALL  select 'ob_2', 5, 25
UNI ON ALL  select 'ob_3', 1, 31
UNI ON ALL  select 'ob_3', 2, 32
UNI ON ALL  select 'ob_4', 1, 41
UNI ON ALL  select 'ob_4', 2, 42
UNION ALL  sel ect 'ob_5', 1, 51
UNION ALL  sel ect 'ob_5', 2, 52
UNION ALL  sel ect 'ob_5', 7, 57
UNION ALL  sel ect 'ob_6', 3, 63
UNION ALL  sel ect 'ob_7', 3, 73
UNION ALL  sel ect 'ob_7', 5, 75
UNION ALL  sel ect 'ob_8', 2, 82
)

SEL ECT o, [1] AS svo_1, [2] AS svo_2, [3] AS svo_3, [4] AS svo_4, [5] AS svo_5  
FR OM (sel ect * fr om vt_data where s IN (1,2,3,4,5)) as p
PIVOT (max(z) FOR s IN ([1], [2], [3], [4], [5])) AS pvt
ORDER BY o 
Показать


WITH vt_data - это генерация самих данных, где <о> это объект, s - это свойство, z - значение. Использовал простые типы.
В данных есть свойства и 7 и 8 и 9, но они не будут попадать в результат даже если убрать условие "where s IN (1,2,3,4,5)".

Результат:
o		svo_1	svo_2	svo_3	svo_4	svo_5
ob_1	11		12		13	NULL		NULL
ob_2	NULL	NULL		NULL	NULL	25
ob_3	31		32		NULL	NULL	NULL
ob_4	41		42		NULL	NULL	NULL
ob_5	51		52		NULL	NULL	NULL
ob_6	NULL	NULL		63	NULL		NULL
ob_7	NULL	NULL		73	NULL		75
ob_8	NULL	82		NULL	NULL		NULL
Показать


В 1С PIVOT не поддерживается, но можно одной выборкой получить такой же результат. Отработает чуть медленнее чем PIVOT. Зато гораздо быстрее, чем несколько левых соединений.
SELECT
	t.o
	,max(CASE WHEN t.s=1 THEN t.z ELSE NULL END) as svo_1
	,max(CASE WHEN t.s=2 THEN t.z ELSE NULL END) as svo_2
	,max(CASE WHEN t.s=3 THEN t.z ELSE NULL END) as svo_3
	,max(CASE WHEN t.s=4 THEN t.z ELSE NULL END) as svo_4
	,max(CASE WHEN t.s=5 THEN t.z ELSE NULL END) as svo_5
FR OM vt_data as t
WH ERE t.s in(1,2,3,4,5)
GROUP by t.o
Показать

Если не нравятся NULL, то обернуть в ЕстьNULL( , <значение по умолчанию>)
Rafaraf; SlavaKron; +2
42. SlavaKron 15.05.23 14:18 Сейчас в теме
(41) Интересный прием. Попробую у себя. Смущает, что размер промежуточной таблицы (горизонтальная до наложения условий) будет весьма велик.
+
44. Said-We 15.05.23 18:14 Сейчас в теме
(42)
(горизонтальная до наложения условий)
Почему "до наложения условий"?
select выполняется после where.
+
43. Said-We 15.05.23 14:44 Сейчас в теме
(42) Наложи условие заранее.
WH ERE t.s in(1,2,3,4,5) AND (t.s=1 and t.z = <Значение1> OR t.s=2 and t.z = <Значение2>...)

(42)
Интересный прием.
Стандартный. А куча левых соединений как раз редко используется, так как очень медленно работает. Только в коде 1С так очень любят делать. Почему не знаю.
Rafaraf; +1
Оставьте свое сообщение