Имя: Пароль:
1C
1С v8
Сравнение двух массивов
,
0 Doroheart
 
12.03.20
11:50
Добрый день, как сравнить 2 массива? К примеру есть массив 1 и массив 2, в массиве 2 большое количество номенклатуры которой может не быть в массиве 1, но при этом нужно при сравнении чтобы в таблице для массива 1 ставилась галочка выбран если вдруг позиции совпадают.
1 pechkin
 
12.03.20
11:53
ОбщегоНазначения.СравнитьМассивы()
2 Asmody
 
12.03.20
11:55
[в таблице для массива] - у массивов нет таблиц
3 pechkin
 
12.03.20
11:56
как я понял задача такая: для таблицы проставить галочки напротив тех номенклатур, что есть в массиве 2
4 Garykom
 
гуру
12.03.20
11:58
В 77 у СЗ были "галочки"
5 Doroheart
 
12.03.20
11:58
(3) да, есть номенклатура которая выпадает в таблицу и ее надо сравнить с регистром скидок номенклатуры. Т.е. Если скидка есть, то выбран истина. (2) Таблица есть, но данные из нее я планировал грузануть в массив чтобы сверить с регистром.
6 Garykom
 
гуру
12.03.20
12:02
А потом удивляются почему боинги 777 макс падают...
7 Garykom
 
гуру
12.03.20
12:04
(6) *737 MAX
8 PR
 
12.03.20
12:04
Сделать ТЗ с колонками "Номенклатура" и "Количество"
Весь массив 1 добавить с -1 в количестве
Весь массив 2 добавить с 1 в количестве
Свернуть ТЗ по номенклатуре и сумме по количеству
Там, где остаток -1 - есть только в первом массиве, 0 - в обоих, 1 - только во втором

Но есть более простые способы, конечно же
Например, пробежаться по массиву 1 и если позиция найдена в массиве 2, то ставить галочку
9 VladZ
 
12.03.20
12:07
(0) Через запрос. Первая часть запроса - условие по вхождению в массив1. Вторая часть - по вхождению в массив2.

Я бы начал с другого: откуда взялись эти массивы? Что послужило источником? Возможно, стоит "сдвинуть" алгоритм проверки в тот кусок кода, в котором эти массивы "образовались".
10 Жан Пердежон
 
12.03.20
12:09
(1) в массиве таблиц очень даже есть
11 singlych
 
12.03.20
12:23
(1) не та функция

ОбщегоНазначенияКлиентСервер.РазностьМассивов(Массив, МассивВычитания)

// Вычисляет разность массивов. Разность
ю массивов А и В является массив, содержащий
// все элементы массива А, не существующие в массиве В.
//
// Параметры:
//  Массив - Массив - массив элементов, из которого необходимо выполнить вычитание;
//  МассивВычитания - Массив - массив элементов, который будет вычитаться.
//
// Возвращаемое значение:
//  Массив - дополнение массива В до А.
//
// Пример:
//    //А = [1, 3, 5, 7];
//    //В = [3, 7, 9];
//    Результат = РазностьМассивов(А, В);
//    //Результат = [1, 5];
//
12 pechkin
 
12.03.20
12:27
лечше конечно прям в запросе делать левое соединение
13 Doroheart
 
12.03.20
13:43
(9) Первый образно говоря массив появился так, второй это просто регистр в котором находятся скидки на позиции номенклатуры

Процедура КоманднаяПанельНоменклатурСписокИзмененийЦен(Кнопка)
    
    ФормаВыбораПодразделения=Справочники.ПодразделенияКомпании.ПолучитьФормуВыбора();
    ФормаВыбораПодразделения.МножественныйВыбор=Ложь;
    ФормаВыбораПодразделения.РежимВыбора=Истина;
    ФормаВыбораПодразделения.ЗакрыватьПриВыборе=Истина;
    Подразделение=ФормаВыбораПодразделения.ОткрытьМодально();
    Если Подразделение=Неопределено ИЛИ Подразделение = Справочники.ПодразделенияКомпании.ПустаяСсылка() Тогда
        Подразделение = ПараметрыСеанса.ПодразделениеКомпании;
        ТипЦен = Подразделение.ТипЦенРеализации;
        Товары.Очистить();
        Возврат;
    КонецЕсли;
    Если ТипЦен<>Подразделение.ТипЦенРеализации Тогда
        ТипЦен = Подразделение.ТипЦенРеализации;
    КонецЕсли;
    Организация = Подразделение.Организация;
    Товары.Очистить();
    ЭтаФорма.Заголовок = "Печать этикеток и ценников. Текущее подразделение скидок "+Подразделение;
    
    
    
        Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
                   |    ИСТИНА КАК Выбран,
                   |    ЦеныСрезПоследних.Номенклатура КАК Номенклатура,
                   |    ЦеныСрезПоследних.Номенклатура.ОсновнаяЕдиницаИзмерения КАК ЕдиницаИзмерения,
                   |    ЦеныСрезПоследних.Номенклатура.ОсновнаяЕдиницаИзмерения.Коэффициент КАК Коэффициент,
                   |    1 КАК Количество,
                   |    0 КАК Поле1,
                   |    0 КАК Поле2,
                   |    0 КАК Поле3,
                   |    0 КАК Поле4,
                   |    ЦеныСрезПоследних.Цена КАК Цена,
                   |    ЕСТЬNULL(ЗначенияСвойствТоварныхКатегорий.Значение, ЛОЖЬ) КАК БЗМЖ
                   |ПОМЕСТИТЬ ВТ_Товары
                   |ИЗ
                   |    РегистрСведений.Цены.СрезПоследних(
                   |            &КонецПериода,
                   |            ТипЦен.Продажа
                   |                И ТипЦен = &ТипЦен) КАК ЦеныСрезПоследних
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствТоварныхКатегорий КАК ЗначенияСвойствТоварныхКатегорий
                   |        ПО ЦеныСрезПоследних.Номенклатура = ЗначенияСвойствТоварныхКатегорий.Номенклатура
                   |            И (ЗначенияСвойствТоварныхКатегорий.Свойство = &Свойство)
                   |            И (ЗначенияСвойствТоварныхКатегорий.Значение = ИСТИНА)
                   |ГДЕ
                   |    ЦеныСрезПоследних.Цена <> ЦеныСрезПоследних.ЦенаСтарая
                   |    И ЦеныСрезПоследних.Период МЕЖДУ &НачалоПериода И &КонецПериода
                   |
                   |ОБЪЕДИНИТЬ
                   |
                   |ВЫБРАТЬ РАЗЛИЧНЫЕ
                   |    ВложенныйЗапрос.Выбран,
                   |    ВложенныйЗапрос.Номенклатура,
                   |    ВложенныйЗапрос.ЕдиницаИзмерения,
                   |    ВложенныйЗапрос.Коэффициент,
                   |    ВложенныйЗапрос.Количество,
                   |    0,
                   |    0,
                   |    0,
                   |    0,
                   |    ЦеныСрезПоследних.Цена,
                   |    ЕСТЬNULL(ЗначенияСвойствТоварныхКатегорий.Значение, ЛОЖЬ)
                   |ИЗ
                   |    (ВЫБРАТЬ
                   |        ИСТИНА КАК Выбран,
                   |        Скидки.Объект КАК Номенклатура,
                   |        Скидки.Объект.ОсновнаяЕдиницаИзмерения КАК ЕдиницаИзмерения,
                   |        Скидки.Объект.ОсновнаяЕдиницаИзмерения.Коэффициент КАК Коэффициент,
                   |        1 КАК Количество
                   |    ИЗ
                   |        РегистрСведений.Скидки КАК Скидки
                   |    ГДЕ
                   |        Скидки.Период МЕЖДУ &НачалоПериодаСкидки И &КонецПериода
                   |        И НЕ Скидки.Действует
                   |        И Скидки.Подразделение = &Подразделение
                   |    
                   |    ОБЪЕДИНИТЬ ВСЕ
                   |    
                   |    ВЫБРАТЬ
                   |        ИСТИНА,
                   |        Скидки.Объект,
                   |        Скидки.Объект.ОсновнаяЕдиницаИзмерения,
                   |        Скидки.Объект.ОсновнаяЕдиницаИзмерения.Коэффициент,
                   |        1
                   |    ИЗ
                   |        РегистрСведений.Скидки КАК Скидки
                   |    ГДЕ
                   |        Скидки.Действует
                   |        И Скидки.КонецДействия МЕЖДУ &НачалоПериодаСкидки И &КонецПериода
                   |        И Скидки.Подразделение = &Подразделение) КАК ВложенныйЗапрос
                   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних(&КонецПериода, ТипЦен = &ТипЦен) КАК ЦеныСрезПоследних
                   |        ПО ВложенныйЗапрос.Номенклатура = ЦеныСрезПоследних.Номенклатура
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствТоварныхКатегорий КАК ЗначенияСвойствТоварныхКатегорий
                   |        ПО ВложенныйЗапрос.Номенклатура = ЗначенияСвойствТоварныхКатегорий.Номенклатура
                   |            И (ЗначенияСвойствТоварныхКатегорий.Свойство = &Свойство)
                   |            И (ЗначенияСвойствТоварныхКатегорий.Значение = ИСТИНА)
                   |
                   |ОБЪЕДИНИТЬ
                   |
                   |ВЫБРАТЬ РАЗЛИЧНЫЕ
                   |    ИСТИНА,
                   |    ОстаткиТоваровКомпанииОстаткиИОбороты.Номенклатура,
                   |    ОстаткиТоваровКомпанииОстаткиИОбороты.Номенклатура.ОсновнаяЕдиницаИзмерения,
                   |    ОстаткиТоваровКомпанииОстаткиИОбороты.Номенклатура.ОсновнаяЕдиницаИзмерения.Коэффициент,
                   |    1,
                   |    ВЫБОР
                   |        КОГДА ОстаткиТоваровКомпанииОстаткиИОбороты.КоличествоНачальныйОстаток <> 0
                   |            ТОГДА 0
                   |        ИНАЧЕ 0
                   |    КОНЕЦ,
                   |    ВЫБОР
                   |        КОГДА ОстаткиТоваровКомпанииОстаткиИОбороты.КоличествоПриход <> 0
                   |            ТОГДА 0
                   |        ИНАЧЕ 0
                   |    КОНЕЦ,
                   |    ВЫБОР
                   |        КОГДА ОстаткиТоваровКомпанииОстаткиИОбороты.КоличествоРасход <> 0
                   |            ТОГДА 0
                   |        ИНАЧЕ 0
                   |    КОНЕЦ,
                   |    ВЫБОР
                   |        КОГДА ОстаткиТоваровКомпанииОстаткиИОбороты.КоличествоКонечныйОстаток <> 0
                   |            ТОГДА 0
                   |        ИНАЧЕ 0
                   |    КОНЕЦ,
                   |    ЦеныСрезПоследних.Цена,
                   |    ЕСТЬNULL(ЗначенияСвойствТоварныхКатегорий.Значение, ЛОЖЬ)
                   |ИЗ
                   |    РегистрНакопления.ОстаткиТоваровКомпании.ОстаткиИОбороты(
                   |            &НачалоПериода,
                   |            &КонецПериода,
                   |            ,
                   |            ,
                   |            СкладКомпании.Розничный
                   |                И (Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар)
                   |                    ИЛИ Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Комплект))
                   |                И СкладКомпании.Подразделение = &Подразделение) КАК ОстаткиТоваровКомпанииОстаткиИОбороты
                   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних(&КонецПериода, ТипЦен = &ТипЦен) КАК ЦеныСрезПоследних
                   |        ПО ОстаткиТоваровКомпанииОстаткиИОбороты.Номенклатура = ЦеныСрезПоследних.Номенклатура
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствТоварныхКатегорий КАК ЗначенияСвойствТоварныхКатегорий
                   |        ПО ОстаткиТоваровКомпанииОстаткиИОбороты.Номенклатура = ЗначенияСвойствТоварныхКатегорий.Номенклатура
                   |            И (ЗначенияСвойствТоварныхКатегорий.Свойство = &Свойство)
                   |            И (ЗначенияСвойствТоварныхКатегорий.Значение = ИСТИНА)
                   |ГДЕ
                   |    ОстаткиТоваровКомпанииОстаткиИОбороты.КоличествоНачальныйОстаток = 0
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    ВЫБОР
                   |        КОГДА ЕСТЬNULL(ОстаткиТоваровКомпанииОстатки.КоличествоОстаток, 0) > 0
                   |            ТОГДА ИСТИНА
                   |        ИНАЧЕ ЛОЖЬ
                   |    КОНЕЦ КАК Выбран,
                   |    ВТ_Товары.Номенклатура,
                   |    ВТ_Товары.ЕдиницаИзмерения,
                   |    ВТ_Товары.Коэффициент,
                   |    ВТ_Товары.Количество,
                   |    ВТ_Товары.Цена,
                   |    ВТ_Товары.БЗМЖ
                   |ИЗ
                   |    ВТ_Товары КАК ВТ_Товары
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваровКомпании.Остатки(
                   |                &КонецПериода,
                   |                СкладКомпании.Подразделение = &Подразделение
                   |                    И СкладКомпании.Розничный
                   |                    И (Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар)
                   |                        ИЛИ Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Комплект))) КАК ОстаткиТоваровКомпанииОстатки
                   |        ПО ВТ_Товары.Номенклатура = ОстаткиТоваровКомпанииОстатки.Номенклатура
                   |
                   |УПОРЯДОЧИТЬ ПО
                   |    ВТ_Товары.Номенклатура
                   |АВТОУПОРЯДОЧИВАНИЕ
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |УНИЧТОЖИТЬ ВТ_Товары";

    
    Если ДеньНедели(ТекущаяДата())=1 Тогда
        НачалоПериода = НачалоДня(ТекущаяДата())-2*86400;
        НачалоПериодаСкидки = НачалоДня(ТекущаяДата())-2*86400-1;
    Иначе
        НачалоПериода = НачалоДня(ТекущаяДата());
        НачалоПериодаСкидки = НачалоДня(ТекущаяДата())-1;
    КонецЕсли;
    Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);     //Дата
    Запрос.УстановитьПараметр("НачалоПериодаСкидки", НачалоПериодаСкидки);     //Дата
    Запрос.УстановитьПараметр("КонецПериода", ТекущаяДата());     //Дата
    Запрос.УстановитьПараметр("Подразделение", Подразделение);     //Подразделения компании
    Запрос.УстановитьПараметр("ТипЦен", ТипЦен);     //Типы цен
    Запрос.УстановитьПараметр("Свойство",ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Продукт без заменителя молочного жира"));
    РезультатЗапроса = Запрос.Выполнить();
    Выборка=Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        Если НЕ Выборка.Выбран Тогда
            Продолжить;
        КонецЕсли;
        ОбработкаПрерыванияПользователя();
        НоваяСтрока = Товары.Добавить();
        НоваяСтрока.Номенклатура=Выборка.Номенклатура;
        НоваяСтрока.ЕдиницаИзмерения=Выборка.ЕдиницаИзмерения;
        НоваяСтрока.Количество=Выборка.Количество;
        НоваяСтрока.Вес=1;
        НоваяСтрока.Коэффициент=Выборка.Коэффициент;
        // проверим наличие спеццены
        Результат = ЗапросСкидок(Выборка.Номенклатура, Справочники.ТипыСкидок.СпециальнаяЦена);
        Если Результат.Количество()=0 Тогда
            Результат = ЗапросСкидок(Выборка.Номенклатура, Справочники.ТипыСкидок.СкидкаНаТовар);    
        КонецЕсли;
        Если Результат.Следующий() Тогда
            НоваяСтрока.Цена = Результат.ЗначениеСкидки;
        Иначе
            НоваяСтрока.Цена = Выборка.Цена;
        КонецЕсли;
        НоваяСтрока.Выбран = Выборка.Выбран;
        Если Выборка.БЗМЖ Тогда
            НоваяСтрока.БЗМЖ = Истина
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
14 Garykom
 
гуру
12.03.20
13:54
(13) А потом удивляемся чего оно так тормозит
15 Doroheart
 
12.03.20
14:31
(14) И не говори)))