Множественное значение реквизита табличной части документа

1. silverr 15 30.10.25 19:30 Сейчас в теме
Всем доброго времени суток!
Подскажите пожалуйста, как реализовать возможность присвоения реквизиту табличной части документа множественного значения одного типа. Например: есть ТЧ "СписокРабот", в ней есть поле "Исполнители" и этому полю есть необходимость присваивать множественное значение типа "Справочник.Сотрудники" или одиночное значение того-же типа.
По теме из базы знаний
Найденные решения
3. DENSKR 15 30.10.25 19:54 Сейчас в теме
Для того чтобы реализовать возможность присвоения реквизиту табличной части документа множественного значения одного типа, вы можете использовать тип данных "СписокЗначений" или создать отдельную табличную часть для хранения множества значений. Однако, напрямую использовать "СписокЗначений" в качестве типа реквизита в 1С нельзя.

Одним из способов решения этой задачи является создание дополнительной табличной части в документе для хранения исполнителей работ. Например, можно создать ТЧ "ИсполнителиРабот" с реквизитами "Работа" (тип: ссылка на строку ТЧ "СписокРабот") и "Исполнитель" (тип: Справочник.Сотрудники).

Пример структуры:

ТЧ "СписокРабот"

Реквизит "Работа"
... другие реквизиты ...
ТЧ "ИсполнителиРабот"

Реквизит "Работа" (тип: СправочникСсылка.СписокРабот) // Ссылка на строку в ТЧ "СписокРабот"
Реквизит "Исполнитель" (тип: Справочник.Сотрудники)
Таким образом, для каждой строки в "СписокРабот" можно указать множество исполнителей в "ИсполнителиРабот".

Для упрощения работы с данными можно использовать формы и обработчики событий для заполнения ТЧ "ИсполнителиРабот".

Пример кода для заполнения ТЧ "ИсполнителиРабот":

// В обработчике события ПриИзменении поля "Исполнители" в форме документа
&НаКлиенте
Процедура СписокРаботИсполнителиПриИзменении(Элемент)
    // Получить текущую строку ТЧ "СписокРабот"
    ТекущаяСтрока = Элементы.СписокРабот.ТекущиеДанные;
    // Очистить ТЧ "ИсполнителиРабот" для текущей работы
    Для каждого СтрокаИсполнителей Из Объект.ИсполнителиРабот Цикл
        Если СтрокаИсполнителей.Работа = ТекущаяСтрока.Ссылка Тогда
            Объект.ИсполнителиРабот.Удалить(СтрокаИсполнителей);
        КонецЕсли;
    КонецЦикла;
    // Добавить выбранных исполнителей в ТЧ "ИсполнителиРабот"
    Для каждого Исполнитель Из ТекущаяСтрока.Исполнители Цикл
        НоваяСтрока = Объект.ИсполнителиРабот.Добавить();
        НоваяСтрока.Работа = ТекущаяСтрока.Ссылка;
        НоваяСтрока.Исполнитель = Исполнитель;
    КонецЦикла;
КонецПроцедуры
Показать

Однако, более простой способ — использовать реквизит типа "Справочник.Сотрудники" с возможностью выбора нескольких значений, используя элемент формы "Поле ввода" с кнопкой выбора и списком значений. Но напрямую это не поддерживается для реквизитов ТЧ.

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

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

Если критично использовать именно реквизит ТЧ для множественного выбора, то одним из вариантов является использование строкового реквизита и реализация выбора и хранения значений через обработчики событий формы.

// Пример обработчика события НачалоВыбора для поля "Исполнители"
&НаКлиенте
Процедура СписокРаботИсполнителиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    // Открыть форму выбора сотрудников с возможностью множественного выбора
    ПараметрыФормы = Новый Структура("МножественныйВыбор", Истина);
    ФормаВыбора = ПолучитьФорму("Справочник.Сотрудники.ФормаВыбора", ПараметрыФормы);
    ФормаВыбора.Открыть();
    // Обработка выбранных значений будет в обработчике события "ПриИзменении" или "ОбработкаВыбора"
КонецПроцедуры

&НаКлиенте
Процедура СписокРаботИсполнителиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    ТекущаяСтрока = Элементы.СписокРабот.ТекущиеДанные;
    // Преобразовать выбранные значения в строку или список
    СтрокаИсполнителей = "";
    Для Каждого Исполнитель Из ВыбранноеЗначение Цикл
        СтрокаИсполнителей = СтрокаИсполнителей + ?(ЗначениеЗаполнено(СтрокаИсполнителей), ", ", "") + Строка(Исполнитель);
    КонецЦикла;
    ТекущаяСтрока.Исполнители = СтрокаИсполнителей;
КонецПроцедуры
Показать

Этот подход требует дополнительной обработки при сохранении и чтении значений.

Для более точного ответа на ваш вопрос, рекомендую рассмотреть конкретные требования к функционалу и структуре данных в вашей конфигурации.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user_2166499 30.10.25 19:48 Сейчас в теме
ХранилищеЗначений
3. DENSKR 15 30.10.25 19:54 Сейчас в теме
Для того чтобы реализовать возможность присвоения реквизиту табличной части документа множественного значения одного типа, вы можете использовать тип данных "СписокЗначений" или создать отдельную табличную часть для хранения множества значений. Однако, напрямую использовать "СписокЗначений" в качестве типа реквизита в 1С нельзя.

Одним из способов решения этой задачи является создание дополнительной табличной части в документе для хранения исполнителей работ. Например, можно создать ТЧ "ИсполнителиРабот" с реквизитами "Работа" (тип: ссылка на строку ТЧ "СписокРабот") и "Исполнитель" (тип: Справочник.Сотрудники).

Пример структуры:

ТЧ "СписокРабот"

Реквизит "Работа"
... другие реквизиты ...
ТЧ "ИсполнителиРабот"

Реквизит "Работа" (тип: СправочникСсылка.СписокРабот) // Ссылка на строку в ТЧ "СписокРабот"
Реквизит "Исполнитель" (тип: Справочник.Сотрудники)
Таким образом, для каждой строки в "СписокРабот" можно указать множество исполнителей в "ИсполнителиРабот".

Для упрощения работы с данными можно использовать формы и обработчики событий для заполнения ТЧ "ИсполнителиРабот".

Пример кода для заполнения ТЧ "ИсполнителиРабот":

// В обработчике события ПриИзменении поля "Исполнители" в форме документа
&НаКлиенте
Процедура СписокРаботИсполнителиПриИзменении(Элемент)
    // Получить текущую строку ТЧ "СписокРабот"
    ТекущаяСтрока = Элементы.СписокРабот.ТекущиеДанные;
    // Очистить ТЧ "ИсполнителиРабот" для текущей работы
    Для каждого СтрокаИсполнителей Из Объект.ИсполнителиРабот Цикл
        Если СтрокаИсполнителей.Работа = ТекущаяСтрока.Ссылка Тогда
            Объект.ИсполнителиРабот.Удалить(СтрокаИсполнителей);
        КонецЕсли;
    КонецЦикла;
    // Добавить выбранных исполнителей в ТЧ "ИсполнителиРабот"
    Для каждого Исполнитель Из ТекущаяСтрока.Исполнители Цикл
        НоваяСтрока = Объект.ИсполнителиРабот.Добавить();
        НоваяСтрока.Работа = ТекущаяСтрока.Ссылка;
        НоваяСтрока.Исполнитель = Исполнитель;
    КонецЦикла;
КонецПроцедуры
Показать

Однако, более простой способ — использовать реквизит типа "Справочник.Сотрудники" с возможностью выбора нескольких значений, используя элемент формы "Поле ввода" с кнопкой выбора и списком значений. Но напрямую это не поддерживается для реквизитов ТЧ.

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

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

Если критично использовать именно реквизит ТЧ для множественного выбора, то одним из вариантов является использование строкового реквизита и реализация выбора и хранения значений через обработчики событий формы.

// Пример обработчика события НачалоВыбора для поля "Исполнители"
&НаКлиенте
Процедура СписокРаботИсполнителиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    // Открыть форму выбора сотрудников с возможностью множественного выбора
    ПараметрыФормы = Новый Структура("МножественныйВыбор", Истина);
    ФормаВыбора = ПолучитьФорму("Справочник.Сотрудники.ФормаВыбора", ПараметрыФормы);
    ФормаВыбора.Открыть();
    // Обработка выбранных значений будет в обработчике события "ПриИзменении" или "ОбработкаВыбора"
КонецПроцедуры

&НаКлиенте
Процедура СписокРаботИсполнителиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    ТекущаяСтрока = Элементы.СписокРабот.ТекущиеДанные;
    // Преобразовать выбранные значения в строку или список
    СтрокаИсполнителей = "";
    Для Каждого Исполнитель Из ВыбранноеЗначение Цикл
        СтрокаИсполнителей = СтрокаИсполнителей + ?(ЗначениеЗаполнено(СтрокаИсполнителей), ", ", "") + Строка(Исполнитель);
    КонецЦикла;
    ТекущаяСтрока.Исполнители = СтрокаИсполнителей;
КонецПроцедуры
Показать

Этот подход требует дополнительной обработки при сохранении и чтении значений.

