![]() |
![]() |
![]() |
|
Как програмно реализовать уникальность поля в табличной части? | ☑ | ||
---|---|---|---|---|
0
Капюшон
24.01.11
✎
12:34
|
Мне нужно, чтобы в табличной части документа, небыло строчек с одинаковым значением "номенклатура". для этого я на поле "номенклатура" повесил следующий обработчик
Процедура ТоварыНоменклатураОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) ПоискДублей=Товары.Найти(ВыбранноеЗначение,"Номенклатура"); Если ПоискДублей<>Неопределено Тогда СтандартнаяОбработка=Ложь; Сообщить("в табличной части уже встречается номенклатура "+ВыбранноеЗначение); КонецЕсли; КонецПроцедуры Но этого оказалось недостаточно. ведь при копировании строки и добавлении новой с пустым полем "номенклатура", условие уникальности может нарушиться. Посоветуйте какие ещё обработчики надо повесить на табличную часть? |
|||
1
dimoff
24.01.11
✎
12:35
|
Зачем вешать ещё обработчики?
|
|||
2
Рэйв
24.01.11
✎
12:37
|
ТабличноеПоле (TableBox)
ПередОкончаниемРедактирования (BeforeEditEnd) Синтаксис: ПередОкончаниемРедактирования(<Новая строка>, <Отмена редактирования>, <Отказ>) Параметры: <Новая строка> Тип: Булево. Установлен в Истина, если строка была добавлена или скопирована. <Отмена редактирования> Тип: Булево. Истина, если произошла отмена редактирования. <Отказ> Тип: Булево. Признак отказа от выполнения действия. Значение по умолчанию: Ложь Описание: Вызывается перед окончанием редактирования строки. Проверяешь наличие выбранной номенклатуры и если есть Отказ=Истина; |
|||
3
Defender aka LINN
24.01.11
✎
12:40
|
Лучше перед записью проверять
|
|||
4
Капюшон
24.01.11
✎
12:44
|
(3)перед записью документа?
|
|||
5
Defender aka LINN
24.01.11
✎
12:45
|
(4) Ну, что у тебя там
|
|||
6
Капюшон
24.01.11
✎
12:47
|
(2)а это не срабатывает.
Процедура ТоварыПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ) Если Элемент.ТекущиеДанные.Номенклатура.Пустая()=Истина Тогда Отказ=Истина; Иначе ПоискДублей=Товары.Найти(Элемент.ТекущиеДанные.Номенклатура,"Номенклатура"); Если ПоискДублей<>Неопределено Тогда Отказ=Истина; Сообщить("в табличной части уже встречается номенклатура "+Элемент.ТекущиеДанные.Номенклатура); КонецЕсли; КонецЕсли; КонецПроцедуры он в любом случае сам себя находит |
|||
7
OFF
24.01.11
✎
12:51
|
найти строки?
|
|||
8
Рэйв
24.01.11
✎
12:51
|
(6)Пробегайся перебором и исключай тек строку.
|
|||
9
Капюшон
24.01.11
✎
12:57
|
(7)вариант
|
|||
10
lxs
24.01.11
✎
13:00
|
(9) смысл?
Что с (6)не выходит? Обработчик находит сам себя? Поставь условие на результат поиска, и будет тебе счастье. |
|||
11
lxs
24.01.11
✎
13:01
|
"Обработчик находит сам себя" - имел ввиду новую строку по введенному только что значению))
|
|||
12
Капюшон
24.01.11
✎
13:06
|
(10)какое условие? чтоб номер найденной строки небыл равен текущей7
|
|||
13
lxs
24.01.11
✎
13:07
|
(12) на количество найденных строк. Если больше 1, значит твое уже не уникально. Логично?
|
|||
14
pwei
24.01.11
✎
13:10
|
перед записью объекта: скопировать табчасть в тз (одна колонка номенклатура), добавить колонку счетчик. заполнить счетчик единичками. свернуть номенклатуру с суммированием счетчика. там где двойка - дубль
|
|||
15
Капюшон
24.01.11
✎
13:15
|
(13)найти не находит более одного значения. НайтиСтроки только придется юзать
|
|||
16
Капюшон
24.01.11
✎
13:21
|
вот как будет правильно
Если Элемент.ТекущиеДанные.Номенклатура.Пустая()=Истина Тогда Отказ=Истина; Иначе ПараметрыОтбора = Новый Структура; ПараметрыОтбора.Вставить("Номенклатура", Элемент.ТекущиеДанные.Номенклатура); НайденныеСтроки = Товары.НайтиСтроки(ПараметрыОтбора); Если НайденныеСтроки.Количество()>1 Тогда Отказ=Истина; Сообщить("в табличной части уже встречается номенклатура "+Элемент.ТекущиеДанные.Номенклатура); КонецЕсли; КонецЕсли; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |