Перечень множественных значений в ячейке динамического списка. Как стало и как было

20.09.22

Разработка - Механизмы платформы 1С

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

Скачать файлы

Наименование Файл Версия Размер
Перечень значений в ячейках динамического списка. Как стало и как было.:
.dt 57,72Kb
1
.dt 57,72Kb 1 Скачать

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

Напомню, как настраиваются характеристики. Возьмем самую простую конфигурацию:

 

 

У объекта Товары есть свойство Характеристики:

 

В пользовательском режиме добавим новую характеристику - Цвет. В настройках формы (Еще - Изменить форму...) добавим новую колонку:

 

 

и получим результат:

 

 

Отлично. А если Пуговица может иметь несколько вариантов цвета, что будет тогда?

 

 

Это совсем не то, что мы ожидали увидеть. Хотя ничего необъяснимого здесь нет - где-то внутри производится левое соединение таблицы товаров с таблицей значений характеристик, в результате чего получается две строки с одинаковой Ссылкой.

К счастью, в версии 21 платформы появились все необходимые средства для исправления ситуации.

Добавим в план видов характеристик реквизит Множественность (тип Булево) и выберем его в настройках характеристик товаров в Поле использования множественных значений

 

 

У атрибута Цвет настроим множественность.

 

 

и получим результат:

 

 

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

Не проблема:

 

 

А теперь неочевидный момент.

Что будет, если мы в характеристике Цвет не установим реквизит Множественность? В этом случае снова появится ошибка с дублированием при открытии списка.

Добавим в табличную часть реквизит Вторичный и укажем его в настройках в Поле ключа множественных значений

 

 

 Для Пуговицы выберем какой-нибудь основной цвет, а остальные пометим как вторичные:

 

 

В списке будет одно, основное значение:

 

 

Таким образом, для множественных характеристик в ячейке будут отображены все значения, для одиночных - единственное, то, для которого не заполнено значение Поля ключа множественных значений. За единственностью такой строки надо следить отдельно. Вместо булевого реквизита Вторичный можно использовать реквизит другого типа (например числовой номер 0..n), отбор значения для отображения будет идти по условию равенства этого реквизита пустому значению для своего типа (для числового - 0).

А что если нам в качестве разделителя нужна не запятая, а другой знак? Такая задача передо мной не стояла, но решение обнаружилось случайно. Не знаю как бы я его искал, если бы оно действительно понадобилось. Надо действовать через условное оформление:

 

 

А как же проблему отображения множественных значений решали до появления платформы версии 21?

Для этого в списке характеристик можно создать отдельное поле, назовем его Представление, в которое будем помещать строковое представление списка. Дополнительно создадим дубликат поля Характеристика, используемое только для соединения в динамическом списке. 

 

При появлении в табличной части нескольких значений, необходимо добавить новую строку, а табличную часть заполнить так:

 

 

Разумеется, все это должно происходить автоматически, незаметно для пользователя.

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

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

У этих способов недостатков больше чем достоинств - необходимо наличие строкового типа в составе типов характеристики, не будут полноценно работать отборы в динамическом списке. 

Использование нового механизма не имеет этих недостатков.

К статье приложена выгрузка ИБ с примерами к статье. Тестировалось на версии 8.3.21.1393. При тестировании наблюдалась некая задержка после изменения свойств характеристик - в списке не сразу изменялось содержимое колонки даже после переоткрытия формы, видимо какие-то значимые данные кэшируются.

На этом всё. Как всегда, приветствуются замечания / дополнения / комментарии.

 

 
 Некоторые из прочих моих публикаций

 

характеристики множественные дополнительные свойства реквизиты динамический список план видов характеристик Поле Использования Множественных Значений Ключа

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4511    dsdred    53    

71

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5287    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6408    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18473    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12087    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8818    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15983    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. milanse 38 21.09.22 00:37 Сейчас в теме
Как, интересно, все это выглядит в виде запросов SQL.
RocKeR_13; pavlov_dv; +2 Ответить
2. Alxby 1136 21.09.22 07:48 Сейчас в теме
(1)Выполняются как минимум два запроса: запрос к таблице Товары, и отдельный запрос к таблице Товары.Характеристики с отбором по Характеристике и Ссылке на товар. Дальнейшее формирование строки выполняется платформой с учетом условного оформления.
5. kser87 2438 22.09.22 12:35 Сейчас в теме
(1) умрет в больших БД. Куча вложенных запросов, на каждый элемент ПВХ
6. Alxby 1136 22.09.22 15:51 Сейчас в теме
(5)Зависит от количества добавленных колонок. Но вообще-то да, повесить динамический список можно легко, причем разными способами, тем же поиском например.
3. milanse 38 21.09.22 11:15 Сейчас в теме
Хотелось бы посмотреть на трейс.
4. Alxby 1136 22.09.22 06:21 Сейчас в теме
(3) Для списка из одного элемента Товары с одним видом характеристики несоставного типа
Первый запрос - получение списка товаров:
Sql:
SEL ECT
T1._IDRRef,
T1._Marked,
T1._Code,
T1._Description,
CASE WHEN T1._PredefinedID > '\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\00­0\\000\\000\\000\\000'::bytea THEN TRUE ELSE FALSE END
FR OM _Reference11 T1
ORDER BY (T1._Code), (T1._IDRRef) LIMIT 45
planSQLText:
Limit (cost=0.52..0.52 rows=1 width=98) (actual time=0.015..0.015 rows=1 loops=1)
Output: _idrref, _marked, _code, _description, (CASE WHEN (_predefinedid > '\\x00000000000000000000000000000000'::bytea) THEN true ELSE false END)
Buffers: shared hit=1
-> Sort (cost=0.52..0.52 rows=1 width=98) (actual time=0.014..0.014 rows=1 loops=1)
Output: _idrref, _marked, _code, _description, (CASE WHEN (_predefinedid > '\\x00000000000000000000000000000000'::bytea) THEN true ELSE false END)
Sort Key: t1._code, t1._idrref
Sort Method: quicksort Memory: 25kB
Buffers: shared hit=1
-> Seq Scan on public._reference11 t1 (cost=0.00..0.51 rows=1 width=98) (actual time=0.004..0.005 rows=1 loops=1)
Output: _idrref, _marked, _code, _description, CASE WHEN (_predefinedid > '\\x00000000000000000000000000000000'::bytea) THEN true ELSE false END
Buffers: shared hit=1
Planning:
Buffers: shared hit=4
Planning Time: 0.077 ms
Execution Time: 0.029 ms

Здесь _Reference11 - Справочник.Товары

Второй запрос - получение цветов товаров из первого списка:
Sql:
SELECT
T1._Reference11_IDRRef,
T1._Fld36RRef,
T1._LineNo34,
T1._Fld36RRef,
T2._Description
FR OM _Reference11_VT33 T1
LEFT OUTER JOIN _Reference10 T2
ON T1._Fld36RRef = T2._IDRRef
WH ERE (T1._Fld35RRef = '\\202\\203\\000PV\\001\\011\\331\\021\\3558\\0071FR\\232'::bytea) AND (T1._Reference11_IDRRef IN ('\\202\\203\\000PV\\001\\011\\331\\021\\3558\\007E&\\301\\34­4'::bytea))
planSQLText:
Nested Loop Left Join (cost=0.06..1.62 rows=1 width=140) (actual time=0.017..0.021 rows=3 loops=1)
Output: t1._reference11_idrref, t1._fld36rref, t1._lineno34, t1._fld36rref, t2._description
Inner Unique: true
Buffers: shared hit=7
-> Seq Scan on public._reference11_vt33 t1 (cost=0.00..0.54 rows=1 width=76) (actual time=0.004..0.005 rows=3 loops=1)
Output: t1._reference11_idrref, t1._keyfield, t1._lineno34, t1._fld35rref, t1._fld36rref, t1._fld50
Filter: ((t1._fld35rref = '\\x82830050560109d911ed38073146529a'::bytea) AND (t1._reference11_idrref = '\\x82830050560109d911ed38074526c1e4'::bytea))
Buffers: shared hit=1
-> Index Scan using _reference10ng_pkey on public._reference10 t2 (cost=0.06..1.07 rows=1 width=64) (actual time=0.004..0.004 rows=1 loops=3)
Output: t2._idrref, t2._version, t2._marked, t2._predefinedid, t2._code, t2._description
Index Cond: (t2._idrref = t1._fld36rref)
Buffers: shared hit=6
Planning:
Buffers: shared hit=29
Planning Time: 0.231 ms
Execution Time: 0.040 ms

Здесь _Reference10 - Справочник.Цвета
_Reference11_VT33 - табличная часть Справочник.Товары.Характеристики
klaus38; milanse; +2 Ответить
7. milanse 38 22.09.22 16:03 Сейчас в теме
(4) не понятно, циклом что-ли проходит по списку, выводит цвета ?
8. Alxby 1136 22.09.22 16:14 Сейчас в теме
(7)Второй запрос получает все наименования цветов (T2._Description) для списка элементов товара (T1._Reference11_IDRRef IN ...), полученного в первом запросе. Возможно в некоторых случаях вместо "T1._Reference11_IDRRef IN ..." будет что-то иное, например JOIN.
9. triviumfan 92 26.09.22 16:03 Сейчас в теме
Интересно. Что-то новенькое)
Оставьте свое сообщение