Уникальность полей в одной строке табличной части документа.

1. user1444986 17.09.20 09:24 Сейчас в теме
Доброго времени суток, есть табличная часть документа с реквизитами ВидТовара1, ВидТовара2, ВидТовара3, ВидТовара4, ВидТовара5. Как реализовать уникальность этих полей? Таким образом если в ВидТовара1 выбран товар Машина то этот же товар при проведении не должен присутствовать в остальных видах товара.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. Sashares 34 17.09.20 09:36 Сейчас в теме
(1)Перед записью документа делать проверку на уникальность, если обнаружились дубли - сообщить пользователю и не проводить.
2. karamazoff 96 17.09.20 09:33 Сейчас в теме
как вариант: на форме для каждого реквизита ТЧ указать процедуру ПриИзменении, а в ней проверять

Для ВидТовара1 это будет вроде:
Если ВидТовара1 = ВидТовара2 или ВидТовара1 = ВидТовара3 или ВидТовара4 = ВидТовара5 тогда
ВидТовара1 = неопределено
КонецЕсли;
4. herfis 498 17.09.20 09:52 Сейчас в теме
А на каком этапе возникла проблема?
Хоть при вводе проверяй, хоть при проведении.
Идеальный вариант проверки при вводе - вообще не отображать в форме выбора уже выбранные в этой строке виды.
Если постфактум проверять, то самый простой и универсальный вариант, который приходит в голову: добавлять виды в массив с проверкой на наличие в этом массиве такого элемента через Найти.
6. user1444986 17.09.20 10:04 Сейчас в теме
(4) Как в идеальном варианте быть с массивом когда добавляется новая строка в ТЧ? К примеру мы в первой строке добавили 2 Вида товара, создаем новую строку выбираем вид товара, то в форме выбора будут отображены только те которых нету в массиве.
7. herfis 498 17.09.20 10:18 Сейчас в теме
(6) Ничего не понял. Причем тут вторая строка, если уникальность нужно контролировать в пределах одной строки?
alex-l19041; +1 Ответить
8. user1444986 17.09.20 10:22 Сейчас в теме
(7) Правильно ли я вас понял, мы добавляем выбранные значения в масив и при выборе следующего выводим в форме только те, которые не входят в этот масив?
13. herfis 498 17.09.20 10:34 Сейчас в теме
(8) Последовательность ввода неважна. Перехватываем событие начала выбора, заполняем массив значениями всех остальных колонок вида товара и даем выбирать только те значения, которых нет в массиве.
alex-l19041; +1 Ответить
16. user1444986 17.09.20 10:36 Сейчас в теме
(13) С помощью механизмов управляемой формы это реализовать можно?
18. herfis 498 17.09.20 10:40 Сейчас в теме
(16) Конечно
(17) Это и имелось в виду. Писал выше "вообще не отображать в форме выбора уже выбранные в этой строке виды". В этот раз просто менее удачно сформулировал.
20. user1444986 17.09.20 10:44 Сейчас в теме
(18) Где то видел что можно добавить чтобы значение выбора не входило в список значений, не могу найти.
21. herfis 498 17.09.20 10:45 Сейчас в теме
(20) Видов много, нужно именно полноценную форму выбора из справочника открывать?
23. user1444986 17.09.20 10:47 Сейчас в теме
24. herfis 498 17.09.20 10:48 Сейчас в теме
(23) Если списком выбора - тогда еще проще. Но под рукой готового примера нет.
26. user1444986 17.09.20 10:54 Сейчас в теме
(24) Поправьте если я ошибаюсь. Если форма выбора не указана и выбираем мы из справочника то это считается список выбора?
27. herfis 498 17.09.20 10:57 Сейчас в теме
(26) Очень редко работаю с таким режимом. Кажись для начала нужно установить галку "Режим выбора из списка". После этого можно и ловить НачалоВыбораИзСписка и программно заполнять свойство СписокВыбора. Вернее не заполнять это свойство, а через него программно изменять список выбора.
ЗЫ. Но там еще пару каких-то приседаний нужно было сделать, чтобы корректно все работало. Лучше загуглить пример работы.
22. FatPanzer 17.09.20 10:46 Сейчас в теме
(20) Забудьте про список. У вас задача - осуществлять контроль при записи, а не при вводе.
При вводе - тоже интересная задача, но она немножко отдельно.

Про ограничение - у списка значений есть свойство "Доступные значения".
25. herfis 498 17.09.20 10:50 Сейчас в теме
(22) На практике как раз при вводе эффективно. При записи - это уже как раз опционально. Защита от дурака - программиста.
28. FatPanzer 17.09.20 11:05 Сейчас в теме
(25) На практике такую архитектуру никто в здравом уме не нарисует. Задача теоретическая, и у автора ясно указано, что контролировать необходимо при проведении. Впрочем, как и делается во всех нормальных решениях - черновики не проверяются.
А если контролировать в момент ввода, то есть еще одна неприятная штука - для того, например, чтобы в одной строке поменять местами значения "ВидТовара1" и "ВидТовара2" - вам придется сначала их оба полностью очистить.
29. herfis 498 17.09.20 11:08 Сейчас в теме
(28) Ок. Без доп. инфы по задаче не вижу предмета для спора.
например, чтобы в одной строке поменять местами значения "ВидТовара1" и "ВидТовара2" - вам придется сначала их оба полностью очистить.

