Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
08 мая 2024, 16:49

Удаление строк в таблице по условиям

Автор llirik_87, 24 июн 2014, 12:27

0 Пользователей и 1 гость просматривают эту тему.

llirik_87

Здравствуйте!
Ситуация такая:
У меня 1С 8.1. Есть таблица ТАБ1, являющаяся результатом выборки:

Наименование    Артикул    Оригинал
Стол                     А1            А111
Стол                     А1            Нет
Стол                     А1            Нет
Кровать                К5            К321
Полка                   П4            Нет


Мне нужно из нее поудалять стоки по условиям:
1) если в строке в колонке Оригинал НЕ стоит "Нет" , то удалить эту строку
2) если в есть строки в которых одиноковы значения в колонках Наименование и Артикул и хотябы в одной из них в колонке Оригинал НЕ стоит "Нет" , то удалить все эти строи

Т.е. в итоге нужно чтоб получилась таблица:

Наименование    Артикул     Оригинал
Полка                    П4            Нет

Как это можно сделать?

GRADUS

Столько способов и ты пишешь этот вопрос сюда.

Ну создай новую ТЗ и занеси туда все данные или отбор сделать в данной ТЗ

llirik_87

Буду благодарен, если напишете код отбора
Цитата: GRADUS от 24 июн 2014, 12:33
Столько способов и ты пишешь этот вопрос сюда.

Ну создай новую ТЗ и занеси туда все данные или отбор сделать в данной ТЗ

LexaK

Цитата: llirik_87 от 24 июн 2014, 12:27
Здравствуйте!
Ситуация такая:
У меня 1С 8.1. Есть таблица ТАБ1, являющаяся результатом выборки:

Самое правильное, в вашем случае, подправить ЗАПРОС (если выборка является результатом запроса) или написать правильный запрос к базе, в результате получите таблицу которую не надо править.
если помогло нажмите: Спасибо!

Snaky

Цитата: llirik_87 от 24 июн 2014, 12:27
Здравствуйте!
Ситуация такая:
У меня 1С 8.1. Есть таблица ТАБ1, являющаяся результатом выборки:

Наименование    Артикул    Оригинал
Стол                     А1            А111
Стол                     А1            Нет
Стол                     А1            Нет
Кровать                К5            К321
Полка                   П4            Нет


Мне нужно из нее поудалять стоки по условиям:
1) если в строке в колонке Оригинал НЕ стоит "Нет" , то удалить эту строку
2) если в есть строки в которых одиноковы значения в колонках Наименование и Артикул и хотябы в одной из них в колонке Оригинал НЕ стоит "Нет" , то удалить все эти строи

Т.е. в итоге нужно чтоб получилась таблица:

Наименование    Артикул     Оригинал
Полка                    П4            Нет

Как это можно сделать?
МассивУдалаемых = Новый Массив;
Для Каждого Строка Из Таблица Цикл
    Если Не Строка.Оригинал = "Нет" ИЛИ Строка.Артикул = Строка.Наименование Тогда
        МассивУдаляемых.Добавить(Строка); 
    КонецЕсли;
КонецЦикла;
Для Каждого Элемент Из МассивУдаляемых Цикл
    Таб.Удалить(Элемент);
КонецЦикла;

llirik_87

Я так понимаю если написать Строка.Артикул = Строка.Наименование  то удалятся строки в которых  поле Артикул равно полю Наименование.   А  мне нужно чтоб сравнивалось значение поля Артикул по всем строкам и поля Наименование по всем строкам. Т.е. если смотреть на приведенную мной таблицу нужно чтоб удалились 1-я, 2-я, 3-я строки т.к. в них в поле Наименование у всех стоит Стол, в поле Артикул в всех А1,  а хотя бы у одного из них  поле Оригинал  не равно "НЕТ"
Цитата: Snaky от 24 июн 2014, 13:10
Цитата: llirik_87 от 24 июн 2014, 12:27

МассивУдалаемых = Новый Массив;
Для Каждого Строка Из Таблица Цикл
    Если Не Строка.Оригинал = "Нет" ИЛИ Строка.Артикул = Строка.Наименование Тогда
        МассивУдаляемых.Добавить(Строка); 
    КонецЕсли;
КонецЦикла;
Для Каждого Элемент Из МассивУдаляемых Цикл
    Таб.Удалить(Элемент);
КонецЦикла;

Snaky

Цитата: llirik_87 от 24 июн 2014, 13:28
Я так понимаю если написать Строка.Артикул = Строка.Наименование  то удалятся строки в которых  поле Артикул равно полю Наименование.   А  мне нужно чтоб сравнивалось значение поля Артикул по всем строкам и поля Наименование по всем строкам. Т.е. если смотреть на приведенную мной таблицу нужно чтоб удалились 1-я, 2-я, 3-я строки т.к. в них в поле Наименование у всех стоит Стол, в поле Артикул в всех А1,  а хотя бы у одного из них  поле Оригинал  не равно "НЕТ"
Цитата: Snaky от 24 июн 2014, 13:10
Цитата: llirik_87 от 24 июн 2014, 12:27

