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

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. При тестировании наблюдалась некая задержка после изменения свойств характеристик - в списке не сразу изменялось содержимое колонки даже после переоткрытия формы, видимо какие-то значимые данные кэшируются.

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

 

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

 

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

См. также

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

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

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

14.09.2023    6720    human_new    22    

57

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

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

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

28.08.2023    3286    YA_418728146    3    

87

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

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

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

20.08.2023    3801    sebekerga    47    

85

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

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

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

27.06.2023    8934    SeiOkami    24    

88

Методы работы с универсальным отчетом в подсистеме "Варианты отчетов" на БСП

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

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

30.05.2023    3536    quazare    4    

81

Расширение глобального поиска 1С, или Глобальный поиск "на максималках"

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

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

27.03.2023    5502    SeiOkami    10    

129

Версионирование объектов VS История данных

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

Давайте разберемся в механизме «История данных» и поэкспериментируем для наглядности. Сравним «Версионирование объектов» и «Историю данных».

06.03.2023    10324    dsdred    48    

145

Идентификатор объекта в запросе. Вы этого хотели?

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

В платформе 8.3.22 появилась возможность получать идентификатор в запросе. Лично я ждал этого давно, но по итогу ждал большего. Что не так?

12.01.2023    22738    dsdred    24    

83
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. milanse 37 21.09.22 00:37 Сейчас в теме
Как, интересно, все это выглядит в виде запросов SQL.
RocKeR_13; pavlov_dv; +2 Ответить
2. Alxby 1100 21.09.22 07:48 Сейчас в теме
(1)Выполняются как минимум два запроса: запрос к таблице Товары, и отдельный запрос к таблице Товары.Характеристики с отбором по Характеристике и Ссылке на товар. Дальнейшее формирование строки выполняется платформой с учетом условного оформления.
5. kser87 2390 22.09.22 12:35 Сейчас в теме
(1) умрет в больших БД. Куча вложенных запросов, на каждый элемент ПВХ
6. Alxby 1100 22.09.22 15:51 Сейчас в теме
(5)Зависит от количества добавленных колонок. Но вообще-то да, повесить динамический список можно легко, причем разными способами, тем же поиском например.
3. milanse 37 21.09.22 11:15 Сейчас в теме
Хотелось бы посмотреть на трейс.
4. Alxby 1100 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 37 22.09.22 16:03 Сейчас в теме
(4) не понятно, циклом что-ли проходит по списку, выводит цвета ?
8. Alxby 1100 22.09.22 16:14 Сейчас в теме
(7)Второй запрос получает все наименования цветов (T2._Description) для списка элементов товара (T1._Reference11_IDRRef IN ...), полученного в первом запросе. Возможно в некоторых случаях вместо "T1._Reference11_IDRRef IN ..." будет что-то иное, например JOIN.
9. triviumfan 82 26.09.22 16:03 Сейчас в теме
Интересно. Что-то новенькое)
Оставьте свое сообщение