Проверка на наличие данные в Табличной части справочника упр приложение

1. Вожак 17.02.14 13:33 Сейчас в теме
управляемое приложение, самописная конфа. Есть справочник контрагенты, у него есть ТП - транспортные средства, и нужно, чтобы при добавлении нового транспортного средства, если такое уже есть у контрагента, вылезала ошибка, в обычном приложении можно было просто циклом пройтись по строкам это ТЧ и условие прописать, а как в управляемом приложении сделать это?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Drak0n 188 17.02.14 14:04 Сейчас в теме
Собственно так же можно обойти ТЧ
Для Каждого СтрокаТЧ Из Объект.ТранспортныеСредства Цикл
   Тут условие
КонецЦикла;
3. Tommy82 65 17.02.14 14:04 Сейчас в теме
ТЧ есть в реквизитах этого справочника?
4. Вожак 17.02.14 14:06 Сейчас в теме
5. Вожак 17.02.14 14:09 Сейчас в теме
я не могу придумать как условие сделать, вот я получил мою ТЧ:
ДобавляемоеТС = Элементы.ТранспортныеСредства.ТекущиеДанные;
точнее текущую строку в табличной части, а как потом сделать проверку, есть ли в ТЧ уже записи с такими данными или нет?
6. Tommy82 65 17.02.14 14:12 Сейчас в теме
Выше уже ответили
в свойствах ТЧ в "События" выбираете событие, которое более подходит, создаете для него процедуру или функцию на Клинете и циклом проверяете
7. Вожак 17.02.14 14:13 Сейчас в теме
&НаКлиенте
Процедура ТранспортныеСредстваПриИзменении(Элемент)
ДобавляемоеТС = Элементы.ТранспортныеСредства.ТекущиеДанные;
Для каждого строка из Объект.ТранспортныеСредства Цикл
Если НЕ строка.ТранспортноеСредство = ДобавляемоеТС.ТранспортноеСредство Тогда
Сообщить("Такое ТС уже есть в базе");
КонецЕсли;
КонецЦикла;

КонецПроцедуры
но такое условие выдает мне постоянно что такое ТС есть, мне же нужно, что если уже введено такое ТС, то ошибка летит, иначе нет
8. Drak0n 188 17.02.14 14:15 Сейчас в теме
Я бы перехватывал транспорное средство до добавления в тч
9. Вожак 17.02.14 14:17 Сейчас в теме
(8) Drak0n, в таком случае, даже когда вводится первое Тс, уже летит ошибка что найдено совпадение
10. Вожак 17.02.14 14:19 Сейчас в теме
ошибка про совпадение летит при каждом добавлении строки, и в итоге все равно добавляются нвоые строки
11. Drak0n 188 17.02.14 14:21 Сейчас в теме
Извиняюсь, уже увидел...
А если поиском по ТЧ? Нашли 2 совпадения - дубль
12. Вожак 17.02.14 14:21 Сейчас в теме
там с отбором еще структуру если создавать?
13. Tommy82 65 17.02.14 14:23 Сейчас в теме
по номеру строки обратитесь
СтрокаТабличнойЧасти = Элементы.ПереченьНоменклатуры.ТекущиеДанные;
НомерСтроки = СтрокаТабличнойЧасти.НомерСтроки;
15. Вожак 17.02.14 14:26 Сейчас в теме
(13) treblinka, в упр приложении нет такого
14. Вожак 17.02.14 14:24 Сейчас в теме
делал так:
ТекДанные = Элементы.ТранспортныеСредства.ТекущиеДанные;
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("ТранспортноеСредство", ТекДанные);
НайденныеСтроки = Объект.ТранспортныеСредства.НайтиСтроки(ПараметрыОтбора);
не получается
16. Drak0n 188 17.02.14 14:26 Сейчас в теме
ПараметрыОтбора.Вставить("ТранспортноеСредство", ТекДанные.ТранспортноеСредство);
17. Вожак 17.02.14 14:28 Сейчас в теме
{Справочник.Контрагенты.Форма.ФормаЭлемента.Форма(256)}: Значение не является значением объектного типа (ТранспортныеСредства)
ПараметрыОтбора.Вставить("ТранспортноеСредство", ТекДанные.ТранспортныеСредства);
18. Drak0n 188 17.02.14 14:29 Сейчас в теме
Какие колонки у тебя в ТЧ ТранспортныеСредства?
19. Вожак 17.02.14 14:32 Сейчас в теме
Номер и ТранспортноеСредство
20. Drak0n 188 17.02.14 14:33 Сейчас в теме
Так и обращайся к ТранспортноеСредство, а не ТранспортныеСредства
ПараметрыОтбора.Вставить("ТранспортноеСредство", ТекДанные.ТранспортноеСредство);

И дальше циклом обходишь полученный от поиска результат...
21. Вожак 17.02.14 14:34 Сейчас в теме
заметилЭ, исправил но все равно ошибка, на первой строке, у нас ТекДанные = Неопределено, соответственно дальше уже летит ошибка на объектном типе
22. Drak0n 188 17.02.14 14:37 Сейчас в теме
То есть неопределено. В каком событии вызываешь проверку?
23. Вожак 17.02.14 14:37 Сейчас в теме
ошибку убрал, но как теперь в цикле проверку на одинаковые значения?
24. Вожак 17.02.14 14:39 Сейчас в теме
&НаКлиенте
Процедура ТранспортныеСредстваПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
ТекДанные = Элементы.ТранспортныеСредства.ТекущиеДанные;
Если ТекДанные = Неопределено Тогда
Возврат
КонецЕсли;

ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("ТранспортноеСредство", ТекДанные.ТранспортноеСредство);
НайденныеСтроки = Объект.ТранспортныеСредства.НайтиСтроки(ПараметрыОтбора);
Для каждого строка из НайденныеСтроки Цикл
Если строка.ТранспортноеСредство = ТекДанные.ТранспортноеСредство Тогда
Сообщить("такая запись уже есть");
КонецЕсли;
КонецЦикла;
КонецПроцедуры


При добавлении второй строки, даже до выбора ТС летит ошибка что такое ТС уже есть
25. Drak0n 188 17.02.14 14:43 Сейчас в теме
Жуткий код получается... Но как-то так:
&НаКлиенте 
Процедура ТранспортныеСредстваПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) 
ТекДанные = Элементы.ТранспортныеСредства.ТекущиеДанные; 
Если ТекДанные = Неопределено Тогда 
 Возврат 
КонецЕсли; 

ПараметрыОтбора = Новый Структура("ТранспортноеСредство", ТекДанные.ТранспортноеСредство); 
НайденныеСтроки = Объект.ТранспортныеСредства.НайтиСтроки(ПараметрыОтбора); 
Для каждого строка из НайденныеСтроки Цикл 
 Если строка.Номер <> ТекДанные.Номер Тогда 
 Сообщить("такая запись уже есть"); 
 КонецЕсли; 
 КонецЦикла; 
КонецПроцедуры
Показать
27. Вожак 17.02.14 14:45 Сейчас в теме
(25) Drak0n, он все равно дает добавить такие же записи, и ошибка что запись есть не летит
26. Drak0n 188 17.02.14 14:45 Сейчас в теме
Так же должен работать код
&НаКлиенте 
Процедура ТранспортныеСредстваПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) 
ТекДанные = Элементы.ТранспортныеСредства.ТекущиеДанные; 
Если ТекДанные = Неопределено Тогда 
 Возврат 
КонецЕсли; 

Для каждого Строка из Объект.ТранспортныеСредства Цикл 
 Если Строка.ТранспортноеСредство = ТекДанные.ТранспортноеСредство
  И Строка.Номер <> ТекДанные.Номер Тогда 
 Сообщить("такая запись уже есть"); 
 КонецЕсли; 
 КонецЦикла; 
КонецПроцедуры
Показать
28. Drak0n 188 17.02.14 14:47 Сейчас в теме
Но в любом случае - попробуй перехватить транспортное средство до добавления его в ТЧ... Так будет намного правильней и быстрее.
29. Вожак 17.02.14 14:47 Сейчас в теме
так мы пробовали в люых случаях, и запись все равно попадает в ТЧ(
30. Вожак 17.02.14 14:54 Сейчас в теме
Текущие данные у нас буду определяться той строкой, на которой мышка стоит, а нужно как то отследить значение, которое было добавлено, и потом сделать проверку, есть это значение у нас или нет еще
31. Вожак 17.02.14 15:08 Сейчас в теме
32. Вожак 17.02.14 15:13 Сейчас в теме
как получить новодобавленную строку не через текущие данные?
34. Sevens 6 17.02.14 15:22 Сейчас в теме
(32) Вожак, Через Элемент.Значение.
Или проверяйте при записи документа циклом ТабЧасть ;)
33. Sevens 6 17.02.14 15:18 Сейчас в теме
ПРоцедура "ПриИзменении" на элементе ТЧ

Дальше через найтиСтроки()

ТекДанные = Элементы.ТранспортныеСредства.ТекущиеДанные;
ПараметрыОтбора = Новый Структура("ТранспортноеСредство", ТекДанные.ТранспортноеСредство); 
//Или ПараметрыОтбора = Новый Структура("ТранспортноеСредство", Элемент.Значение); 
НайденныеСтроки = Объект.ТранспортныеСредства.НайтиСтроки(ПараметрыОтбора); 
Если НайденныеСтроки.Количество() > 1 Тогда
Сообщить("Уже есть");
КонецЕсли;


Всё...
35. Вожак 17.02.14 15:24 Сейчас в теме
вроде получилось, а как теперь сделать, чтобы строка не записывалась? добавлял Отказ = Истина, но она все равно записывается
36. Sevens 6 17.02.14 15:24 Сейчас в теме
(35) Вожак, удали строку просто ;)
37. Вожак 17.02.14 15:25 Сейчас в теме
38. Sevens 6 17.02.14 15:29 Сейчас в теме
Вот рабочий код по поиску дублей номенклатуры в ТЧ - Товары. В процедуре "При окончании редактирования" Табличной части
Процедура ТоварыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	Попытка
		СтрокаТабличнойЧасти = ЭлементыФормы.Товары.ТекущаяСтрока;
		Номенклатура = СтрокаТабличнойЧасти.Номенклатура;
		СтруктураДляПоиска = Новый Структура;
		структураДляПоиска.Вставить("Номенклатура",Номенклатура);
		МассивСтрок = Товары.НайтиСтроки(структураДляПоиска);
		Если   МассивСтрок.Количество()>1 Тогда
			Сообщить("Уже есть такой товар"+ строка(Номенклатура));
			ЭтотОбъект.Товары.Удалить(СтрокаТабличнойЧасти);
			возврат;
		КонецЕсли;
	Исключение
	КонецПопытки;	

КонецПроцедуры
Показать
39. Вожак 17.02.14 15:33 Сейчас в теме
(38) Sevens, вот что получилось:
&НаКлиенте
Процедура ТранспортныеСредстваПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
ТекДанные = Элементы.ТранспортныеСредства.ТекущиеДанные;
СтрокаТабличнойЧасти = Элементы.ТранспортныеСредства.ТекущаяСтрока;
ПараметрыОтбора = Новый Структура("ТранспортноеСредство", ТекДанные.ТранспортноеСредство);
НайденныеСтроки = Объект.ТранспортныеСредства.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтроки.Количество() > 1 Тогда
Сообщить("Вводимое ТС уже есть у данного контрагента");
Объект.ТранспортныеСредства.Удалить(СтрокаТабличнойЧасти);
Возврат
КонецЕсли;
КонецПроцедуры

и летит ошибка:
{Справочник.Контрагенты.Форма.ФормаЭлемента.Форма(275)}: Ошибка при вызове метода контекста (Удалить)
Объект.ТранспортныеСредства.Удалить(СтрокаТабличнойЧасти);
по причине:
Недопустимое значение параметра (параметр номер '1')
40. Sevens 6 17.02.14 15:36 Сейчас в теме
Удалить доступно На сервере ;)
41. Вожак 17.02.14 15:37 Сейчас в теме
я запутался, как быть с удалением лишней строки тогда?
42. Sevens 6 17.02.14 15:38 Сейчас в теме
&НаКлиенте 
Процедура ТранспортныеСредстваПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) 
СтрокаТабличнойЧасти = Элементы.ТранспортныеСредства.ТекущаяСтрока; 
ПараметрыОтбора = Новый Структура("ТранспортноеСредство", СтрокаТабличнойЧасти.ТранспортноеСредство); 
НайденныеСтроки = Объект.ТранспортныеСредства.НайтиСтроки(ПараметрыОтбора); 
Если НайденныеСтроки.Количество() > 1 Тогда 
Сообщить("Вводимое ТС уже есть у данного контрагента"); 
УдалитьСтроку(СтрокаТабличнойЧасти);
Возврат 
КонецЕсли; 
КонецПроцедуры

&НаСервере
Процедура УдалитьСтроку(СтрокаТЧ)
Объект.ТранспортныеСредства.Удалить(СтрокаТЧ); 
КонецПроцедуры
Показать


Поидее должно работать) Не проверял. Только ещё в попытку оберни код "При окончании". Зачем делал не вспомню... но раз делал значит надо было)
43. Вожак 17.02.14 15:39 Сейчас в теме
(42) Sevens, да, получилось, спасибо большое!!!)))
Оставьте свое сообщение

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