Да. Но только в случае когда порядок "тегов" имеет значение.
А если порядок "тегов" имеет значение, то это уже никакие не теги, а самая настоящая иерархия.
30. FatPanzer 17.09.20 11:18 Сейчас в теме
(29) Нет, вне зависимости от порядка. У вас есть ВидТовара2 - Машина, ВидТовара5 - Кресло. Вам их надо поменять местами. В этом случае в ВидТовара2 вам в списке не отобразится кресло, а в ВидТовара5 не отобразится Машина.
Ну если мы идем по пути ограничения списка выбора (исключая из него уже введенные значения во ВСЕЙ этой строке).
31. herfis 498 17.09.20 11:20 Сейчас в теме
(30) Не очень понимаю, откуда может возникнуть необходимость в "рокировке", если порядок значения не имеет.
32. FatPanzer 17.09.20 11:26 Сейчас в теме
(31) Оттуда же, откуда возникла необходимость хранить в одной строке несколько однотипных реквизитов.
Мы же говорим про теоретическую задачу, а не про здравый смысл.
33. herfis 498 17.09.20 11:32 Сейчас в теме
(32) Поэтому и не вижу смысла спорить без доп-данных. У вас одна картинка в голове нарисовалась, у меня - другая.
17. FatPanzer 17.09.20 10:37 Сейчас в теме
(13) Я бы расширил - не "даем выбирать только те", а просто нафиг убираем из списка выбора уже использованные.
10. FatPanzer 17.09.20 10:25 Сейчас в теме
(7) В строке и так все реквизиты уникальны, если они, конечно, имеют разные типы и целевые назначения.
9. FatPanzer 17.09.20 10:24 Сейчас в теме
Плохой вариант. Таким образом вы сможете контролировать только одну колонку ТЧ, а не несколько. Тот же вид товара может быть вполне одинаков в нескольких строках, при условии, что остальные колонки строк не совпадают.
11. user1444986 17.09.20 10:25 Сейчас в теме
(9) Мне и нужно контролировать уникальность только в одной строке.
12. FatPanzer 17.09.20 10:27 Сейчас в теме
(11) А ЧТО в одной строке контролировать? Там есть совпадающие реквизиты? Единственно что приходит на ум, так это то, что в одной строке могу совпадать Цена и Сумма, Цена и Количество, Количество и Сумма.
14. herfis 498 17.09.20 10:36 Сейчас в теме
(12) Как я понял, у него несколько однотипных реквизитов в строке, ссылающихся на один и тот же справочник. Либо это некое "тегирование", либо кривая архитектура.
19. FatPanzer 17.09.20 10:44 Сейчас в теме
(14) Либо чисто теоретическая задача. Да, теперь понял.
Задача стоит контролировать именно при проведении, что более верно, чем контролировать при вводе. Потому как ТЧ как и сам документ целиком могут быть загружены на форму из внешних источников, и тогда контроль доступен только при записи.

МассивИменРеквизитов = Новый Массив;
МассивИменРеквизитов.Добавить("ВидТовара1");
МассивИменРеквизитов.Добавить("ВидТовара2");
МассивИменРеквизитов.Добавить("ВидТовара3");
МассивИменРеквизитов.Добавить("ВидТовара4");
МассивИменРеквизитов.Добавить("ВидТовара5");

Для Каждого СтрокаТЧ из ТЧ Цикл
	МассивЗначений = Новый Массив;
	Для Каждого ИмяРеквизита Из МассивИменРеквизитов Цикл
		Если МассивЗначений.Найти(СтрокаТЧ[ИмяРеквизита]) = Неопределено Тогда
			МассивЗначений.Добавить(СтрокаТЧ[ИмяРеквизита]);
		Иначе
			Сообщить("Алярм! Алярм!");
		КонецЕсли;
	КонецЦикла;
КонецЦикла;
Показать
15. FatPanzer 17.09.20 10:36 Сейчас в теме
(11) Упс. Перечитал. Сейчас.
5. FatPanzer 17.09.20 09:57 Сейчас в теме
Выгрузить в ТЗ, свернуть ТЗ по ключевым полям и сверить количество строк, сматериться.
Или загрузить обратно в ТЧ, спросив у пользователя.
34. farengeit00 17.09.20 12:38 Сейчас в теме
ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("Колонка1");
	
	Для Каждого СтрокаТЧ ИЗ Объект.ТабличнаяЧасть1 Цикл
		СтрокаТЗ = ТЗ.Добавить();
		СтрокаТЗ.Колонка1 = СтрокаТЧ.Реквизит1;
		СтрокаТЗ = ТЗ.Добавить();
		СтрокаТЗ.Колонка1 = СтрокаТЧ.Реквизит2;
		СтрокаТЗ = ТЗ.Добавить();
		СтрокаТЗ.Колонка1 = СтрокаТЧ.Реквизит3;
		СтрокаТЗ = ТЗ.Добавить();
		СтрокаТЗ.Колонка1 = СтрокаТЧ.Реквизит4;
		СтрокаТЗ = ТЗ.Добавить();
		СтрокаТЗ.Колонка1 = СтрокаТЧ.Реквизит5;
		
		ТЗ.Свернуть("Колонка1");
		Если ТЗ.Количество() < 5 Тогда
			Сообщить("КУКУ");
		КонецЕсли;
		ТЗ.Очистить();	
	 КонецЦикла;
Показать
35. FatPanzer 17.09.20 12:50 Сейчас в теме
(34) Зачем нам сервер? Если можно проверять на клиенте перед записью? См. (19)
36. пользователь 23.09.20 10:38
Сообщение было скрыто модератором.
...
37. slasher777 28.09.20 14:00 Сейчас в теме
Кажись для начала нужно установить галку "Режим выбора из списка". После этого можно и ловить НачалоВыбораИзСписка и программно заполнять свойство СписокВыбора. Вернее не заполнять это свойство, а через него программно изменять список выбора. Но там еще пару каких-то приседаний нужно было сделать, чтобы корректно все работало.
Оставьте свое сообщение

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