Имя: Пароль:
1C
1С v8
Сравнение двух таблиц значений
0 sovsemnovichek
 
21.10.13
15:15
Пытаюсь сравнить две таблицы.
Товар              Материалы
Полуфабрикат       Товар
Услуги
1 Wobland
 
21.10.13
15:15
начало интригующее
2 shamannk
 
21.10.13
15:16
Так держать!
3 Laerys
 
21.10.13
15:16
молодец
4 Толич
 
21.10.13
15:17
Товар повторяется.
5 sovsemnovichek
 
21.10.13
15:17
Товар              Материалы
Полуфабрикат       Товар
Услуги
Продукция

Надо чтобы правая табличка получила недостающие поля из левой
Делаю так:
Запрос.Текст = "ВЫБРАТЬ
                       |    Таблица.ВидНоменклатуры
                       |ПОМЕСТИТЬ ТабИсп
                       |ИЗ
                       |    &Таблица КАК Таблица
                       |;
                       |
                       |////////////////////////////////////////////////////////////////////////////////
                       |ВЫБРАТЬ
                       |    ЕСТЬNULL(ТабИсп.ВидНоменклатуры, ВидыНоменклатуры.Наименование) КАК Организация,
                       |    ВидыНоменклатуры.Наименование КАК Наименование
                       |ИЗ
                       |    Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры
                       |        ЛЕВОЕ СОЕДИНЕНИЕ ТабИсп КАК ТабИсп
                       |        ПО ВидыНоменклатуры.Наименование = ТабИсп.ВидНоменклатуры";
        Запрос.УстановитьПараметр("Таблица", ТАблица);              
        Выборка = Запрос.Выполнить().Выбрать();

Может из этого что-то получиться или не то совсем, подскажите пожалуйста
6 Wobland
 
21.10.13
15:18
1. объединить
2. сгруппировать
7 МойКодУныл
 
21.10.13
15:18
(6) Ты в шоу экстрасенсов не участвовал?
8 sovsemnovichek
 
21.10.13
15:19
(6)Сейчас сделаю
9 Wobland
 
21.10.13
15:19
(7) я их консультировал ;)
10 Wobland
 
21.10.13
15:20
>Пытаюсь сравнить ... Надо чтобы правая табличка получила
какое-то неправильное сравнение
11 Толич
 
21.10.13
15:28
ТЗ1
ТЗ2
Для Каждого СтрокаТЗ1 Из ТЗ1 Цикл
        СтрокаТЗ = ТЗ2.Найти(СтрокаТЗ1.Номенклатура, "Номенклатура");
    Если СтрокаТЗ = Неопределено Тогда
        НовСтрокаТЗ2 = ТЗ2.Добавить();
        ЗаполнитьЗначенияСвойств(НовСтрокаТЗ2 , СтрокаТЗ);
    КонецЕсли;
КонецЦикла;
12 sovsemnovichek
 
21.10.13
15:49
Сделал так, просто мне метод (11) как-то понятнее
    
        Запрос.Текст =  "ВЫБРАТЬ
                        |    ВидыНоменклатуры.Наименование Как НаименованиеВида
                        |ИЗ
                        |    Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры" ;
    Выборка = Запрос.Выполнить();
    
    Таблица = Выборка.Выгрузить();
    
    Для Каждого СтрокаТаблицы Из ТаблицаВидНом Цикл
        СтрокаТаблицы = Таблица.Найти(СтрокаТаблицы.ВидНоменклатуры);
        Если СтрокаТаблицы = Неопределено Тогда
            НовСтрока = ТаблицаВидНом.Добавить();
            ЗаполнитьЗначенияСвойств(НовСтрока,СтрокаТаблицы);
        КонецЕсли;
    КонецЦикла;
13 sovsemnovichek
 
21.10.13
15:49
все равно не работает =D
14 hhhh
 
21.10.13
15:53
(13) вот так пробуйте

ТаблицаВидНом = Запрос.Выполнить().Выгрузить();
15 Толич
 
21.10.13
15:54
>>СтрокаТаблицы = Таблица.Найти(СтрокаТаблицы.ВидНоменклатуры);

