Имя: Пароль:
1C
1С v8
Удаление задвоенных строк ТЧ 1с 8.2
, ,
0 DmitriyDI
 
24.06.13
11:00
Всем доброго утра и хорошего дня, есть задачка, удалить задвоенные строки табличной части, написал код, но он не работает, никак не могу понять в чем дело, решил спросить у Вас, вот код:


Процедура КнопкаВыполнитьНажатие(Кнопка)
Режим = РежимДиалогаВопрос.ДаНетОтмена;
Ответ = Вопрос("Выполнить?", Режим, 0);
 
Если Ответ =КодВозвратаДиалога.Да Тогда
       Предупреждение("Данное действие приведет к необратимым последствиям.",60,"Предупреждение системы 1с");
       
       СпрНоменклатура= Справочники.Номенклатура.Выбрать();
       Пока СпрНоменклатура.Следующий() = 1 Цикл
           Объект = СпрНоменклатура.ПолучитьОбъект();
           А=0;
           Для Каждого ТекущаяСтрока Из СпрНоменклатура.ТЧФирма Цикл
               Если ТекущаяСтрока.Склад.Наименование = "Торговый зал (Новая Деревня)" И ТекущаяСтрока.Фирма.Наименование = "ИП Новиков"Тогда
                   А=А+1;
               КонецЕсли;
               Если А = 2 Тогда
                   Сообщить("Удален элемент номенклатруры: "+СпрНоменклатура.Код+", "+СпрНоменклатура.Наименование+", Основной поставщик:"+ СпрНоменклатура.ОсновнойПоставщик);
                   Объект.ТЧФирма.Получить((НомерСтроки);
               КонецЕсли;
           КонецЦикла;
           Объект.Записать();
       КонецЦикла;    
       
ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда
       Сообщить("Не выполнено");
КонецЕсли;  
КонецПроцедуры
1 Cube
 
24.06.13
11:03
(0) У тебя ничего не получилось, если в двух словах :)
2 Cube
 
24.06.13
11:04
Что за переменная "НомерСтроки" ?
3 del123
 
24.06.13
11:06
Будь мужиком, сделай в запросе!
4 Godofsin
 
24.06.13
11:06
(3) +1
5 DmitriyDI
 
24.06.13
11:07
(2)                    Объект.ТЧФирма.Получить(ТекущаяСтрока.НомерСтроки);
тьфу ты вот так делаю
6 Cube
 
24.06.13
11:07
(3) (4) А что в запросе ты сделаешь? Ну, давай, выбери затроенные строки и поудаляй... Цикл в этом случае предпочтительней.
7 Молодой 1Снег
 
24.06.13
11:07
Может проще выгрузить в ТЗ и свернуть?
8 DmitriyDI
 
24.06.13
11:08
(3) ни разу так не делал сейчас попробую поискать примеры)
9 Cube
 
24.06.13
11:09
(8) Не заморачивайся. У тебя ошибка не в выборке данных, а в логике цикла.
10 del123
 
24.06.13
11:09
(6) Ну в запросе получить нужные объекты хотя бы. Потом уже через НайтиСтроки(), например, найти и удалить задвоенные.
11 DmitriyDI
 
24.06.13
11:09
(7) Да вначале думал так сделать, но в принципе условие отрабатывает ток 1 фирма задвоилась
12 DmitriyDI
 
24.06.13
11:09
(9) в чем именно ?
13 Godofsin
 
24.06.13
11:10
(6) Прикольно конечно лопатить всю номенклатуру. У меня вот овер 150 твс. позиций
14 DmitriyDI
 
24.06.13
11:12
(13) у меня столько же думал транзакцию еще дописать нормально должно все быть
15 Cube
 
24.06.13
11:14
(13) Ну так и пиши, что можно выборку сделать оптимальнее. На правильность выполнения это не влияет. У него вообще сейчас не работает :)
16 Cube
 
24.06.13
11:15
(12) Примерно так:

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

А вместо СпрНоменклатура = Справочники.Номенклатура.Выбрать(); можно и запросик накидать, если нужно лопатить не всё.
17 Cube
 
24.06.13
11:16
(16) Ой, напарился... :)
Вот так правильно:
       СпрНоменклатура = Справочники.Номенклатура.Выбрать();
       Пока СпрНоменклатура.Следующий() Цикл
           СпрОбъект = СпрНоменклатура.ПолучитьОбъект();
           НомерСтроки = 0;
           Пока НомерСтроки < СпрОбъект.ТЧФирма.Количество() Цикл
               Если ТекущаяСтрока.Склад.Наименование = "Торговый зал (Новая Деревня)" И ТекущаяСтрока.Фирма.Наименование = "ИП Новиков"Тогда
                   НомерСтроки = НомерСтроки + 1;
                   Продолжить;
               КонецЕсли;
               Сообщить("Удалена строка элемента номенклатруры: "+СпрОбъект.Код+", "+СпрОбъект.Наименование+", Основной поставщик:"+ СпрОбъект.ОсновнойПоставщик);
               СпрОбъект.ТЧФирма.Удалить(НомерСтроки);
           КонецЦикла;
           СпрОбъект.Записать();
       КонецЦикла;
