Имя: Пароль:
1C
1С v8
Проверка на дубль строки в ТЧ документа (УФ)
,
0 zenon46
 
22.12.22
18:26
Доброго дня!
Есть документ, в котором имеется ТЧ, у которой есть поле Документ, составного типа. В каком событии и как оптимально проверить ТЧ документа на дубль строки при интерактивном добавлении строки.
Понятно что можно намутить в ОбработкаПроверкиЗаполнения, но хотелось бы юзеру сразу сказать что он добавляет то что уже есть в ТЧ.
1 lodger
 
22.12.22
18:27
(0) тогда цепляй все события где заполняется поле.
2 SleepyHead
 
гуру
23.12.22
05:11
(0) При интерактивном добавлении - никак. Строка еще пустая, в ней ничего нет.
3 Mihasya
 
23.12.22
05:31
(0)

На форму добавить реквизит "СписокДокументов", тип - СписокЗначений

В процедуре:

ТЧ_Документ_ПриИзменении()

ТекущиеДанные = Элементы.ТЧ.ТекущаяСтрока;
Если ТекущиеДанные  <> Неопределено и ЗначениеЗаполнено(ТекущиеДанные.Документ) Тогда
    Если ЭтаФорма.СписокДокументов.НайтиПоЗначению(ТекущиеДанные.Документ) Тогда
        ПоказатьПредупреждение(, "НИЗЯ!");
    КонецЕсли;
    ЭтаФорма.СписокДокументов.Добавить(ТекущиеДанные.Документ);
КонецЕсли;
4 Mihasya
 
23.12.22
05:32
+(3)
ЭтаФорма.СписокДокументов.НайтиПоЗначению(ТекущиеДанные.Документ) <> Неопределено
5 magicSan
 
23.12.22
08:35
только через соответствие - оно быстрее.
6 FirstLine Support
 
23.12.22
09:04
(3) как-то ненадежно и криво, а если пользователь удалит строку или изменит? Почему нельзя искать дубль непосредственно в самой таблице документа?
7 lodger
 
23.12.22
09:11
(6) это ж на каждый чих надо сбегать на сервер и искать в контексте.
8 FirstLine Support
 
23.12.22
09:18
(7) ну и нормально, сбегает, не устанет
9 lodger
 
23.12.22
09:23
(8) тоже вариант. приемлемо.
10 ass1c
 
23.12.22
09:28
(0) просто бы глянул как в типовых делают и взял бы...

Процедура ПроверитьДублиНабора(ИмяНабора, Сообщение, Отказ)
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Набор.Номенклатура,
    |    Набор.Характеристика,
    |    Набор.НомерСтроки
    |ПОМЕСТИТЬ ВТНабор
    |ИЗ
    |    &Набор КАК Набор
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    Набор.Номенклатура,
    |    Набор.Характеристика,
    |    МАКСИМУМ(Набор.НомерСтроки) КАК НомерСтроки
    |ИЗ
    |    ВТНабор КАК Набор
    |
    |СГРУППИРОВАТЬ ПО
    |    Набор.Номенклатура,
    |    Набор.Характеристика
    |
    |ИМЕЮЩИЕ
    |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Набор.НомерСтроки) > 1";
    
    Запрос.УстановитьПараметр("Набор", ЭтотОбъект[ИмяНабора]);
    Результат = Запрос.Выполнить();
    
    Выборка = Результат.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
            Сообщение,
            ЭтотОбъект,
            ИмяНабора + "[" + (Выборка.НомерСтроки - 1) + "].Номенклатура",
            "Объект",
            Отказ);
        
    КонецЦикла;
    
КонецПроцедуры


....

        КлючевыеРеквизиты = Новый Массив;
        КлючевыеРеквизиты.Добавить("Склад");
        
        ОбщегоНазначенияУТ.ПроверитьНаличиеДублейСтрокТЧ(ЭтотОбъект, "ПолитикиУчетаСерий", КлючевыеРеквизиты, Отказ,,Ложь);
....
и т.д.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.