Имя: Пароль:
1C
 
Как програмно реализовать уникальность поля в табличной части?
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 Тогда
           Отказ=Истина;
           Сообщить("в табличной части уже встречается номенклатура "+Элемент.ТекущиеДанные.Номенклатура);
       КонецЕсли;
   КонецЕсли;