МассивУдалаемых = Новый Массив;
Для Каждого Строка Из Таблица Цикл
    Если Не Строка.Оригинал = "Нет" ИЛИ Строка.Артикул = Строка.Наименование Тогда
        МассивУдаляемых.Добавить(Строка); 
    КонецЕсли;
КонецЦикла;
Для Каждого Элемент Из МассивУдаляемых Цикл
    Таб.Удалить(Элемент);
КонецЦикла;
А вот сейчас я не понял задачу, нужно что бы удалились все строки где "Оригинал" не равно "Нет", а так же строки у которых наименование == артикул??? поясните задачу подробнее на примере

llirik_87

Пример:
Исходная таблица
Наименование    Артикул    Оригинал
Стол                     А1            А111
Стол                     А1            Нет
Стол                     А1            Нет
Кровать                К5            К321
Полка                   П4            Нет

1)Ищем и удаляем строки в которых Наименования и Артикулы равны, а так же в поле Оригинал хотя бы раз в не стоит "Нет". Данному условию удовлетворяют первые три строки. У первых трех строк Наименования одинаковы (Стол) и Артикулы одинаковы (А1), а поле Оригинал в первой строке не стоит "Нет". Значит удаляем их.
2) Ищем строки в которых поле Оригинал не стоит "Нет" и нет больше строк с таким же Артикулом и Наименованием и удаляем. Этому условию соответствует 4-я строка. 
Получаем таблицу:
Наименование    Артикул     Оригинал
Полка                    П4            Нет

Цитата: Snaky от 24 июн 2014, 13:36
Цитата: llirik_87 от 24 июн 2014, 13:28
А вот сейчас я не понял задачу, нужно что бы удалились все строки где "Оригинал" не равно "Нет", а так же строки у которых наименование == артикул??? поясните задачу подробнее на примере

cska-fanat-kz


Соответствие1 = Новый Соответствие;

Для каждого СтрокаТЧ Из ТЧ Цикл
Если СтрокаТЧ.Оригинал <> "НЕТ" Тогда
Соответствие1.Вставить(СтрокаТЧ.Наименование, СтрокаТЧ.Артикул);
КонецЕсли;
КонецЦикла;

Для каждого ЭлСоответствия Из Соответствие1 Цикл
СтруктураПоиска = Новый Структура("Наименование, Артикул", ЭлСоответствия.Ключ, ЭлСоответствия.Значение);
НайденныеСтроки = ТЧ.НайтиСтроки(СтруктураПоиска);
Для каждого СтрокаТЧ Из НайденныеСтроки Цикл
ТЧ.Удалить(СтрокаТЧ);
КонецЦикла;
КонецЦикла;
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

llirik_87

Что-то у меня так вообще ничего не оставляет, может я что-то не так сделал? вот код мой
   Запрос = Новый Запрос;           
Запрос.Текст =   "ВЫБРАТЬ
                 |   мебель.Наименование как Наименование,
                 |   мебель.Артикул как Артикул,
                 |   мебель.Оригинал как Оригинал
                 |ИЗ
                 |   Справочник.мебель КАК мебель";
Результат=Запрос.Выполнить();
ТабличнаяЧасть1.Загрузить(Результат.Выгрузить());

Соответствие1 = Новый Соответствие;

Для каждого СтрокаТЧ Из ТабличнаяЧасть1 Цикл
   Если СтрокаТЧ.Оригинал <> "НЕТ" Тогда
      Соответствие1.Вставить(СтрокаТЧ.Наименование, СтрокаТЧ.Артикул);
   КонецЕсли;
КонецЦикла;

Для каждого ЭлСоответствия Из Соответствие1 Цикл
   СтруктураПоиска = Новый Структура("Наименование, Артикул", ЭлСоответствия.Ключ, ЭлСоответствия.Значение);
   НайденныеСтроки = ТабличнаяЧасть1.НайтиСтроки(СтруктураПоиска);
   Для каждого СтрокаТЧ Из НайденныеСтроки Цикл
      ТабличнаяЧасть1.Удалить(СтрокаТЧ);
   КонецЦикла;
КонецЦикла;

Цитата: cska-fanat-kz от 24 июн 2014, 15:04

Соответствие1 = Новый Соответствие;

Для каждого СтрокаТЧ Из ТЧ Цикл
Если СтрокаТЧ.Оригинал <> "НЕТ" Тогда
Соответствие1.Вставить(СтрокаТЧ.Наименование, СтрокаТЧ.Артикул);
КонецЕсли;
КонецЦикла;

Для каждого ЭлСоответствия Из Соответствие1 Цикл
СтруктураПоиска = Новый Структура("Наименование, Артикул", ЭлСоответствия.Ключ, ЭлСоответствия.Значение);
НайденныеСтроки = ТЧ.НайтиСтроки(СтруктураПоиска);
Для каждого СтрокаТЧ Из НайденныеСтроки Цикл
ТЧ.Удалить(СтрокаТЧ);
КонецЦикла;
КонецЦикла;


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск