0. Rustig 1172 15.03.19 21:37 Сейчас в теме

Сравнение запросов

На входе - два разных запроса и две выборки с одинаковыми полями. На выходе - итоговая таблица показывает расхождения между полученными результатами запросов.

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. Rustig 1172 16.03.19 11:58 Сейчас в теме
Поехали...
пару моментов:
1) исторически так сложилось, что отлаживать запросы в тестовой базе нельзя - поскольку цены из запроса выгружаются на сайт, доступа к сайту нет. поэтому пришлось отлаживать и проверять результат запроса как-то промежуточно - через внешнюю обработку (что очень напоминает сценарное тестирование).
первый вариант сравнения запросов был реализован через обработку - внутри модуля которой сравнивались ТЗ и ТЗновый через конструкцию (рисунок обработки прикладываю)

ТЗ = ЗапросЦен(Договор,СписокНоменклатуры);
ТЗновый = НовыйЗапросЦен(Договор,СписокНоменклатуры);

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ТЗ.Номенклатура КАК Номенклатура,
| ТЗ.Договор КАК Договор,
| ТЗ.Цена КАК Цена
|ПОМЕСТИТЬ ТЗ
|ИЗ
| &ТЗ КАК ТЗ;
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
| ТЗновый.Номенклатура КАК Номенклатура,
| ТЗновый.Договор КАК Договор,
| ТЗновый.Цена КАК ЦенаНовая
|ПОМЕСТИТЬ ТЗновый
|ИЗ
| &ТЗновый КАК ТЗновый;
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
| ТЗ.Номенклатура КАК Номенклатура,
| ТЗ.Договор КАК Договор,
| ТЗ.Цена КАК Цена,
| ТЗновый.ЦенаНовая КАК ЦенаНовая,
|ИЗ
| ТЗ КАК ТЗ
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗновый КАК ТЗновый
| ПО ТЗ.Номенклатура = ТЗновый.Номенклатура
| И ТЗ.Договор = ТЗновый.Договор";

Запрос.УстановитьПараметр("ТЗ", ТЗ);
Запрос.УстановитьПараметр("ТЗновый", ТЗновый);

СписокТоваров.Загрузить(Запрос.Выполнить().Выгрузить());

Назовем этот вариант Первым.

2) когда стало понятно, что следующие запросы также надо будет сравнивать, и объединять таблицы и переписывать поля в конструкции выше придется постоянно, а также придется переписывать интерфейс обработки сравнения, тогда решил переписать обработку в универсальный вариант. Назовем текущий вариант из статьи Универсальным.

3) при этом появилась потеря времени в том, что приходилось все время заново прописывать ПараметрыЗапросов и Тексты запросов - как только происходил какой-нибудь сбой (ошибка SDBL, например). Зато была разработана универсальная процедура объединения таблиц и сравнения результатов запроса.

4) Также стало неудобно прописывать любые списки значений, например СписокНоменклатуры - хотя в обработку можно добавить неуниверсальный вариант - получать список значений из любого документа - то есть вывести в форму обработки поле для выбора документа на форму, а дальше из конструкции:
Документ.Товары.Выгрузить() или что-то подобное.

5) Пробовал ПараметрыЗапросов сохранять в Табличные Части Обработки, но при этом нельзя задать Тип реквизита "СписокЗначений" - возможно для узких задач - его можно заменить типом "Документ" (и получать к примеру список из выражения Документ.Товары.Выгрузить() или что-то подобное - как в п.4)

6) В итоге, что я хочу сказать, в будущем я буду применять оба варианта сравнения запросов - Универсальный и Первый вариант.
Прикрепленные файлы:
2. Evg-Lylyk 2592 16.03.19 19:36 Сейчас в теме
(0) Сложность в том что для полноценного сравнения результатов нужно реализовывать функции, которые естественны для консоли запросов пакетные запросы, параметры типа ТЗ, ТипЗначения, МоментВремени, Граница, Уникальный идентификатор. Мне кажется данная функциональность должна быть включена консоль запросов тогда это удобно и функционально
Что то подобное есть в моей консоли функция сравнения результатов запросов, но она сравнивает результаты целиков это в основном удобно когда запрос модифицируется или заранее пишем два запроса результаты которых потом сравниваем.
3. Rustig 1172 17.03.19 10:05 Сейчас в теме
(2) спасибо за ответ и ссылку.

0) что значит "полноценное сравнение запросов"?

1) представленная мною обработка Сравнение запросов решает конкретную задачу - записей в результатах запросов около 10 тыс - и то, я специально их кол-во ограничил 10 тыс-ю, чтобы по времени было адекватно.
Обработка сразу фильтрует расхождения в 10 тыс. записей - а то, что вы предложили свою обработку - так она не помогает, а только усложнит решение подобной задачи.
Я вот не понял: у вас надо визуально вручную что ли искать расхождения?

2) "передавать в запрос параметр типа ТЗ" - пока не сталкивался с такой задачей.
И считаю,что во всех задачах решение надо упрощать! Можете пример привести, когда это нужно передавать ТЗ в запрос?
Все мои публикации стремятся показать, что в программировании 1с есть место упрощению.
Человек любит придумывать сложности на пустом месте, а простые решения не видит.
К примеру, я предлагаю и давно уже использую такой пример - вместо СпискаЗначений передавать некий Документ, то есть всего один параметр, из которого вытаскивать СЗ = Док.Товары.ВыгрузитьКолонку() - это к примеру для списка товаров. Это лишь инструмент для отладки и разработки. В рабочей базе в рабочем варианте - конечно останется СписокЗначений в том виде, в котором он должен быть (то есть без всяких документов).

3) прежде чем создавать инструмент Сравнения запросов, поискал на ИС - ничего подобного нет.
4. Evg-Lylyk 2592 17.03.19 10:35 Сейчас в теме
(3)

0) Ну т.е. возможность сравнить результаты любых запросов, как и писал выше например будет параметр граница, понятно что бывает не часто, но как только столкнетесь инструмент работать не будет.

1) Консоль выполняет 2 запроса и сравнивает результаты визуально через СравнитьФайлы. Можно сравнивать более 10тыс. строк

2) Тут с вами не соглашусь. ПО становится сложнее должно выполнять много функций. Простым оно должно быть только для пользователя. Из практики с каждым годом продукты 1С все сложнее и функциональнее.
Мне надо сравнить запросы из типовой в которых параметр ТЗ.

В контексте публикации понятно что решает конкретную задачу без усложнений, но и польза будет меньше т.к. не закрывает какие-то редкие случаи. На универсальный инструмент разработка не претендует.

3) В типовых консолях от 1С есть подобная функция (Сохранить эталон, Сравнить с эталоном), реализовано чуть иначе чем у вас

Суть моего поста эта функция должна быть в консоли запросов (там полная поддержка запросов)
5. Rustig 1172 17.03.19 17:02 Сейчас в теме
(4) в целом согласен с вами, но все равно "не мое это, о чем вы пишите" - возможно разный опыт, разный подход к решению задач.
Я не сторонник, чтобы разработчикам делать инструмент сложнее.

например будет параметр граница,
да, сталкивался - например задача разработать алгоритм проведения документа, рассчитать себестоимость по ФИФО.
я знаете ли, для себя все сложные случаи уже упростил донельзя - подобные задачи решают разработчики , а не пользователи -менеджеры продаж или бухгалтера. И я не сторонник, чтобы разработчикам делать инструмент сложнее.
Получение ТЗ и границы - если нет простого способа получить их в таблице параметров, так и не надо усложняться - можно именно эти параметры прописать алгоритмически в модуле обработки.
Вручную заполнять ТЗ на форме, чтобы передать в запрос - это не для меня....


будет параметр граница, понятно что бывает не часто, но как только столкнетесь инструмент работать не будет.

