Имя: Пароль:
1C
1С v8
Обращение к табличной части при создании или изменении документа.
0 Dice2307
 
26.02.13
11:31
Подскажите, пожалуйста, как сделать, чтобы при заполнении строк табличной части пользователь не мог выбрать один и тот же элемент справочника в разных строках несколько раз.
Наверное, нужно что то написать в процедуре ПриИзменении этого элемента табличной части? Но как проверить, что выбрано в других строках, если документ ещё не записан?
1 zladenuw
 
26.02.13
11:32
ТабличнайЧасть.Найти(НоваяСтрока). нашел, не добавляешь.
2 elCust
 
26.02.13
11:37
Используй ПередОкончаниемРедактирования, там можно отменить добавление новой строки.
3 Dice2307
 
26.02.13
11:40
Табличная часть называется "Оборудование", в ней один реквизит - "Номенклатура".
Вот так не даёт писать:

&НаКлиенте
Процедура ОборудованиеТерминалыПриИзменении(Элемент)
   Если Оборудование.Номенклатура.Найти(Элемент)Тогда
       //
   КонецЕсли;
КонецПроцедуры
4 Rovan
 
модератор
26.02.13
11:41
(0) в ПриОкончанииРедактирования()
5 Dice2307
 
26.02.13
11:42
Там есть только ПриОкончанииВводаТекста
6 Rovan
 
гуру
26.02.13
11:42
(+4) даже лучше в ПередОкончаниемРедактирования()
7 Dice2307
 
26.02.13
11:46
Там есть только:
ПриИзменении
НачалоВыбора
НачалоВыбораИзСписка
Очистка
Регулирование
Открытие
ОбработкаВыбора
Автоподбор
ОкончаниеВводаТекста
8 zladenuw
 
26.02.13
11:47
(7) табличнаяЧасть.найти. а не реквизит табличной части
9 zladenuw
 
26.02.13
11:47
(7) ДенисЧ СП продает.
а вообще вот
Пример:

НайденнаяСтрока = Состав.Найти(ТекТовар, "Номенклатура");
Если НайденнаяСтрока = Неопределено Тогда
   Текст = "ru = ""Товар не найден!"";"
    + " en = ""Article not found!""";
   Предупреждение(НСтр(Текст));
Иначе
   Количество = НайденнаяСтрока.Количество;
КонецЕсли;
10 Reset
 
26.02.13
11:50
(9) Найти() не подходит для задачи
Процитируй, раз взялся, НайтиСтроки()
11 zladenuw
 
26.02.13
11:52
(10) почему нет ? если проверять на уникальность сразу. то в каждой строке будет одна уникальная номенклатура.
12 Reset
 
26.02.13
12:05
(11) Когда сразу? Лепить отдельный механизм выбора, отвязанный от элемента формы?
Найти() не подходит, так как будет находить номенклатуру в текущей строке, а не дубль
13 Dice2307
 
26.02.13
12:17
Нашёл процедуры ПриОкончанииРедактирования() и ПередОкончаниемРедактирования() у самой табличной части документа, а не у её элемента
Говорит, что нельзя обратиться так - ТекущаяСтрока:
Документ.Поступление.Форма.ФормаДокумента.Форма(4,2)}: Переменная не определена (ТекущаяСтрока)
14 Dice2307
 
26.02.13
12:21
И пример zladenuw тоже не получается:
{Документ.Поступление.Форма.ФормаДокумента.Форма(4,19)}: Переменная не определена (Состав)
15 kosts
 
26.02.13
12:21
Для удобства пользователей можно подсвечивать серым шрифтом строки в форме выбора, которые уже есть в документе (и не реагировать на их выбор).
16 Reset
 
26.02.13
12:28
+(15) Но проверку все равно делать, так могут ввести "по строке", скопировать строку
17 Xatori
 
26.02.13
12:29
Да сгруппируй данные перед последующей обработкой и всего делов и пусть добавляют сколько угодно.
18 Dice2307
 
26.02.13
12:32
Парни, я совсем новичок. Что писать то.. ТекущаяСтрока - он не понимает.
19 Dice2307
 
26.02.13
12:32
ой, то есть ТабличнаяЧасть не понимает
20 Xatori
 
26.02.13
12:37
Да и собственно почему не обратится в модуле формы к самой табличной части например ЭтаФорма.СписокДокументовВыработкаОС

СписокДокументовВыработкаОС - ТЧ. Методы работы с ТЧ думаю не надо писать.
21 Reset
 
26.02.13
12:40
(19) Объект.Оборудование - вот твоя "табличная часть".
Только это не табличная часть, строго говоря, а ДанныеФормыКоллекция
22 Xatori
 
26.02.13
12:43
(21) а где то писали что Управляемая форма? что то я пропустил)) Да там на 5 строчек кода, неинтересно)
23 Reset
 
26.02.13
12:53
(22) Телепатия, 2 дан
24 Dice2307
 
26.02.13
12:58
Форма управляемая, да.
25 Xatori
 
26.02.13
13:01
(23) :) ГрандМастер прям, грац
26 notebug
 
26.02.13
13:42
лайткод =)

[CODE]&НаКлиенте
Процедура ОборудованиеПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)
   
   Если ОтменаРедактирования Тогда
       Возврат;
   КонецЕсли;
   
   ОчиститьСообщения();
   
   ТекущиеДанные = Элементы.Оборудование.ТекущиеДанные;
   
   Найдено = Объект.Оборудование.НайтиСтроки(Новый Структура("Номенклатура", ТекущиеДанные.Номенклатура));
   
   Отказ = Найдено.Количество() > 1;
   
   Если Отказ Тогда
       НомерСтроки = 0;
       Для Каждого СтрокаОборудование Из Найдено Цикл
           Если СтрокаОборудование.НомерСтроки = ТекущиеДанные.НомерСтроки Тогда
               Продолжить;
           КонецЕсли;
           НомерСтроки = СтрокаОборудование.НомерСтроки;
       КонецЦикла;
       Сообщить("Дубли в строке: " + НомерСтроки);
   КонецЕсли;
   
КонецПроцедуры[/CODE]
27 kosts
 
26.02.13
13:46
CODE заменяй на 1с, будет работать
28 kosts
 
26.02.13
13:48
"Дубли в строке: " пиши человеческим языком, как-то так

Товар <Name> уже введен в строке №
29 notebug
 
26.02.13
13:51
(28) нафиг мне это писать =) Это же пример. Как будет ТС делать - это уже меня не волнует =)
30 kosts
 
26.02.13
14:06
(29) =) Я что то подумал, что это ТС так сделал...
31 Dice2307
 
26.02.13
14:47
Всем большое спасибо за терпение!
Особенно notebug - этот пример заработал!
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс