Имя: Пароль:
1C
1С v8
Дублирование строк в табличной части справочника 1С !
,
0 Oleg37701
 
21.06.21
01:29
Задача такая, есть табличная часть с двумя реквизитами, "Продукт" и "Количество", при добавление в табличную часть продукта необходимо проверять на наличие дублей и если таковы есть, то в уже имеющийся прибавить количество, а не создавать ещё один такой же продукт. Получилось написать, но только на удаление дублирующих записей а как сложить не понимаю

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


Функция Свернуть не подходит так как есть другие важные колонки, по котором расхождение.
1 МихаилМ
 
21.06.21
02:53
1)начните с начала - с изучения русского языка.
2)Программирование , оно ведь не для всех. Дедушка Нуралиев обманул.
3)но если хочется, то прочтите СНАЧАЛА  книжки по 1с. там большинство простых ситуаций рассматривается. и Ваша - тоже.

а так как-то не хорошо получается.
2 craxx
 
21.06.21
03:33
(0) НайтиСтроки()
3 JeHer
 
21.06.21
03:36
(1) а он что, на китайском написал, что ли?
4 Chameleon1980
 
21.06.21
05:41
не понял?

...Получилось написать, но только на удаление дублирующих записей ...

те удаление победил
далее:

...а как сложить не понимаю...

но

Функция Свернуть не подходит так как есть другие важные колонки, по котором расхождение.
6 Oleg37701
 
21.06.21
08:42
(2) Понял, попробую сопоставить
9 Serg_1960
 
модератор
21.06.21
09:01
7. Соблюдайте общепринятые нормы морали, права и сетевой этикет
11 Serg_1960
 
21.06.21
09:14
(4) Интересный вопрос, кстати: как использовать сворачивание, если в ТЧ есть колонки, которые не "участвуют" в сворачивании, но их значения не должны "теряться"? Тем не менее, решение - есть :)
12 Chameleon1980
 
21.06.21
09:25
Запрос
13 Oleg37701
 
21.06.21
09:51
(9) Почему это не адресовано также (1) Михаилу?
14 Oleg37701
 
21.06.21
09:52
(11) А не подскажете как , без запроса? Какое решение?
15 Prog111
 
21.06.21
09:56
Я бы сделал через НайтиСтроки(СтруктураПараметров) - если возвращаемый массив строк пустой - то добавляю строку, если не пустой - то позиционируюсь на найденной строке и в ней добавляю количество к имеющемуся количеству.
16 minsk1s
 
21.06.21
10:48
(14) можно выгрузить в Таблицу значений. А там уже с помощью свертки и сортировки...
17 ColonelAp4u
 
21.06.21
12:10
(0) решается очень легко при использовании метода найти(возвращает найденную строку при подборе) или найтистроки(возвращает массив строк по указанной структуре отбора)
Пример при подборе обработка подбора возвращает номенклатуру из подбора

Стр = Товары.найти(ТоварИзПодбора, "Номенклатура");
Если Стр = Неопределенно тогда
Стр = Товары.добавить();
//заполняешь реквизиты включая количество
Иначе
Стр. Количество = Стр.Количество + КоличествоИзПодбора
КонецЕсли;
18 orakool
 
21.06.21
12:23
(12) (15) (16) (17) это всё не решает проблему "Функция Свернуть не подходит так как есть другие важные колонки, по котором расхождение."
19 Serg_1960
 
21.06.21
12:42
Эх, ёпрст, попробую скрестить ежа и кота :)

    КолонкиГруппировок = "Номенклатура, ХарактеристикаНоменклатуры, ЕдиницаИзмерения"; // остальные "важные" колонки не используются при группировке
    ДокументОбъект = Документы.ЗаказПокупателя.НайтиПоНомеру("12345", ТекущаяДата()).ПолучитьОбъект();    // документ из конфигурации УПП чисто для примера
    ТЗ = ДокументОбъект.Товары.Выгрузить();
    ТЗ.Свернуть(КолонкиГруппировок, "Количество");
    Для Каждого Запись Из ТЗ Цикл
        ПараметрыОтбора = Новый Структура(КолонкиГруппировок);
        ЗаполнитьЗначенияСвойств(ПараметрыОтбора,Запись);
        НайденныеСтроки = ДокументОбъект.Товары.НайтиСтроки(ПараметрыОтбора);
        Для Каждого Строка Из НайденныеСтроки Цикл // закидываем значения в первопопавшиеся строки, остальные - обнуляем.
            Строка.Количество = Запись.Количество;
            Запись.Количество = 0;
            ОбработкаТабличныхЧастей.РассчитатьКоличествоМестТабЧасти(Строка, ДокументОбъект); // типовой функционал УПП, так положено
            ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(Строка, ДокументОбъект);
            ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(Строка, ДокументОбъект);
        КонецЦикла;
    КонецЦикла;
    УдаляемыеСтроки = ДокументОбъект.Товары.НайтиСтроки(Новый Структура("Количество", 0));  // строки, которым "не повезло"
    Для Каждого Строка Из УдаляемыеСтроки Цикл
        ДокументОбъект.Товары.Удалить(Строка);
    КонецЦикла;
20 Bigbro
 
21.06.21
12:49
(18) а что за проблема со свернуть?
добавляйте все поля которые не должны быть потеряны через запятую и все.
что еще нужно?
21 Serg_1960
 
21.06.21
13:05
(20) Нуу... предположим на мгновение, например, что все строки в таблице - уникальные по значениям всех полей. Ок? Группировать будет нечего :)
Закон Брукера: Даже маленькая практика стоит большой теории.