в умелых руках будет - никто не запрещает дорабатывать инструмент под себя и под свою конкретную задачу - речь же идет об инструменте для разработчиков - код открыт и совсем не запутан, как у других, состоит буквально из трех-четырех процедур.

Консоль выполняет 2 запроса и сравнивает результаты визуально через СравнитьФайлы. Можно сравнивать более 10тыс. строк

Не, коллега, это не для меня... визуально и 10 тыс записей ?
Такое я уже проходил...
Простым оно должно быть только для пользователя.
Кто твой "клиент" ? кто твой пользователь? Это же программист - чего не хватает, допишет, найдет баг - обойдет его. Я к примеру доработал под себя Конвертацию данных 2.0 - крутой инструмент придумали ребята, и все-таки и в нем нашлось место для моего творчества (см. одноименную публикацию)
Мне надо сравнить запросы из типовой в которых параметр ТЗ.

Как вы решили вопрос с передачей параметра ТЗ в своей консоли?
...Я бы прописал в модуле обработки получение этого параметра, как его получают в типовой, которую вы привели в пример. Возможно выделил бы в отдельный раздел на форме получение "сложных" параметров, в том числе алгоритмически в модуле обработки. Согласен,что моя обработка не решает этот вопрос, поэтому ее надо рассматривать как "готовый шаблон" для доработки при решении нетривиальных задач - к примеру когда надо передать ТЗ в параметр.
В типовых консолях от 1С есть подобная функция (Сохранить эталон, Сравнить с эталоном), реализовано чуть иначе чем у вас

У меня обработка на обычных формах разработана и предназначена для обычных форм. Вы наверное про консоли на управляемых формах упоминаете? Знаете, я раньше кроме типовой консоли запросов не знал другие. И как-то справлялся.
Сейчас для УФ каждый свою консоль пишет, утрирую конечно, но это признак что замудрили платформу и решения на ней на УФ. Проблемы в головах разработчиков, которые мыслят сложными категориями. Я в типовых навидался мудренных запросов. Выигрыша ноль. Искать ошибку в таком запросе - одно страдание для программиста.
Давайте не будем специально усложнять жизнь программисту.

Ну в общем, ваша консоль крутая - моя нет. Я не стремился ее сделать подобно вашей. Озвученные вами примеры запросов - с параметрами ТЗ и ГраницейВремени - не считаю сложными случаями. Я выше описал способ упростить получение параметра СписокЗначений. Отношу ваши "сложные случаи" к подобному случаю СпискаЗначений. То есть предлагаю залезть под капот обработки и доработать ее хитрым или нехитрым способом.
Вам желаю добра и побольше подписчиков!
Evg-Lylyk; +1 Ответить
6. Evg-Lylyk 2592 17.03.19 18:26 Сейчас в теме
(5) Тоже согласен.
Реализация ТЗ сложна, временные хранилища (подход подобный "сложный" параметр)
Ни в коем случае ни хотел обидеть. Также вам успехов. :)
16. Rustig 1172 19.03.19 11:57 Сейчас в теме
(6) я не против, если вы свою консоль доработаете, взяв отсюда представленный механизм сравнения результатов запросов.
эту консоль ждут свои доработки и расширения...
у вас УФ+широкие возможности, здесь ОФ + конкретная задача.
17. Evg-Lylyk 2592 19.03.19 12:06 Сейчас в теме
(16) Спасибо, пока не планирую... мне кажется того что есть достаточно. Пожеланий по его улучшению не получал.
7. sertak 126 18.03.19 05:52 Сейчас в теме
(3) есть консоль сравнения для управляемых форм:

https://infostart.ru/public/581794/
9. Rustig 1172 18.03.19 09:10 Сейчас в теме
(7) я видел вашу консоль. Только из описания не понятно, что она мне поможет. На первый взгляд очень запутана в настройках, и интерфейс интуитивно не понятен. Это мое личное мнение как первое впечатление. Хочется помочь вам - поэтому даю обратную связь, не желая обидеть или принизить. Возможно у других такие же непонятки- когда видят вашу консоль. Просто, задавать вопросы и ждать ответов не у всех есть время - поэтому не написал вам.
11. Rustig 1172 18.03.19 09:26 Сейчас в теме
(7) совет:
1) сделайте описание структурированным - пункт 1) - 2) -3) и т.д. "что она может",
2) пункты "что она не может" 1) , 2) 3).
3) Отдельный раздел для программистов-пользователей, которые хотят быстро опробовать ваш механизм - условно как во всех языках программирования как написать "Hello, World!"
4) Отдельный раздел для разработчиков, которые хотят или решать сложные вопросы, или доработать под себя.
5) Примеры решенных задач.
6) Жирным выделить текст или в начале или в конце статьи, что для управляемых форм.
7) вытащите полезную инфу из комментариев, если такая есть.
12. sertak 126 18.03.19 10:33 Сейчас в теме
(11) Функционал довольно большой, подробное описание есть во встроенной справке консоли. Из того описания, что приведено в теме, вполне можно принять решение, нужна ли она.
15. Rustig 1172 18.03.19 11:10 Сейчас в теме
18. Rustig 1172 28.03.19 09:25 Сейчас в теме
(2)
для полноценного сравнения результатов нужно реализовывать функции, которые естественны для консоли запросов пакетные запросы

реализовал сравнение временных таблиц.

предыстория. при тестировании нового запроса стал сравнивать с прежним. Сравнение запросов показало расхождения. Стал анализировать с первой временной таблицы, в итоге на третьей временной таблице проявилось расхождение. Понял, что для локализации расхождений в обработке необходим раздел сравнения временных таблиц. так он и появился.
Evg-Lylyk; +1 Ответить
19. Evg-Lylyk 2592 28.03.19 09:36 Сейчас в теме
(18)
Это хорошо
Еще для полноценной поддержки нужно реализовать параметры типа: ТаблицаЗначений, МоментВремени, Граница, УникальныйИдентификатор, Тип. Параметр типа список значений. Сохранение запросов в файл.
20. Rustig 1172 28.03.19 11:15 Сейчас в теме
(19)
Сохранение запросов в файл.


сохранение запросов в файл реализовано в версии 2.1 - без этого сохранения неудобно работать с подобными консолями.

сейчас последняя версия 2.2.

остается только реализовать "новые" типы данных.
сейчас уже можно воспользоваться в параметрах - Использовать Выражение (это из типовой консоли запросов взято) - думаю часть параметров "новых" типов можно через выражение прописать.
Evg-Lylyk; +1 Ответить
8. Rais96 18.03.19 07:53 Сейчас в теме
Я сохраняю результаты запросов в электронные таблицы и сравниваю. Просто и эффективно.
Evg-Lylyk; +1 Ответить
10. Evg-Lylyk 2592 18.03.19 09:16 Сейчас в теме
(8) В консолях запросов есть это, только автоматически
13. w.r. 360 18.03.19 10:42 Сейчас в теме
Я думаю, полезней сделать не подсветку, а просто выводить результаты отличия. Если отличий нет, то просто сообщать об идентичности результатов
14. Rustig 1172 18.03.19 11:10 Сейчас в теме
(13) есть кнопка "Отбор по расхождениям" - которая накладывает соответствующий фильтр на записи. Если расхождений нет, то итоговая таблица становится пустой с этим фильтром.
Ваша идея сообщать дополнительно,что расхождений нет - здравая и разумная!
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Консультант 1С (Бухгалтерия)
Санкт-Петербург
зарплата от 100 000 руб.
Полный день

Программист 1С
Санкт-Петербург
зарплата от 150 000 руб.
Полный день

Программист 1С
Санкт-Петербург
зарплата от 120 000 руб.
Полный день

Консультант 1С
Нижний Новгород
зарплата до 100 000 руб.
Полный день

Программист стажер 1С
Нижний Новгород
зарплата от 30 000 руб.
Полный день