8.х сравнение результатов запросов

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Vovan27, 13 сен 2010.

  1. TopicStarter Overlay
    Vovan27
    Offline

    Vovan27

    Регистрация:
    17 июл 2008
    Сообщения:
    45
    Симпатии:
    0
    Баллы:
    1
    Помогите, есть у меня програмка, по сравнению регистров в двух базах, в первой запускаю ету обработку, она подключается ко второй базе, выполняет запрос в первой базе, находит все регистры, потом выполняет такой же запрос во второй базе, и теперь нужно сравнить результаты запросов, подскажите как?
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    кхм....выгрузкой результатов запросов в ТЗ и поиск значений одной из них в другой средством того же запроса, если возможно или методоми Найти()/НайтиСтроки()
  3. TopicStarter Overlay
    Vovan27
    Offline

    Vovan27

    Регистрация:
    17 июл 2008
    Сообщения:
    45
    Симпатии:
    0
    Баллы:
    1
    извиняюсь за дотошность, просто я в етом совсем новичек, если можно подробнее или пример какой нить, или может я текст выложу а вы подскажите

    вот текс :
    Процедура Контроль(Кнопка)

    Если БазаV8 = Неопределено Тогда
    Подключиться(Неопределено);
    Если БазаV8 = Неопределено Тогда
    Возврат;
    КонецЕсли;
    КонецЕсли;

    СпТипыРегистрСведений = Новый СписокЗначений;
    Запрос = Новый Запрос;
    Запрос.Текст = "";

    Запрос.Текст = Запрос.Текст + "ВЫБРАТЬ
    |*
    |ИЗ РегистрСведений."+ИмяРегистра+" КАК РегистрСведений
    |";

    //Запрос.Текст = Запрос.Текст + "УПОРЯДОЧИТЬ ПО Позиция";
    Соответствие = Запрос.Выполнить().Выгрузить();
    СпКолонки = Новый СписокЗначений;
    Для Каждого Кол Из Соответствие.Колонки Цикл
    СпКолонки.Добавить(Кол.Имя);
    КонецЦикла;

    Соответствие.Колонки.Добавить("Метка");
    Соответствие.Колонки.Добавить("Реквизит");

    ЭлементыФормы.Соответствие.Колонки.Очистить();
    Для Каждого Кол Из Соответствие.Колонки Цикл
    Если Кол.Имя="Метка" Тогда
    Продолжить;
    КонецЕсли;
    ЭлементыФормы.Соответствие.Колонки.Добавить(Кол.Имя);
    ЭлементыФормы.Соответствие.Колонки[Кол.Имя].ТолькоПросмотр = Истина;
    ЭлементыФормы.Соответствие.Колонки[Кол.Имя].Данные = Кол.Имя;
    ЭлементыФормы.Соответствие.Колонки[Кол.Имя].ГоризонтальноеПоложениеВШапке = ГоризонтальноеПоложение.Центр;
    КонецЦикла;

    ЗапросБУ = БазаV8.NewObject("Запрос");
    ЗапросБУ.Текст = Запрос.Текст;
    РезультатБУ = ЗапросБУ.Выполнить().Выгрузить();

    "тут закончелись запросы и дальше нужно сравнить ети результаты"

    Для Каждого Стр Из Соответствие Цикл
    Состояние(" "+Соответствие.Индекс(Стр)+"/"+Соответствие.Количество());
    Если ...
    Тогда ...
    КонецЕсли;


    КонецЦикла;
    Состояние();

    КонецПроцедуры
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    ну и? в чем конкретно проблемы?
  5. TopicStarter Overlay
    Vovan27
    Offline

    Vovan27

    Регистрация:
    17 июл 2008
    Сообщения:
    45
    Симпатии:
    0
    Баллы:
    1
    как брать ети результаты запросов и сравнивать, если несложно примерчик, бо по теории совсем туго понимаю, а так гляну что откуда и как
    зарание пасиб
  6. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    если совсем новичок - быстрее разобраться с НайтиСтроки()/Найти() у ТаблицаЗначений, коей является Соответствие.

    Синтаксис-Помощник вам в руки :)
  7. TopicStarter Overlay
    Vovan27
    Offline

    Vovan27

    Регистрация:
    17 июл 2008
    Сообщения:
    45
    Симпатии:
    0
    Баллы:
    1
    а если несложно примерчик
  8. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    отбор = Новый Структура("<ИмяКолонки1>,<ИмяКолонки2>", <Значение1>, <Значение2>);
    МассивСтрок = Соответствие.найтиСтроки(Отбор);
    Для каждого Стр Из МассивСтрок Цикл
    <ОбрабатываемНайденныеСтрокиТЗ>
    КонецЦикла;
  9. TopicStarter Overlay
    Vovan27
    Offline

    Vovan27

    Регистрация:
    17 июл 2008
    Сообщения:
    45
    Симпатии:
    0
    Баллы:
    1
    чтото нечего неполучается, ну строки таблици в текущей бызе понятно как брать, а как строки брать с запроса который во второй базе выполнялся?
  10. Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Можно попробовать более изящное решение:
    1. Делаете запрос к внешней базе
    2. Переносите результаты в ТЗ
    3. Делаете запрос в текущей базе с полным соединением с ТЗ, полученной из внешней базы, только запроса надо делать по полям не ссылочного типа в той и этой базе, ссылки в разных базах сравнить не сможете
    4. Задаете условие в запросе строки со значениями NULL
    5. Выборка из запроса будут ваши различия в регистрах.
  11. TopicStarter Overlay
    Vovan27
    Offline

    Vovan27

    Регистрация:
    17 июл 2008
    Сообщения:
    45
    Симпатии:
    0
    Баллы:
    1
    1. запрос во внешней базе вроде есть уже, такой же как и в текущей :
    Код:
    ЗапросБУ = БазаV8.NewObject("Запрос");
    ЗапросБУ.Текст = Запрос.Текст;
    РезультатБУ = ЗапросБУ.Выполнить().Выгрузить();
    
    соответственно делается запрос :
    Код:
    Запрос.Текст = Запрос.Текст + "ВЫБРАТЬ
    |*	
    |ИЗ РегистрСведений."+ИмяРегистра+" КАК РегистрСведений
    |";
    
    пункт 2. и 3. подскажите как
  12. Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Выборка из произвольного регистра или заранее заданный небольшой интервал?
    Просто запрос должен выглядеть несколько иначе и настраиваться под каждый регистр в отдельности, например для регистра остатков из УТ 10.3 должен быть в следующем виде (при условии совпадения кодов объектов ссылочного типа:
    Код:
    ВЫБРАТЬ
    ТоварыНаСкладах.Период КАК Период,
    ТоварыНаСкладах.Регистратор.Представление КАК РегистраторПредставление,
    ТоварыНаСкладах.Активность КАК Активность,
    ТоварыНаСкладах.ВидДвижения КАК ВидДвижения,
    ТоварыНаСкладах.Склад.Код КАК СкладКод,
    ТоварыНаСкладах.Номенклатура.Код КАК  НоменклатураКод,
    ТоварыНаСкладах.ХарактеристикаНоменклатуры.Наименование КАК ХарактеристикаНоменклатуры.Наименование,
    ТоварыНаСкладах.СерияНоменклатуры.Код КАК СерияНоменклатурыКод,
    ТоварыНаСкладах.Качество.Код КАК КачествоКод,
    ТоварыНаСкладах.Количество КАК Количество
    ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
    
    В этом запросе возвращаются значения только примитивных типов (Строка, Число, Дата и Булево)
    Далее создаете ТЗ с колонками, полностью соответствующими колонкам запроса, перебираете запрос через Выборка.Следующий и заполняете таблицу значений

    После этого делаете запрос в текущей базе
    Код:
    ВЫБРАТЬ * ИЗ (
    ВЫБРАТЬ
    ТоварыНаСкладах.Период КАК Период,
    ТоварыНаСкладах.Регистратор.Представление КАК РегистраторПредставление,
    ТоварыНаСкладах.Активность КАК Активность,
    ТоварыНаСкладах.ВидДвижения КАК ВидДвижения,
    ТоварыНаСкладах.Склад.Код КАК СкладКод,
    ТоварыНаСкладах.Номенклатура.Код КАК  НоменклатураКод,
    ТоварыНаСкладах.ХарактеристикаНоменклатуры.Наименование КАК ХарактеристикаНоменклатуры.Наименование,
    ТоварыНаСкладах.СерияНоменклатуры.Код КАК СерияНоменклатурыКод,
    ТоварыНаСкладах.Качество.Код КАК КачествоКод,
    ТоварыНаСкладах.Количество КАК Количество
    ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах) КАК ТоварыНаСкладахВнутренние
    ПОЛНОЕ ОБЪЕДИНЕНИЕ
    ВЫБРАТЬ * ИЗ (&ТЗ) КАК ТоварыНаСкладахВнешние
    ПО
    ТоварыНаСкладахВнутренние.Период = ТоварыНаСкладахВнешние.Период
    ТоварыНаСкладахВнутренние.РегистраторПредставление= ТоварыНаСкладахВнешние.РегистраторПредставление
    ...
    
    
    Как то так...
  13. TopicStarter Overlay
    Vovan27
    Offline

    Vovan27

    Регистрация:
    17 июл 2008
    Сообщения:
    45
    Симпатии:
    0
    Баллы:
    1
    ну вот те маленькие запросы что у меня выше, как раз то что мне нужно, так как в форме етой обработки я выбираю в списке по какому регистру сведений мне вести дальнейшее сравнение и в таблице текущей базы я получаю перечень того что содержиться в етом регистре, так же после выполнения второго запорса из соседней базы я тоже получаю результат , а как их теперь сравнить я немогу понять.
    могу выложить всю обработку, и если несложно посмотрите ее может будет более понятно

    Вложения:

  14. Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Вы не сможете тупо сравнить поля результатов запроса в разных базах если в реквизитах регистров есть ссылочные типы в этом случае, допустим, для абсолютно одинаковой номенклатуры (т.е. все реквизиты одинаковые, включая код и наименование), сравнение покажет Ложь, т.к. сравниваются внутренние идентификаторы.
  15. TopicStarter Overlay
    Vovan27
    Offline

    Vovan27

    Регистрация:
    17 июл 2008
    Сообщения:
    45
    Симпатии:
    0
    Баллы:
    1
    ну тут получается что базы идентичны, одна тока упр учет вторая бух учет, документы ежедневно перелеваются из упр в бух, а вот изменения регистров необходимо отслеживать и переливатьтолько изменившиеся по отношению к бух базе
  16. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    ИНДЕКСЫ, БЛДЖАТ ИНДЕКСЫ то не переливаются!!!
    У вас есть в БД 1 ДОК 1. Его индекс (индентификатор объекта, присваиваемый 1Ской) = dffds123123dsfsdfs123123123
    Во второй базе, объект с тем же набором как бы реквизитов создается заново, и ему присваивается индетификатор (индекс таблицы) = e33424234234234234234
    Добиться чтобы они были равны - НЕВОЗМОЖНО. Курите например справку по функции NewID в какомнить SQL Server...
    Идетификатор зависит от времени, даты, ID процессора (или мамки?), милисекунд прошедших со времени включения компа и еще от пары факторов, совпадения которых вы хрена когда добъетесь, среди которых ВЕЛИКИЙ РАНДОМ!

    Когда вы пишете Если Док1 = Док2 Тогда
    1С это интерпретирует как
    If dffds123123dsfsdfs123123123 = e33424234234234234234 then ...

    Поэтому вы можете опираться разве что на Номер + Дата для документов (если они совпадают) и на Код справочника (если он есть, а то играть в угадайку по Наименованиям элемента справочников)

    Все это далеко не факт что совпадет. Документы перекачались из УТ в бухию, а потом бухи в бухии поправили номер (или удалили док) в УТ сменили дату.
    И там и там переименовали Иванова в Петрова, и Иванова в Сидорова.

    ... это так, из личного, обширного опыта по одновременной работе с множеством баз.
  17. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    В результате, в 90% случаев приходим к тому, что под каждый вид документов описываем СВОЙ набор правил сравнения, под каждый регистр... (а регистры то в УТ и БУХ разные!!!) свои правила сравнения, под каждый справочник свой.
    И каждое правило состоит из правил и исключений, и каждое правило грозит в какой то момент давать сбой алгоритма (который еще приходитсья вылавливать, анализировать, и прописывать в исключения или само правило).

    Тут работа такая - шо в общем случае обзывается НЕВЫПОЛНИМО.
    Но начинать жрать мамонта, как учат нас наши предки, надо с хобота - он чище, и его можно нарезать ножиком до размеров котелка.

    Оцените самый маштабный вид документов (документов какого вида более всего в базе) - пропишите правила сравнения для него, потом для более "рейтингово" документа/справочника. Где то 5-10 последних объектов (справочников/документов) можно будет описать одним общим правилом (а то и забить на сравнение, потрахавшись с первыми пятью рейтинговыми документами/справочниками).

    А в частном случае (сферического коня в вакууме) - можно прописать правила для 2-3 рейтинговых объектов, а остальное сравнить общим правилом.

    Но кушать мамонта надо с хобота.
  18. TopicStarter Overlay
    Vovan27
    Offline

    Vovan27

    Регистрация:
    17 июл 2008
    Сообщения:
    45
    Симпатии:
    0
    Баллы:
    1
    в том то и дело что я говорю, что такая обработка по сравнению документов уже есть и работает она по ID , базы идентичные регистры идентичные при переливке документов из упр в бух ID присваивается как и у оригинала, конфигурации нестандартные и писанные под нас, а в данном случае нужно сравнивать именно регистры а недокументы, если в упр базе правился какой то регистр, даже допустим инвестиции, то соответственно в бух базе он уже будет отличаться содержанием, вот нужно ето поймать и показать :)

Поделиться этой страницей