Имя: Пароль:
1C
 
Поиск дублей в табличной части
0 animatic
 
16.02.16
10:25
Добрый день. Задача такая, нужно запретить пользователям продавать дублирующиеся товары. Подскажите что будет правильнее использовать с точки зрения производительности поиск дублей при изменении строки, например через НайтиСтроки и вывод сообщения пользователю. Либо в обработке проверки заполнения поиск уже по всей табличной части, например таким кодом:
ТаблицаДублей = Товары.Выгрузить();
    ТаблицаДублей.Колонки.Добавить("КоличествоДублей");
    ТаблицаДублей.ЗаполнитьЗначения(1, "КоличествоДублей");
    ТаблицаДублей.Свернуть("Штрихкод", "КоличествоДублей");
    
    Если Товары.Количество() <> ТаблицаДублей.Количество() Тогда
        
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    ТаблицаДублей.Штрихкод
        |ПОМЕСТИТЬ ВТ_ТаблицаДублей
        |ИЗ
        |    &ТаблицаДублей КАК ТаблицаДублей
        |ГДЕ
        |    ТаблицаДублей.КоличествоДублей > 1
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ВТ_ТаблицаДублей.Штрихкод
        |ИЗ
        |    ВТ_ТаблицаДублей КАК ВТ_ТаблицаДублей";
        
        Запрос.УстановитьПараметр("ТаблицаДублей", ТаблицаДублей);
        
        ВыборкаДубли = Запрос.Выполнить().Выбрать();
        
        Пока ВыборкаДубли.Следующий() Цикл
            
            НомераСтрок = "";
            
            СтруктураОтбора = Новый Структура;
            СтруктураОтбора.Вставить("Штрихкод", ВыборкаДубли.Штрихкод);
            
            НайденныеСтроки = Товары.НайтиСтроки(СтруктураОтбора);
            
            Для Каждого ТекСтрока Из НайденныеСтроки Цикл
                НомераСтрок = ?(НомераСтрок = "", Строка(ТекСтрока.НомерСтроки), НомераСтрок + ", " + Строка(ТекСтрока.НомерСтроки));
            КонецЦикла;
            
            ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                НСтр("ru = 'В строках: %1 используется одинаковый шрихкод %2. Проведение невозможно!'"),
                НомераСтрок,
                ВыборкаДубли.Штрихкод);    
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, ЭтотОбъект);
        
        КонецЦикла;
        
        Отказ = Истина;
    КонецЕсли;
На штрихкод не обращать внимания, тут база такая кривая, в принципе логика поиска интересует, вместо него можно использовать Номенклатуру.
1 Cyberhawk
 
16.02.16
10:26
Перед проведением на форме
2 ObjectRelation Model
 
16.02.16
10:26
и в первом и во втором случае проверять надо
но не запрещать, а сворачивать строки
3 Cyberhawk
 
16.02.16
10:26
Ибо нельзя запрещать создавать черновик документа - может он там цены разные для одного товара хочет зафиксировать
4 animatic
 
16.02.16
10:29
(3) там говорю же прога специфическая, если не сказать матом. Там штрихкоды не связаны с номенклатурой и у одной номенклатуры может быть несколько штрихкодов. Как я понял это связано со штучным товаром. Т.е. товар один, но цена разная, зависящая от веса и еще чего-то, почему не использовали характеристики я не знаю. Но сейчас вопрос не в доработке программы, а в том, чтобы пользователь не мог продать в одном документе товары с одинаковыми штрихкодами. Объединять тут не пойдет.
5 sash-ml
 
16.02.16
10:29
посмотри как в типовых подбор реализован.
там что-то вроде
    СтрокаТабличнойЧасти = ОбработкаТабличныхЧастей.НайтиСтрокуТабЧасти(ТабличнаяЧасть, СтруктураОтбора);