Для более точного ответа на ваш вопрос, рекомендую рассмотреть конкретные требования к функционалу и структуре данных в вашей конфигурации.
4. silverr 15 30.10.25 20:27 Сейчас в теме
(3) Т.е я правильно понимаю: реквизиту ТЧ присвоить тип "СписокЗначений" нельзя (ограничения платформы), поэтому присваиваем тип "Строка" - это будет пользовательское представление значений реквизита. Создаем еще одну ТЧ "Исполнители", в которой будем хранить значения ссылочного типа "Справочник.Сотрудники". Связь с ТЧ "СписокРабот" будет осуществляться через реквизит "ВидРабот". Ну а методы заполнения, редактирования и удаления это уже по ходу пъессы.
Правильно я понимаю?
6. DENSKR 15 30.10.25 20:40 Сейчас в теме
(4) "Верно метишь фраерок"
7. miniogn 48 30.10.25 20:42 Сейчас в теме
(4) Лучше сделать связь более универсально - по УИД.
user_1936660; DENSKR; +2 Ответить
9. silverr 15 30.10.25 21:16 Сейчас в теме
(3)
(7) Спасибо, это более приемлемо, т.к. будут строки с повторяющимися "ВидамиРабот", и ссылки из подчиненной ТЧ будут неуникальны.
8. user_2166499 30.10.25 20:43 Сейчас в теме
(4) Люди открывают для себя азы реляционности БД.
10. silverr 15 30.10.25 21:20 Сейчас в теме
(8) Не совсем так, просто никогда не видел данного решения в типовых. Поля шапки документа видел, а вот реквизит ТЧ со множественным значением к сожалению нет.
Можете назвать пример в типовых с решением данной задачи?
11. user_2166499 30.10.25 21:24 Сейчас в теме
(10)
реквизит ТЧ со множественным значением к сожалению нет.
Потому что его не бывает. Это ты просто придумал такое свое собственное название при полном отсутствии базовой терминологии.
Это не множественный реквизит. Это отдельная таблица. С релятивным ключом связи.
Можешь назвать его матричным кубом. Или массивным уплотением. Дело твоей фантазии.
Но это отдельная релятивная таблица.

А множественного значения в реквизите не бывает.
Если только это не хранилище значений.
orakool2; DENSKR; +2 Ответить
15. silverr 15 30.10.25 21:53 Сейчас в теме
(3)
(11) Ну в терминологии я не силен, тут я согласен. Как в 1С называется связь один ко многим описал как смог, как говорится своими словами. Отсутствие базовой терминологии объясню фразой из мультика: "Чтобы продать что-то не нужное, нужно сначала купить что-то не нужное".
Какой способ хранения более привлекателен: релятивная таблица или список значений, при условии что "СписокРабот" может быть до 300 строк, а "СписокИсполнителей" к каждой строке "СпискаРабот" до 20 может 30 строк?
Спасибо за ваше внимание к моей проблеме.
16. user_2166499 30.10.25 22:16 Сейчас в теме
(15)
Какой способ хранения более привлекателен: релятивная таблица или список значений
Список значений не является объектом или типом для хранения. Список значений - это чисто прикладной объет данных, существует только в оперативной памяти.

Может уже почитаешь что-нибудь?
orakool2; +1 Ответить
17. silverr 15 30.10.25 22:21 Сейчас в теме
(3)
(16) Да список значений очередной косяк, хранилище значений хотел написать.
18. user_2166499 30.10.25 22:28 Сейчас в теме
(17) Ну почитай что такое хранилище значений что ли...
Для быстрого понимания - это просто zip-данные.
Вот и думай дальше сам - привлекательно это для тебя или нет.
19. silverr 15 31.10.25 12:00 Сейчас в теме
(3)
(11) В конфиге однако именно так и именуется: множественное значение
Прикрепленные файлы:
20. user_2166499 31.10.25 12:02 Сейчас в теме
(19) Это реквизит объекта? Или таки элемент формы?
21. silverr 15 31.10.25 12:34 Сейчас в теме
(3)
(20) Я рассматриваю данную задачу в комплексе: ввод, изменение, удаление или хранение и, отображение на форме. Да, картинка относится к свойствам элемента формы, но мне просто ввести данные без сохранения недостаточно. Непонятен был механизм хранения множественных значений, для этого я и написал эту тему.
Как я считаю: стыдно не не знать что-то, стыдно не спросить и натворить проблем.
Статьи на сайтах, видео и т.п. уже прорабатываю, но остаются вопросы. С ними и пытаюсь обратится к форумчанам.
5. silverr 15 30.10.25 20:30 Сейчас в теме
(3) Спасибо за развернутый ответ.
12. user_1936660 30.10.25 21:39 Сейчас в теме
(3)
    Для каждого СтрокаИсполнителей Из Объект.ИсполнителиРабот Цикл
        Если СтрокаИсполнителей.Работа = ТекущаяСтрока.Ссылка Тогда
            Объект.ИсполнителиРабот.Удалить(СтрокаИсполнителей);
        КонецЕсли;
    КонецЦикла;
Нейрокультисты со своими нейрокультяпками как всегда
user_2166499; +1 Ответить
13. DENSKR 15 30.10.25 21:40 Сейчас в теме
(12) Хорош, как никогда!
14. user_2166499 30.10.25 21:45 Сейчас в теме
(12) Удивляюсь твоему терпению. Я даже читать не стал...
karamazoff; +1 Ответить
Для отправки сообщения требуется регистрация/авторизация

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот