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

20.09.22

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Перечень значений в ячейках динамического списка. Как стало и как было.:
.dt 57,72Kb
1
1 Скачать (1 SM) Купить за 1 850 руб.

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

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

 

 

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

 

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

 

 

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

 

 

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

 

 

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

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

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

 

 

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

 

 

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

 

 

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

Не проблема:

 

 

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

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

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

 

 

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

 

 

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

 

 

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

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

 

 

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

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

 

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

 

 

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

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

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

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

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

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

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

 

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

 

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

См. также

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

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    7449    bayselonarrend    20    

154

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

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    5943    dsdred    16    

80

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

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

24.01.2024    17672    YA_418728146    26    

71

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

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

11.12.2023    11224    dsdred    44    

130

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

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

06.10.2023    23760    SeiOkami    48    

135

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

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

14.09.2023    18830    human_new    27    

80

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

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

28.08.2023    14732    YA_418728146    7    

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