18 Cube
 
24.06.13
11:17
(17) Блин, забыл, что надо только дублированные строки-то удалить.... Ща :)
19 lamesnake
 
24.06.13
11:19
А почему просто не свернуть саму табличную часть?
20 Бледно Золотистый
 
24.06.13
11:20
(19)+1 Тоже хотел спросить, но постеснялся.
21 Cube
 
24.06.13
11:20
(18) С проверкой реквизита ПроверяемыйРеквизитТЧ1 на задвоенность:

       СпрНоменклатура = Справочники.Номенклатура.Выбрать();
       ПроверяемыйРеквизитТЧ1 = Неопределено;
       Пока СпрНоменклатура.Следующий() Цикл
           СпрОбъект = СпрНоменклатура.ПолучитьОбъект();
           НомерСтроки = 0;
           Пока НомерСтроки < СпрОбъект.ТЧФирма.Количество() Цикл
               Если (ТекущаяСтрока.Склад.Наименование = "Торговый зал (Новая Деревня)" И ТекущаяСтрока.Фирма.Наименование = "ИП Новиков") ИЛИ ПроверяемыйРеквизитТЧ1 <> ТекущаяСтрока.ПроверяемыйРеквизитТЧ1 Тогда
                   НомерСтроки = НомерСтроки + 1;
                   ПроверяемыйРеквизитТЧ1 = ТекущаяСтрока.ПроверяемыйРеквизитТЧ1;
                   Продолжить;
               КонецЕсли;
               Сообщить("Удалена строка элемента номенклатруры: "+СпрОбъект.Код+", "+СпрОбъект.Наименование+", Основной поставщик:"+ СпрОбъект.ОсновнойПоставщик);
               СпрОбъект.ТЧФирма.Удалить(НомерСтроки);
           КонецЦикла;
           СпрОбъект.Записать();
       КонецЦикла;
22 Cube
 
24.06.13
11:22
+(21) строку "ПроверяемыйРеквизитТЧ1 = Неопределено;" надо внести внутрь цикла.
23 DmitriyDI
 
24.06.13
11:30
(21) так сейчас я переварю информацию)
24 Молодой 1Снег
 
24.06.13
11:30
(21) Еще нужно предварительно отсортировать по проверяемому реквизиту. Иначе не заработает этот код.
25 DmitriyDI
 
24.06.13
11:30
(20) (19) Так зачем усложнять все)))
26 lamesnake
 
24.06.13
11:31
(22) (23) Ребята, у вас зарплата от количества строчек кода зависит?
27 DmitriyDI
 
24.06.13
11:32
(26) ахахаха)) не прямо конечно, а вообще косвенно конечно да)))
28 lamesnake
 
24.06.13
11:35
(27) Ну а зачем тогда огород городить:

ТабличнаяЧасть.Свернуть("Имена всех колонок");
29 Бледно Золотистый
 
24.06.13
11:41
(25) Не понял, одна строка ТЧ.Свернуть это сильно сложно?
30 DmitriyDI
 
24.06.13
11:52
Переделал вот так)

Если Ответ =КодВозвратаДиалога.Да Тогда
       Предупреждение("Данное действие приведет к необратимым последствиям.",60,"Предупреждение системы 1с");
       
       СпрНоменклатура= Справочники.Номенклатура.Выбрать();
       Пока СпрНоменклатура.Следующий() = 1 Цикл
               Объект.ТЧФирма.Свернуть("Склад,Фирма");
               Объект.Записать();
       КонецЦикла;    
       
ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда
       Сообщить("Не выполнено");
КонецЕсли;
31 DmitriyDI
 
24.06.13
11:52
Всем спасибо)))
32 Cube
 
24.06.13
12:13
(28) У меня понедельник после отпуска - день тяжелый)))
33 del123
 
24.06.13
12:23
(30) и работает?
В частности строка
   Пока СпрНоменклатура.Следующий() = 1 Цикл
Семерка чтоли?:)
34 del123
 
24.06.13
12:25
(33) Гы, не знал что истина = 1, подозревал конечно..))
35 DmitriyDI
 
24.06.13
14:44
(34) истина так)
36 КУНГ ФУ 1С
 
24.06.13
14:47
(0) ВЫБРАТЬ РАЗЛИЧНЫЕ В ЗАПРОСЕ.
на мой взгляд более оптимально.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн