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

10.05.23

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

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

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

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

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

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

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

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

См. также

SALE! %

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

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

12000 10000 руб.

02.09.2020    161338    893    399    

873

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

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 руб.

20.08.2024    8583    66    29    

76

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

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

22200 руб.

06.10.2023    15693    39    8    

73

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

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    23851    70    45    

119

SALE! %

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

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

15000 10000 руб.

10.11.2023    10667    38    27    

63

SALE! %

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

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

4800 3840 руб.

14.01.2013    188573    1142    0    

913

SALE! %

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

20000 15000 руб.

07.10.2021    17558    6    32    

42

Инструментарий разработчика Программист Платные (руб)

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

1800 руб.

21.02.2023    7833    8    35    

23
Отзывы
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 118 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 3090 10.05.23 11:46 Сейчас в теме
(6)
большие объемы данных задаваемые булевыми Да/Нет
Любые бинарные признаки (галочки) и куча всего, что к ним в итоге может быть приведено. Просто 1С-неги часто действительно не умеют программировать. Но кто сейчас это умеет?
karamazoff; +1 Ответить
8. karamazoff 118 10.05.23 11:49 Сейчас в теме
(6)Ну почему-же? Для темы вопроса лепим пустую конфу, в ней документ, в нем реквизит булево и заполняем обработиной в течении 3 дней - вот и макет для тестирования!
9. starik-2005 3090 10.05.23 11:50 Сейчас в теме
(0)
Прессуем Булево в Биты
В паскале лет сто назад была такая конструкция, как packed array, которая, внезапно, лепила именно это.
10. Rafaraf 37 10.05.23 11:56 Сейчас в теме
можете подсказать способ как делать отбор по маске - в этом только затык в скорости формирования отбора - приходится перебирать в цикле соответствие искомому биту ? до 8 бит - перебор 256 вариантов еще норм
(9)
В паскале лет сто назад была такая конструкция, как packed array, которая, внезапно, лепила именно это.
11. starik-2005 3090 10.05.23 12:03 Сейчас в теме
(10) Не знаю, умеет ли 1С-ный лайтовый скульный запросник бинарный "and". Если умеет - ваще просто, если не умеет - ужас-кошмар. Сиквел умеет.
19. user1880116 10.05.23 22:04 Сейчас в теме
(9)
В паскале лет сто назад
была нормальная работа с типом set
33. Alxby 1116 15.05.23 10:07 Сейчас в теме
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 816 10.05.23 12:14 Сейчас в теме
Бесполезные оптимизации. Манипуляции с битами в 1с по времени съедят весь выигрыш от их использования по сравнению с применением булевских типов.
triviumfan; user1880116; PowerBoy; +3 Ответить
14. starik-2005 3090 10.05.23 13:43 Сейчас в теме
(13)
по сравнению с
Есть многое на Свете, друг Горацио,
Что неизвестно нашим мудрецам.
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 14 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" пишется элементарно.
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С так очень любят делать. Почему не знаю.
Оставьте свое сообщение