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