Надо
СтрокаТаблицы = Таблица.Найти(СтрокаТаблицы.ВидНоменклатуры,"НаименованиеВида");
16 Толич
 
21.10.13
15:56
СтрокаТаблицы Задвоил
Эз ты...
17 sovsemnovichek
 
21.10.13
15:59
сейчас сделаю)
18 sovsemnovichek
 
21.10.13
16:02
параметры неправильно задаю... Как надо?


{Форма.ФормаНастроек.Форма(24)}: Ошибка при вызове метода контекста (ЗаполнитьЗначенияСвойств)
            ЗаполнитьЗначенияСвойств(НовСтрока,СтрокаТаблицы);
по причине:
Недопустимое значение параметра (параметр номер '2')
19 Толич
 
21.10.13
16:02
Давай полный код
20 sovsemnovichek
 
21.10.13
16:06
Запрос = Новый Запрос;

    
        Запрос.Текст =  "ВЫБРАТЬ
                        |    ВидыНоменклатуры.Наименование Как НаименованиеВида
                        |ИЗ
                        |    Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры" ;
    Выборка = Запрос.Выполнить();
    
    Таблица = Выборка.Выгрузить();
    
    Для Каждого СтрокаТаблицы Из ТаблицаВидНом Цикл
        СтрокаТаблицы = Таблица.Найти(СтрокаТаблицы.ВидНоменклатуры,"НаименованиеВида");
        Если СтрокаТаблицы = Неопределено Тогда
            НовСтрока = ТаблицаВидНом.Добавить();
            ЗаполнитьЗначенияСвойств(НовСтрока,СтрокаТаблицы);
        КонецЕсли;
    КонецЦикла;
21 sovsemnovichek
 
21.10.13
16:06
он полный
22 Толич
 
21.10.13
16:10
Запрос = Новый Запрос;
        Запрос.Текст =  "ВЫБРАТЬ
                        |    ВидыНоменклатуры.Наименование Как НаименованиеВида
                        |ИЗ
                        |    Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры" ;
    Выборка = Запрос.Выполнить();
    
    Таблица = Выборка.Выгрузить();
    
    Для Каждого СтрокаТаблицы Из ТаблицаВидНом Цикл
        СтрокаТаблицы11 = Таблица.Найти(СтрокаТаблицы.ВидНоменклатуры,"НаименованиеВида");
        Если СтрокаТаблицы11 = Неопределено Тогда
            НовСтрока = ТаблицаВидНом.Добавить();
            ЗаполнитьЗначенияСвойств(НовСтрока,СтрокаТаблицы);
        КонецЕсли;
    КонецЦикла;

Я ж писал, что ты задвоил переменную.
23 Толич
 
21.10.13
16:12
Запрос = Новый Запрос;
        Запрос.Текст =  "ВЫБРАТЬ
                        |    ВидыНоменклатуры.Наименование Как НаименованиеВида
                        |ИЗ
                        |    Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры" ;
    Выборка = Запрос.Выполнить();
    
    Таблица = Выборка.Выгрузить();
    
    Для Каждого СтрокаТаблицы Из ТаблицаВидНом Цикл
        СтрокаТаблицы11 = Таблица.Найти(СтрокаТаблицы.ВидНоменклатуры,"НаименованиеВида");
        Если СтрокаТаблицы11 = Неопределено Тогда
            НовСтрока = Таблица.Добавить();
            ЗаполнитьЗначенияСвойств(НовСтрока,СтрокаТаблицы);
        КонецЕсли;
    КонецЦикла;
24 r_p
 
21.10.13
16:14
А чего бы не через ПОЛНОЕ СОЕДИНЕНИЕ сделать?
25 vde69
 
модератор
21.10.13
16:15
Функция ЕстьРазличияВТаблицах (СтарыеДанные, НовыеДанные, КолонкиСравнения)
    Результат = Ложь;
    
    мКолонки = СтрЗаменить(КолонкиСравнения, ",", Символы.ПС);
    КоличествоКолонок = СтрЧислоСтрок(мКолонки);
    
    Если     ТипЗнч(СтарыеДанные) <> Тип("ТаблицаЗначений")
        ИЛИ ТипЗнч(НовыеДанные) <> Тип("ТаблицаЗначений") Тогда

    ИначеЕсли КоличествоКолонок = 0 Тогда
    
    ИначеЕсли НовыеДанные.Количество() <> СтарыеДанные.Количество() Тогда
        Результат = Истина;
    Иначе
        ВыборНовыеДанные = "";
        ВыборСтарыеДанные = "";
        Условие = "";
        Для е = 1 по КоличествоКолонок Цикл
            ИмяКолонки = СокрЛП(СтрПолучитьСтроку(мКолонки,е));
            ВыборНовыеДанные = ВыборНовыеДанные + "
                                |    НовыеДанные." + ИмяКолонки + ",";
            ВыборСтарыеДанные = ВыборСтарыеДанные + "
                                |    СтарыеДанные." + ИмяКолонки + ",";
            Условие = Условие + "
                                |            И НовыеДанные." + ИмяКолонки + " = СтарыеДанные." + ИмяКолонки;
        КонецЦикла;    
            
        Запрос = Новый Запрос(
        "ВЫБРАТЬ " + Лев(ВыборНовыеДанные, СтрДлина(ВыборНовыеДанные)-1) + "
        |ПОМЕСТИТЬ НовыеДанные
        |ИЗ
        |    &НовыеДанные КАК НовыеДанные
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ " + Лев(ВыборСтарыеДанные, СтрДлина(ВыборСтарыеДанные)-1) + "
        |ПОМЕСТИТЬ СтарыеДанные
        |ИЗ
        |    &СтарыеДанные КАК СтарыеДанные
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    1 Как Поле1
        |ИЗ
        |    НовыеДанные КАК НовыеДанные
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ СтарыеДанные КАК СтарыеДанные
        |        ПО Истина " + Условие + "
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |УНИЧТОЖИТЬ НовыеДанные
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |УНИЧТОЖИТЬ СтарыеДанные");
        
        Запрос.УстановитьПараметр("НовыеДанные", НовыеДанные);
        Запрос.УстановитьПараметр("СтарыеДанные", СтарыеДанные);
        мТЗ = Запрос.Выполнить().Выгрузить();
        
        Если мТЗ.Количество() <> СтарыеДанные.Количество() Тогда
            Результат = Истина;
        КонецЕсли;
    КонецЕсли;
    
    Возврат Результат;
КонецФункции
26 sovsemnovichek
 
21.10.13
16:18
эээ... Он зациклился(
27 hhhh
 
21.10.13
16:20
(23)(25) логику-то включайте. Вот же

ТаблицаВидНом = Таблица;

или

ТаблицаВидНом = Таблица.Скопировать();


в Таблица вообще все виды номенклатуры находятся.
28 sovsemnovichek
 
21.10.13
16:22
(27) я так пробовал, он не дает новые значения вводить... Ты их как бы вводишь, но они не отображаются, а при дальнейших действиях вообще остаются пустыми
29 sovsemnovichek
 
22.10.13
11:06
Блин, ребят, запутался уже... Подскажите чуток

    Таблица = ТаблицаВидНом;
    
    Запрос = Новый Запрос;
       Запрос.Текст =
    "ВЫБРАТЬ
    |    Таблица.ВидНоменклатуры
    |ПОМЕСТИТЬ ТаблицаНаФорме
    |ИЗ
    |    &Таблица КАК Таблица
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВидыНоменклатуры.Наименование КАК Наименование,
    |    ТаблицаНаФорме.ВидНоменклатуры КАК ВидНоменклатуры
    |ИЗ
    |    Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры
    |        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаНаФорме КАК ТаблицаНаФорме
    |        ПО ВидыНоменклатуры.Наименование = ТаблицаНаФорме.ВидНоменклатуры
    |ГДЕ ТаблицаНаФорме.ВидНоменклатуры ЕСТЬ NULL
    |СГРУППИРОВАТЬ ПО
    |    ВидыНоменклатуры.Наименование,
    |    ТаблицаНаФорме.ВидНоменклатуры";
    Запрос.УстановитьПараметр("Таблица",Таблица);
    
    РезультатЗапроса = Запрос.Выполнить().Выбрать();
    Пока РезультатЗапроса.Следующий()Цикл
        Сообщить(РезультатЗапроса.ВидНоменклатуры);
    КонецЦикла;

РезультатЗапроса.ВидНоменклатуры всегда равен NULL, как его выбрать правильно? Чтобы он попадал в РезультатЗапроса ?
30 sovsemnovichek
 
22.10.13
11:11
Очень нужна помощь( не хочется надоедать, но все же
31 vhl
 
22.10.13
11:13
Зачем ты вообще привязываешься к наименованию? По ссылкам связывай
32 sovsemnovichek
 
22.10.13
11:14
Таблица = ТаблицаВидНом; Где уж тут ссылку возьмешь, это таблица, которая висит на форме
33 vhl
 
22.10.13
11:58
(32) В чем проблема в таблице на форме использовать ссылки?
34 sovsemnovichek
 
22.10.13
12:06
подскажите как... опыта нет(
35 1dvd
 
22.10.13
12:08
(34) Это что?

ГДЕ ТаблицаНаФорме.ВидНоменклатуры ЕСТЬ NULL
36 sovsemnovichek
 
22.10.13
17:38
Задача состояла в том, чтобы взять на форме ТЗ и дополнить её недостающими значениям. Я взял ее, засунул в запрос, дополнил, только вот теперь не могу додуматься как вернуть ее обратно на форму целехонькую.

Вот мой запрос:

    Таблица = ТаблицаВидНом;
    
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос.Текст =  "ВЫБРАТЬ
                    |    Таблица.ВидНоменклатуры,
                    |   Таблица.Коэффициент1
                    |ПОМЕСТИТЬ ТаблицаНаФорме
                    |ИЗ
                    |    &Таблица КАК Таблица
                    |;
                    |
                    |////////////////////////////////////////////////////////////////////////////////
                    |ВЫБРАТЬ
                    |    ЕСТЬNULL(ТаблицаНаФорме.ВидНоменклатуры, ВложенныйЗапрос.Ссылка) КАК ВидНоменклатуры,
                    |    ВложенныйЗапрос.Ссылка КАК ВидНом
                    |ИЗ
                    |    (ВЫБРАТЬ
                    |        ВидыНоменклатуры.Ссылка КАК Ссылка
                    |    ИЗ
                    |        Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры) КАК ВложенныйЗапрос
                    |        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаНаФорме КАК ТаблицаНаФорме
                    |        ПО ВложенныйЗапрос.Ссылка = ТаблицаНаФорме.ВидНоменклатуры";
    Запрос.УстановитьПараметр("Таблица",Таблица);    
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
37 GANR
 
22.10.13
17:49
(0) Интересно, а что если попробовать вот так:

Если ЗначениеВСтрокуВнутр(ТЗ_1) = ЗначениеВСтрокуВнутр(ТЗ_2) Тогда
    Сообщить("ТЗ одинаковые");
Иначе
    Сообщить("ТЗ разные");
КонецЕсли;
38 sovsemnovichek
 
22.10.13
17:50
(37) А количество строк в таблицах имеет здесь значение?
39 GANR
 
22.10.13
17:55
(0) А если не выходить из рамок запроса - то это см. выше.
(38) Если количество строк / колонок в ТЗ разнятся, то и функция ЗначениеВСтрокуВнутр должна вернуть разное значение. А вообще проще взять и посмотреть через отладчик - отличаются они, или нет.
40 kiruha
 
22.10.13
18:13
(5)
Пару раз получал деньги за исправление подобного кода.
Как что так все пихают в запрос.
Пиши исчо !
41 GANR
 
22.10.13
18:14
(38) Экспериметальным путем установил, что при таком сравнении играет роль еще и порядок строк в ТЗ, то есть если порядок не одинаковый, то даже если данные одинаковые - все равно они не будут равны. http://files.mail.ru/831B962D927241BF805A5EFDEF556651

То есть, если уж так сравнивать, то надо предварительно упорядочить ТЗ по ВСЕМ колонкам.

Но вообще это ЗначениеИзСтрокиВнутр(ТЗ_1) плохой код - лучше в запросе все сразу сравнить.
42 GANR
 
22.10.13
18:16
+(41) >все равно они будут равны
все равно они будут РАЗЛИЧНЫ - ошибся.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.