Как сравнить два массива 1с
Здравствуйте! у меня такая ситуация. Есть определенный набор данных в массиве, и есть определенные значения, которые получились в результате запроса. Мне надо найти общие, подскажите как мне это реализовать?
Выборка2.Сотрудник это массив где есть все данные и мне нужна проверить элементы выборки1 в выборке 2 а я не знаю как это сделать. подскажите пожалуйста.
(11)Тогда как я писал выше, используйте внутреннее соединение:
Никакие массивы не нужны, как и пакетный запрос.
обе таблицы во временные, если большие то индекс по полю соединения
Из ВтТабл1 КАК ВтТабл1
внутреннее соединение ВтТабл2 КАК ВтТабл2
По .
Если в результате нужны только общие то передавай свой массив в качестве параметра в запрос. И получишь результат только по тем записям что есть в массиве и в результате запроса.
(3) а не подскажете как передать массив в параметр запроса? просто я могу задать их в конструкторе запросов а как задать массив как параметр не догоняю
(7)Передать запросто, Запрос.УстановитьПараметр("МойПараметр", Массив).
Только ведь у вас массив и так в запросе получается? Тогда вам это не нужно делать.
(9) вот я и решил сделать запрос который находит всех сотрудников в документе начисление зп и всех сотрудников в новом документе и выбрает сотрудников которые в новом документе из тех что есть в документе начисление зп
(11)Тогда как я писал выше, используйте внутреннее соединение:
Никакие массивы не нужны, как и пакетный запрос.
(13) блин а ведь точно тогда он выберет тех которые используется в обоих документах. спасибо большое.
Соответственно меняешь в тексте Таблица 1 и Таблица 2 на свои значения.
Всё можно сделать в самом запросе, просто в первом запросе вашего пакета меняете левое соединение на внутренее. Но если запрос менять неудобно, то можно загнать выборку 2 тоже в массив и сравнить два массива:
(5) попробовал но в консоли запросов результат один и тот же хотя он видимо и не должен меняться видимо)
(6)А что вы вообще хотите получить? Зачем всё это с пакетными запросами, массивами и т.п? Как у вас задача поставлена?
(8) Задача там непростая долго объяснять но сейчас именно у меня есть сотрудники которым начислена зп, и есть сотрудники с определенными показателями (это отдельно созданный документ, проведен по отдельному регистру) так вот мне нужно выбрать этих сотрудников с определенными показателями из списка всех сотрудников.
(10)Всех или указанных в определенном документе? Вы же передаете в запрос параметр - ссылку на документ начисление зарплаты.
ПО (НачислениеЗарплатыНачисления.Сотрудник .Ссылка = РаботаСотрудниковНаОбъектеДанные.Сотрудник .Ссылка )
У вас разве сотрудник это не ссылка сама по себе?
(16)Да, это ухудшает производительность запроса. Старайтесь не писать .ссылка от полей, которые и так ссылки.
(18)Смысл то верный, но есть парочка НО:
1) если со временем база будет расти, такие запросы начнут сильно влиять на скорость работы. А если это в какой-то транзакции, например в процедуре проведения, то пойдут избыточные блокировки, ошибки отказы в проведении документов по причине превышения времени на блокировке. Т.е. это будет у пользователей выглядеть как ошибки проведения в документах. Такие явления носят лавинообразный характер как правило, т.к. об одну зависшую транзакцию начинают "спотыкаться" остальные. Начальство такие вещи будут нервировать.
2) если вам придется трудоустраиваться или сдавать экзамен на специалиста по платформе, то с такими запросами вас запросто могут завернуть:)
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1С 7.x : Как получить курсы валют с сайта НБУ http://www.bank.gov.ua/ за любую дату ? 6
Функция ПолучитьТаблицуКурсовНБУ(ДатаКурса, Ежедневно = 1) // если в качестве второго параметра указать число отличное от 1 - получем валюты, которые котируются на ежемесячной основе Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯче COM-подключение к базе 7.7 из 8.2 1С 6
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=" D: ВашаБаза 1с77 " ; Пользователь= Cодержимое указанного ниже веб-сайта в этом приложении блокируется. Aboutsecurity_1cv8c.exe 1
Проблема: После обновления на 1С:Бухгалтерию предприятия 3-й версии, при нажатии на закладку командного интерфейса 1С:предприятие, выскакивает ошибка: Aboutsecurity_1cv8c.exe или Aboutsecurity_1cv8.exe «Содержимое указанного ниже веб-узла в э Посмотреть все результаты поиска похожих
Еще в этой же категории
Сравнение двух структур 7
// Сравнение 2-х стурктур // Возвращает структуру с полями которые отличаются и значением из сравниваемой // Если в стСравнимое нет нужного поля,то в результат добавляется поля = Неопределенно // стОсновная, стСравнимое - сравниваемые структуры Массив ~ Как удалить повторяющиеся элементы массива? 6
Функция УдалитьПовторяющиесяЭлементыМассива(Массив) Экспорт ТекущийИндекс = 0; ВсегоЭлементов = Массив.Количество(); Пока ТекущийИндекс ВсегоЭлементов Цикл Индекс2 = ТекущийИндекс + 1; Пока Индекс2 ВсегоЭлементов Цикл Если Массив = Структура ~ Преобразовании Структуры в Таблицу Значений 4
//Струтура в ТЗ Функция СтруктураВТЗ(Структр) ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить(" Значение" ); ТЗ.Колонки.Добавить(" Описание" ); Для Каждого ТекЭлем из Структр Цикл НовСтр=ТЗ.Добавить(); НовСтр.Значение = ТекЭлем.Ключ; НовСтр Структура ~ Создать структуру и добавить элементы 3
// Создание структуры СозданнаяСтруктура = Новый Структура; // Создание структуры и добавление элементов СтруктураОтбора = Новый Структура; СтруктураОтбора.Вставить(" Качество" , Качество); СтруктураОтбора.Вставить(" Номенклатура" , Номенкла Массив ~ Как Свернуть Массив? 2
НовыйМассив = Новый Массив; Соответствие = Новый Соответствие; Для каждого ЭлементМассива Из Массив Цикл Соответствие.Вставить(ЭлементМассива); КонецЦикла; Для каждого КлючИЗначение Из Соответствие Цикл НовыйМассив.Добавить(КлючИЗначение.Знач Посмотреть все в категории Работа с Массивом, Структурой, Соответствием
Есть 2 одномерных массива.
Бывает первый имеет больше значений, чем второй, бывает наоборот. Нужно сопоставить массивы, чтобы в одном из них, остались только те значения, которых нет во втором.
Например, МассивПервый(1,2,3,3,7); МассивВторой (1,2,2,3,4,5).
В первом массиве должны остаться только значения 3 и 7.
Вариант, который ниже не подходит, так как он удаляет в нужном массиве все совпадения, все зависимости сколько раз они встречаются, а мне так не надо.
Индекс1 = 0;
Пока Индекс1 < Массив1Размер Цикл
Индекс2 = 0;
Пока Индекс2 < Всего2 Цикл
Если Массив2[Индекс2] = Массив1[Индекс1] Тогда
Массив2(Индекс2);
Массив2Размер= Массив2Размер - 1;
Иначе
Индекс2 = Индекс2 + 1;
КонецЕсли;
КонецЦикла;
Индекс1 = Индекс1 + 1;
КонецЦикла;
"Нужно сопоставить массивы, чтобы в одном из них, остались только те значения, которых нет во втором.
Например, МассивПервый(1,2,3,3,7); МассивВторой (1,2,2,3,4,5).
В первом массиве должны остаться только значения 3 и 7. "
3 есть же во втором.
(8) Да, свернуть не подойдет. Есть пример алгоритма для такого сравнения? Я ничо не нашел. Какая то экзотика.
>Например, МассивПервый(1,2,3,3,7); МассивВторой (1,2,2,3,4,5).
>В первом массиве должны остаться только значения 3 и 7.
почему в первом должно остаться 3 и 7, а не только 7?
(8) + Определить мин индикса, сравнивать, преобразовывать. А вот вопрос - если в первом индекс больше - значения отсекаются или остаются.
(13) а, ну тогда в (11) заготовка. Там, где ОниСовпадают = Ложь; надо добавлять значения в третий массив, где будут храниться несовпадения
(10) В (11) хорошо показано, в (15) сказано, что нужен третий массив, куда будут пихаться все несовпадения.
Свернуть, кажется, тоже можно, нужно просто уметь делить на два с остатком, ну и это будет
(16) не подходит этот алгоритм. Потому что сравнение идет по индексам, первые не совпали, сразу идет Прервать. А надо, чтобы первый индекс первого массива искал совпадения по всем индексам второго массива, начиная с первого (ну то есть с нулевого) и если нет совпадения, индекс первого массива увеличивался на 1, а если есть совпадение, тогда эти индексы в поиске больше не участвуют.
поездец вообще! Готовый же код дал.
Я глубоко шокирован
(22) Близко, но тоже не то.
Так как ,если, например, Массив1 состоит из (1,2,3), а Массив2 состоит из (2,1,3), то эти массивы должны "совпадать", так как все элементы встречаются в обоих массивах, хоть и в разных индексах, а код (21) тут уже не справляется.
(22) Тогда у тебя условие не правильное:
В первом массиве должны остаться только значениЕ 7.
(24) И значение 3 тоже должно остаться, так как во втором Массиве одна 3, а в первом две 3.
То есть 3 из первого массива совпала с 3 из второго массива. Теперь мы их не учитываем (или удаляем). В первом массиве осталась одна 3, а во втором теперь ее нет, также в первом массиве осталась 7, котором также нет во втором массиве. Итого результат "сравнения" должен быть 3 и 7.
(26) Если МассивПервый(1,2,3,3,7,7); МассивВторой (1,2,2,3,4,5).
Нам нужен рузультат для первого массива, он "главный".
Тогда результат сравнения: 3,7,7
Так как: в первом массиве по индексу 0 число 1, ищем его во всех индексах второго массива. Если находим, то эти индексы больше не используем (либо удаляем), если не находим, то переходим в следующему индексу первого массива.
Итого: так как во втором массиве присутствует все из первого, кроме 3,7,7.
для каждого элемента из первого массива если найден такой элемент во втором массиве, удаляем оба, если нет, переходим к следующему элементу
(30) Я понимаю. Но в этом случае, происходит сдвиг массивов по индексам на - 1, соответственно меняя размер массивов на - 1и очень сложно контролировать, чтобы текущие индексы обоих массивов при проверке на совпадение не выходили за границы обоих массивов. Поэтому и ищу готовый алгоритм. Я думал, что это что-то распространенное, математика же, но даже в сборниках алгоритмов ничего похожего не нашел.
Массив в 1С — это набор некоторых значений. Значения в одном массиве могут быть различных типов.
Массив может быть получен в результате выполнения различных функций, например, ВыгрузитьКолонку() таблицы значений; в виде массива можно получить выделенные строки динамического списка и т.д. Можно создать массив и «вручную».
Создание массива
1. Как создать массив нужного размера
пМассив = новый Массив ( 4 ) ; //создали массив из 4 элементов
//Внесем значения элементов массива
пМассив [ 0 ] = "Мы" ;
пМассив [ 1 ] = "создали" ;
пМассив [ 2 ] = "новый" ;
пМассив [ 3 ] = "массив" ;
2. Как создать пустой массив и добавить в него элементы
пМассив = новый Массив ; //создали пустой массив
//Внесем значения элементов массива
пМассив . Добавить ( "Мы" ) ;
пМассив . Добавить ( "создали" ) ;
пМассив . Добавить ( "новый" ) ;
пМассив . Добавить ( "массив" ) ;
3. Как создать многомерный массив.
Рассмотрим этот вопрос на примере двумерного массива, так как массивы больших размерностей используются значительно реже, а механизм их работы не отличается от двумерного.
пМассив = новый Массив ( 4 , 2 ) ; //создали массив 4х2
//Внесем значения элементов массива, пронумеровав каждое слово
пМассив [ 0 ] [ 0 ] = "1. " ;
пМассив [ 0 ] [ 1 ] = "Мы" ;
пМассив [ 1 ] [ 0 ] = "2. " ;
пМассив [ 1 ] [ 1 ] = "создали" ;
пМассив [ 2 ] [ 0 ] = "3. " ;
пМассив [ 2 ] [ 1 ] = "многомерный" ;
пМассив [ 3 ] [ 0 ] = "4. " ;
пМассив [ 3 ] [ 1 ] = "массив" ;
4. Как создать фиксированный массив
Фиксированный массив отличается от обычного тем, что его нельзя изменять. Нельзя добавлять, удалять или менять значения элементов такого массива.
Фиксированный массив может быть получен из обычного:
пМассив = новый Массив ;
пМассив . Добавить ( "Мы" ) ;
пМассив . Добавить ( "создали" ) ;
пМассив . Добавить ( "новый" ) ;
пМассив . Добавить ( "массив" ) ;
фМассив = новый ФиксированныйМассив ( пМассив ) ; // создали фиксированный массив
Функции работы с массивами
Работу функций будем рассматривать на примере одномерного массива пМассив, созданного выше и состоящего из 4 элементов:
Функция ВГраница()
Получает наибольший индекс элемента массива. Он всегда на единицу меньше количества элементов массива.
Функция Вставить()
Вставляет какое-то значение в элемент массива с указанным индексом. Последующие элементы массива сдвигаются
Функция Добавить()
Создает новый элемент в конце массива и вставляет туда заданное значение
Функция Количество()
Возвращает количество элементов массива.
Функция Найти()
Ищет в массиве заданный элемент. Если находит, возвращает его индекс. Если не находит, возвращает Неопределено.
Индекс = пМассив . Найти ( "массив" ) ; // 3
Индекс = пМассив . Найти ( "строка, которой не было" ) ; // Неопределено
Функция Очистить()
Удаляет все значения из массива.
Функция Получить()
Получает значение массива по индексу. Эту же задачу можно решить через [].
Функция Удалить()
Удаляет элемент массива по индексу
Функция Установить()
Устанавливает значение элемента массива по индексу. Работает аналогично [].
Как обойти массив
Можно обойти все элементы массива без указания индекса:
Можно при обходе использовать индекс:
Как обойти многомерный массив
Многомерный массив обходится с помощью тех же циклов (см. выше), но один цикл должен быть вложен в другой.
мМассив = новый массив ( 3 , 4 ) ;
Для каждого Элемент 1 из мМассив Цикл
Для каждого Элемент 2 из Элемент 1 Цикл
Сообщить ( Элемент 1 ) ;
КонецЦикла ;
КонецЦикла ;
Или с применением индексов.
мМассив = новый массив ( 3 , 4 ) ;
Для Индекс 1 = 0 по мМассив . ВГраница ( ) Цикл
Для Индекс 2 по мМассив [ Индекс 1 ] . ВГраница ( ) Цикл
Сообщить ( мМассив [ Индекс 1 ] [ Индекс 2 ] ) ;
КонецЦикла ;
КонецЦикла ;
Сортировка массива
Для сортировки массива нам потребуется вспомогательный объект с типом СписокЗначений.
Список Знач = новый СписокЗначений ; // создаем список значений
СписокЗнач . ЗагрузитьЗначения ( пМассив ) ; // загружаем в список значения из массива
СписокЗнач . СортироватьПоЗначению ( НаправлениеСортировки . Возр ) ; //сортируем по возрастанию
СписокЗнач . СортироватьПоЗначению ( НаправлениеСортировки . Убыв ) ; //или по убыванию
пМассив = СписокЗнач . Выгрузить ( ) ; // выгружаем отсортированные значения обратно в массив
Сравнение двух массивов
Перед тем, как перейти к описанию функции сравнения, договоримся, что массивы считаются идентичными, если имеют одинаковое количество элементов и соответствующие элементы массивов равны. Тогда для сравнения можно использовать следующую функцию (кстати, такая функция уже присутствует в некоторых типовых конфигурациях):
Функция СравнитьМассивы ( Массив 1 , Массив 2 )
Если Массив 1 . Количество ( ) <>Массив2.Количество() Тогда
Возврат ЛОЖЬ ; // Массивы не равны, сравнивать элементы нет смысла.
КонецЕсли ;
Для Индекс = 0 по Массив 1 . ВГраница ( ) Цикл
Если Массив 1 [ Индекс ] <>Массив2[Индекс] Тогда
Возврат Ложь ; //эти элементы не равны, значит и массивы не равны
КонецЕсли ;
КонецЦикла ;
Возврат Истина ; // Если дошли до сюда, то массивы равны
КонецФункции
В функцию нужно передать 2 сравниваемых массива. Функция возвращает значение Истина, если массивы равны, и Ложь, если не равны.
Добавить комментарий Отменить ответ
Теперь мы в соцсетях! Подписывайтесь, чтобы получать информацию о последних обновлениях или задать вопрос.
Объясните, пожалуйста, в чём заключается особенность сравнения двух одномерных массивов вещественных чисел?
Сравнить два одномерных массива из целых чисел
Сравнить между собой два одномерных массива из целых чисел (0 и 1). Количество элементов массива -.
Даны два одномерных массива вещественных чисел. Найти в них максимальные элементы и поменять их местами
Даны два одномерных массива вещественных чисел. Найти в них максимальные элементы и поменять их.
Сравнить два одномерных массива
Здравствуйте, есть два одномерных массива Result и Data . Как их на VBA сравнить и в Result оставит.
Даны два одномерных рандомных массива. Сравнить их числа
Кто нибудь напишет? Задача:Даны два одномерных рандомных массива. Сравнить их числа двух массивов.
Ни в чём. Всё делается стандартными средствами языка С, независимо от среды разработки (билдер или иная).
Просто конкретика зависит от того, что понимать под сравнением. Точное ли поэлементное равенство, либо возможность отличий на какую-то малую дельту, либо что-то иное (на форуме, к Вашему сожалению, нострадамусов не водится)
собственно, мне надо задать 2 массива с не более 8 действительными данными в каждом. Построить третий массив из общих элементов первых двух массивов. Я сделал вот такой код:
А по-вторых, float-ы вообще нельзя сравнивать показанным выше образом, через оператор ==. Только с какой-то погрешностью: SameValue
как я сам только недавно узнал, локальные переменные в отличии от глобальных по умолчанию инициализируются нулем
. Место в BSS, где лежат неинициализированные глобальные/статические переменные - да, заливается нулями. Стек (где находятся переменные локальные) никто никогда не чистит:
8.5.9: If no initializer is specified for an object, and the object is of (possibly cv-qualified) non-POD class type (or array thereof), the object shall be default-initialized; if the object is of const-qualified type, the underlying
class type shall have a user-declared default constructor. Otherwise, if no initializer is specified for a non-static object, the object and its subobjects, if any, have an indeterminate initial value ; if the object or any of its subobjects are of const-qualified type, the program is ill-formed.
всё исправил, но есть проблема: третий массив состоит лишь из первого общего элемента двух массивов. Вот код:
Как это? А как же тот факт, что float нельзя сравнивать на равенство, а только на попадание в окрестность из-за влияния ошибок округления?
А как же тот факт, что float нельзя сравнивать на равенство, а только на попадание в окрестность из-за влияния ошибок округления?
Чтобы больше не гнать бред - внимательно изучаем документацию по командам FCOM/FCOMP/FCOMPP/FCOMI/FCOMIP/FUCOMI/FUCOMIP интел-совместимых процессоров.
На равенство - сравнивать они позволяют. При этом уравнивают и случаи +0.0 и -0.0.
Что, любой С/С++-компилятор транслирует код в команды какого-то сферического процессора на луне? А интел-совместимый проц в компе - эту прогу сам не исполняет, а таки отправляет на исполнение тому самиму сферическому коню фиг знает с какими командами?
Решение
- посмотри, что будет выведено вот таким участком кода, теоретик (и на название раздела посмотреть не забудь, не надо мне тут рассказывать про другие компиляторы):
И теперь расскажи мне, какие прямо умные все компиляторы, что умеют сравнивать float-ы (вопрос в теме стоял однозначно: сравнение float ). Мне, например, Builder XE2 выдал "Ha-Ha. " несмотря на то, что и процессор у меня Intel-овский, да и не самый отсталый. Инструкции-то может и есть, только кто ж гарантирует, что компилятор будет их использовать? Ты? А слетит программа, что я скажу родственникам тех людей, на дома которых упал самолет? "По заверениям одного теоретика все должно работать, так что считайте своих родственников живыми?" Так что не надо. Как сравнивались вещественные числа с погрешностью, так и будут сравниваться. Потому что "тут работает, тут нет" - это "не работает".
внимательно изучаем документацию по командам FCOM/FCOMP/FCOMPP/FCOMI/FCOMIP/FUCOMI/FUCOMIP интел-совместимых процессоров.
внимательно изучили и что?
где написано что он сравнивает с какой то точностью?
сравнивает побитно
а плавающие в памяти не всегда точные лежат, ограничение разрядной сетки однако
посему сравнивают их так
UI, По Вашему коду - претензии предъявляйте скорее к самому себе.
Если мне не изменяет память насчёт СТАНДАРТА языка - присвоение будет сделано с константой во float-формате, сравнение - с константой в double. Вот они и окажутся разные
UI, ValeryS, поясняю слова из своего прошлого поста.
Начнём с начала темы. Был вопрос о сравнении флоатов. Я сразу же ответил - что разницы с другими базовыми типами данных нет, а все отходы от базового чёткого сравнения (=,>), которое только и поддерживается командами процессора и языком - это уже результат работы сделанного программистом некоего нужного ему по семантике данных и/или задачи алгоритма (но этот алгоритм, так или иначе, в итоге будет основан на всё тех же базовых операторах сравнения =,>).
Те неоднозначности (+0.0 и -0.0), которые возникают по вине процессора - процессором же и обрабатываются.
Все остальные траблемы - дело рук ТОЛЬКО И ТОЛЬКО программиста. Нефиг сводить все проблемы с флоатами - к их округлению. Сам расчётный алгоритм может быть "неассоциативным" или "некоммутативным" - поэтому разный порядок использования переменных/констант и даст разные в итоге результаты. Подчёркиваю - просто РАЗНЫЕ, а не разные из-за ошибок округления. Пример - ну, например, задача оптимизации негауссовой функции алгоритмом покоординатного спуска, где при разном порядке перебора координат могут получаться разные решения (несмотря на то, были или не были округления).
Также сравнение с погрешностью - используется не только для плавучего формата. Берём, например, задачу сравнения строк и допуск в ней в виде расстояния Левенштейна в 1-2 единицы. Чтобы, например, заменять слова с единичными опечатками корретными словами из словаря. Ошибок округления нет - а задача сравнения с допуском есть
Ну и третий намёк. Как только вводим сравнение с допуском - получаем нетранзитивность результатов сравнения (при выполнении А==B и B==C нельзя гарантировать, что при том же допуске автоматически окажется A==C). Так что ликвидировав один геморрой - программист зарабатывает себе другой.
Так что в первую очередь всё зависит не от типа данных - а от мозгов/грамотности.
Читайте также: