Помогите с объединением двух строк в одну кодом (очень подробно внутри)
Доброе утро всем.
Конфа УТ10.3, обычные формы.
Есть не типовой отчет который берет данные из не типового РС, в РС же заносится данные из также не типового документа.
Суть доработки: контрагентам прописывается лимит сколько они могут задолжать, и в отчете показываются же насколько они превысили этот лимит.
Так вот. По одному контрагенту поставили лимит в 2млн.руб. Он в отчете разбивается на 2 строки (на скриншоте показано курсивом). Происходит этого из-за того, что он задолжал как по двум договорам. И вот эти две строчки надо объединить в одну, как у других контрагентов. Т.е. банально сложить.
В чем сложности возникли у меня:
сразу оговорю для понимания, что выводить нам надо в Секцию1 (обычный шрифт), сейчас же по данному контрагенту выводится в Секцию2 (курсив), в скриншотах также будет скрин макета с конфигуратора.
Для начала приведу весь код который задействован в выводе данных на макет:
Т.е. по коду видим, что сначала выводится секция 1 (куда нам и надо поместить данные), потом секция2, потом секция3 (это итоги), это нас не интересует.
Я смотрела по точкам останова, что идет обход по этому месту:
ТабличныйДокумент.Вывести(Секция2);
Но как мне это сложить и потом уже запихнуть в Секцию1 ума не приложу.
Скрин1: это макет.
Скрин2: как сейчас выглядит отчет.
Если необходимо будет инфы еще дам естественно.
Каким образом можно это вообще сделать? И можно ли?
Конфа УТ10.3, обычные формы.
Есть не типовой отчет который берет данные из не типового РС, в РС же заносится данные из также не типового документа.
Суть доработки: контрагентам прописывается лимит сколько они могут задолжать, и в отчете показываются же насколько они превысили этот лимит.
Так вот. По одному контрагенту поставили лимит в 2млн.руб. Он в отчете разбивается на 2 строки (на скриншоте показано курсивом). Происходит этого из-за того, что он задолжал как по двум договорам. И вот эти две строчки надо объединить в одну, как у других контрагентов. Т.е. банально сложить.
В чем сложности возникли у меня:
сразу оговорю для понимания, что выводить нам надо в Секцию1 (обычный шрифт), сейчас же по данному контрагенту выводится в Секцию2 (курсив), в скриншотах также будет скрин макета с конфигуратора.
Для начала приведу весь код который задействован в выводе данных на макет:
Процедура СформироватьРасшифровку(ЭлементыФормы) Экспорт
ТабличныйДокумент = ЭлементыФормы.Результат;
ТабличныйДокумент.Очистить();
ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабличныйДокумент.АвтоМасштаб = Истина;
ТабличныйДокумент.ТолькоПросмотр = Истина;
Макет = ПолучитьМакет("Макет");
Секция = Макет.ПолучитьОбласть("Шапка");
Секция.Параметры.ДатаСреза = Формат(ДатаСреза, "ДЛФ=ДД");
ТабличныйДокумент.Вывести(Секция);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент КАК Контрагент,
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент.ИНН КАК ИНН,
| СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток, 0)) КАК Сумма1,
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент.Наименование КАК КонтрагентНаименование,
| ИСТИНА КАК ВыводитьСтроку,
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов КАК ДоговорКонтрагентаВалютаВзаиморасчетов,
| СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаРеглОстаток, 0)) КАК Сумма2,
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Сделка
|ИЗ
| РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки(&ДатаСреза, ) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки
|ГДЕ
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВидДоговора = &СПокупателем
| И ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток > 0
|
|СГРУППИРОВАТЬ ПО
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент,
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент.ИНН,
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент.Наименование,
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов,
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Сделка
|
|УПОРЯДОЧИТЬ ПО
| ДоговорКонтрагентаВалютаВзаиморасчетов,
| КонтрагентНаименование";
Запрос.УстановитьПараметр("ДатаСреза", КонецДня(ДатаСреза));
Запрос.УстановитьПараметр("СПокупателем", Перечисления.ВидыДоговоровКонтрагентов.СПокупателем);
Остатки = Запрос.Выполнить().Выгрузить();
Остатки.Свернуть("Контрагент, ИНН, КонтрагентНаименование, ДоговорКонтрагентаВалютаВзаиморасчетов, ВыводитьСтроку", "Сумма1, Сумма2");
ВсеЛимиты = ОпределитьВсеЛимиты();
Для Каждого тс из ВсеЛимиты Цикл
ЕстьВОстатках = Ложь;
Для Каждого стр_ из Остатки Цикл
Если СокрЛП(тс.Контрагент.ИНН) = "" Тогда
Если СокрЛП(тс.Контрагент.Наименование) = СокрЛП(стр_.КонтрагентНаименование) Тогда
ЕстьВОстатках = Истина;
Прервать;
КонецЕсли;
Иначе
Если СокрЛП(тс.Контрагент.ИНН) = СокрЛП(стр_.ИНН) Тогда
ЕстьВОстатках = Истина;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ЕстьВОстатках Тогда Продолжить; КонецЕсли;
Стр_ = Остатки.НайтиСтроки(Новый Структура("Контрагент", тс.Контрагент));
Если Стр_.Количество() = 0 Тогда
НовСтр = Остатки.Добавить();
НовСтр.Контрагент = тс.Контрагент;
НовСтр.ДоговорКонтрагентаВалютаВзаиморасчетов = тс.Валюта;
НовСтр.ВыводитьСтроку = Истина;
НовСтр.КонтрагентНаименование = тс.Контрагент.Наименование;
НовСтр.ИНН = тс.Контрагент.ИНН;
НовСтр.Сумма1 = 0;
НовСтр.Сумма2 = 0;
КонецЕсли;
КонецЦикла;
Остатки.Сортировать("ДоговорКонтрагентаВалютаВзаиморасчетов, КонтрагентНаименование");
Секция = Макет.ПолучитьОбласть("Строка");
Секция1 = Макет.ПолучитьОбласть("Строка1");
Секция2 = Макет.ПолучитьОбласть("Строка2");
ИтогоСумма1 = 0; ИтогоСумма2 = 0; ИтогоПревыш = 0;
КурсЕвро = МодульВалютногоУЧета.ПолучитьКурсВалюты(Справочники.Валюты.НайтиПоКоду("978"), ДатаСреза);
Для Каждого тс из Остатки Цикл
Если не тс.ВыводитьСтроку Тогда Продолжить; КонецЕсли;
Лимит = ОпределитьЛимит(тс.Контрагент);
Если Лимит = 0 Тогда Продолжить; КонецЕсли;
Если не ЗначениеЗаполнено(тс.ИНН) Тогда
Лимит = ОпределитьЛимит(тс.Контрагент);
Если Лимит = 0 Тогда Продолжить; КонецЕсли;
Секция.Параметры.Контрагент = тс.Контрагент;
Секция.Параметры.ИНН = "";
Секция.Параметры.Сумма1 = тс.Сумма1;
СуммаВРублях = тс.Сумма2;
Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда
СуммаВРублях = тс.Сумма1 * КурсЕвро.Курс;
КонецЕсли;
Секция.Параметры.Сумма2 = СуммаВРублях;
Лимит = ОпределитьЛимит(тс.Контрагент);
//++++++++++++++++++++++++++++++++++++++++++++++
НДС = ОпределитьНДС (тс.Контрагент);
СтавкаНДС = ОпределитьНДС (тс.Контрагент);
НДСЧисло = ПереводНДС (тс.Контрагент);
//______________________________________________
Секция.Параметры.Лимит = Лимит;
Секция.Параметры.Превышение = ?( Лимит > 0 и СуммаВРублях - Лимит > 0, СуммаВРублях - Лимит, 0);
//++++++++++++++++++++++++++++++++++++
НДСЧисло = ПереводНДС (тс.Контрагент);
Секция.Параметры.СтавкаНДС = НДС;
Секция.Параметры.ЛимитБезНДС = Лимит - Лимит* НДСЧисло/100;
Секция.Параметры.СуммаНДС = Лимит - Секция.Параметры.ЛимитБезНДС;
//______________________________________
ТабличныйДокумент.Вывести(Секция);
ИтогоСумма1 = ИтогоСумма1 + тс.Сумма1;
ИтогоСумма2 = ИтогоСумма2 + СуммаВРублях;
ИтогоПревыш = ИтогоПревыш + ?(Лимит > 0 и СуммаВРублях - Лимит > 0 , СуммаВРублях - Лимит,0);
КонецЕсли;
Если ЗначениеЗаполнено(тс.ИНН) Тогда
ИНН_ = Остатки.скопировать(Новый Структура("ИНН",тс.ИНН));
Если ИНН_.Количество()= 1 Тогда
Секция.Параметры.Контрагент = тс.Контрагент;
Секция.Параметры.ИНН = тс.ИНН;
Секция.Параметры.Сумма1 = тс.Сумма1;
СуммаВРублях = тс.Сумма2;
Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда
СуммаВРублях = тс.Сумма1 * КурсЕвро.Курс;
Иначе
Секция.Параметры.Сумма1 = 0;
СуммаВРублях = тс.Сумма1;
тс.Сумма1 = 0;
КонецЕсли;
Секция.Параметры.Сумма2 = СуммаВРублях;
Лимит = ОпределитьЛимит(тс.Контрагент);
НДС = ОпределитьНДС (тс.Контрагент);
Секция.Параметры.СтавкаНДС = НДС;
Секция.Параметры.Лимит = Лимит;
Секция.Параметры.Превышение = ?(Лимит > 0 и СуммаВРублях - Лимит > 0, СуммаВРублях - Лимит,0);
НДСЧисло = ПереводНДС (тс.Контрагент);
Секция.Параметры.СтавкаНДС = НДС;
Секция.Параметры.ЛимитБезНДС = Лимит - Лимит* НДСЧисло/100;
Секция.Параметры.СуммаНДС = Лимит - Секция.Параметры.ЛимитБезНДС;
ТабличныйДокумент.Вывести(Секция);
ИтогоСумма1 = ИтогоСумма1 + тс.Сумма1;
ИтогоСумма2 = ИтогоСумма2 + СуммаВРублях;
ИтогоПревыш = ИтогоПревыш + ?(Лимит > 0 и СуммаВРублях - Лимит > 0, СуммаВРублях - Лимит,0);
Иначе
Секция1.Параметры.Контрагент = тс.Контрагент;
Секция1.Параметры.ИНН = тс.ИНН;
Секция1.Параметры.Сумма1 = ИНН_.Итог("Сумма1");
СуммаВРублях = ИНН_.Итог("Сумма2");;
Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда
СуммаВРублях = ИНН_.Итог("Сумма1")* КурсЕвро.Курс;;
Иначе
Секция.Параметры.Сумма1 = 0;
СуммаВРублях = ИНН_.Итог("Сумма1");
КонецЕсли;
Лимит = ОпределитьЛимит(тс.Контрагент);
НДС = ОпределитьНДС (тс.Контрагент);
Секция.Параметры.СтавкаНДС = НДС;
НДСЧисло = ПереводНДС (тс.Контрагент);
Секция.Параметры.СтавкаНДС = НДС;
Секция.Параметры.ЛимитБезНДС = Лимит - Лимит* НДСЧисло/100;
Секция.Параметры.СуммаНДС = Лимит - Секция.Параметры.ЛимитБезНДС;
Секция1.Параметры.Лимит = Лимит;
Секция1.Параметры.Превышение = ?(Лимит > 0 и СуммаВРублях - Лимит > 0,СуммаВРублях - Лимит,0);
ТабличныйДокумент.Вывести(Секция1);
Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда
ИтогоСумма1 = ИтогоСумма1 + ИНН_.Итог("Сумма1");
КонецЕсли;
ИтогоСумма2 = ИтогоСумма2 + СуммаВРублях;
ИтогоПревыш = ИтогоПревыш + ?(Лимит > 0 и СуммаВРублях - Лимит > 0, СуммаВРублях - Лимит,0);
Для Каждого ттс из ИНН_ Цикл
Если ттс.Сумма1 = 0 и ттс.Сумма2 = 0 Тогда
Стр_Осн = Остатки.НайтиСтроки(Новый Структура("Контрагент, ИНН, Сумма1, Сумма2",ттс.Контрагент, ттс.ИНН, ттс.Сумма1, ттс.Сумма2));
Для Каждого стр из Стр_Осн Цикл
стр.ВыводитьСтроку = Ложь;
КонецЦикла;
Продолжить;
КонецЕсли;
Секция2.Параметры.Контрагент = ттс.Контрагент;
Секция2.Параметры.Сумма1 = ттс.Сумма1;
СуммаВРублях = тс.Сумма2;
Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда
СуммаВРублях = ттс.Сумма1 * КурсЕвро.Курс;
Иначе
Секция.Параметры.Сумма1 = 0;
СуммаВРублях = тс.Сумма1;
КонецЕсли;
Секция2.Параметры.Сумма2 = СуммаВРублях;
ТабличныйДокумент.Вывести(Секция2);
Стр_Осн = Остатки.НайтиСтроки(Новый Структура("Контрагент, ИНН, Сумма1, Сумма2",ттс.Контрагент, ттс.ИНН, ттс.Сумма1, ттс.Сумма2));
Для Каждого стр из Стр_Осн Цикл
стр.ВыводитьСтроку = Ложь;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Секция3 = Макет.ПолучитьОбласть("Строка3");
Секция3.Параметры.Сумма1 = ИтогоСумма1;
Секция3.Параметры.Сумма2 = ИтогоСумма2;
Секция3.Параметры.Превыш = ИтогоПревыш;
ТабличныйДокумент.Вывести(Секция3);
ТабличныйДокумент.ТекущаяОбласть = ТабличныйДокумент.Область(2,3);
ПоказатьТ.е. по коду видим, что сначала выводится секция 1 (куда нам и надо поместить данные), потом секция2, потом секция3 (это итоги), это нас не интересует.
Я смотрела по точкам останова, что идет обход по этому месту:
Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда
СуммаВРублях = ттс.Сумма1 * КурсЕвро.Курс;
Иначе
Секция.Параметры.Сумма1 = 0;
СуммаВРублях = тс.Сумма1;
КонецЕсли;
Секция2.Параметры.Сумма2 = СуммаВРублях;
ТабличныйДокумент.Вывести(Секция2);
Но как мне это сложить и потом уже запихнуть в Секцию1 ума не приложу.
Скрин1: это макет.
Скрин2: как сейчас выглядит отчет.
Если необходимо будет инфы еще дам естественно.
Каким образом можно это вообще сделать? И можно ли?
Прикрепленные файлы:
По теме из базы знаний
- Разработка и сценарное тестирование с Vanessa-ADD. Концепция, теория и сквозной пример создания сценария
- Планы запросов - это просто! Разбор оптимизаций запросов PostgreSQL на живых примерах
- Гарри Поттер и подкапотное пространство веб-клиента
- Управление сборкой. Расширение для конфигурации СППР
- Тесты в расширениях – быстро, удобно и CI
Ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(1) У вас в запросе есть группировка по валюте договора и по сделке. Только при различиях по этим полям может двоится вывод сальдо по контрагенту, так как контрагент его наименование и ИНН образуют всегда один и только один кортеж Поскольку в выводе есть два договора то надо понять причину дробления. Это либо разные волюты договоров либо разные сделки...
Сделок я в форме вывода не обнаруживаю, более того при сворачивании таблицы с результатом они отбрасываются следовательно эта группировка и в запросе не нужна.
Поправьте запрос так, чтобы он пересчитывал в рубли все договора, тогда вы можете убрать группировку по валютам договоров и получите для каждого контрагента агрегированный долг без учета разделения по договорам...
вот этот фрагмент
Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда
СуммаВРублях = тс.Сумма1 * КурсЕвро.Курс;
КонецЕсли;
реализуйте в запросе. Справитесь?
Сделок я в форме вывода не обнаруживаю, более того при сворачивании таблицы с результатом они отбрасываются следовательно эта группировка и в запросе не нужна.
Поправьте запрос так, чтобы он пересчитывал в рубли все договора, тогда вы можете убрать группировку по валютам договоров и получите для каждого контрагента агрегированный долг без учета разделения по договорам...
вот этот фрагмент
Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда
СуммаВРублях = тс.Сумма1 * КурсЕвро.Курс;
КонецЕсли;
реализуйте в запросе. Справитесь?
(12) постепенно проглядывают условия задачи, всего-то к двенадцатому ответу, это довольно быстро.
Если договоры в разных валютах, суммы по ним не получится просто сложить. Можно даже не пытаться, получится полная фигня. Надо искать другие пути решения.
Если конвертация в одну валюту в запросе невозможна, то придется добавить обработку данных после запроса - перевести суммы в одну валюту. Потом свернуть данные по контрагенту и только потом переходить к выводу в отчет.
Если договоры в разных валютах, суммы по ним не получится просто сложить. Можно даже не пытаться, получится полная фигня. Надо искать другие пути решения.
Если конвертация в одну валюту в запросе невозможна, то придется добавить обработку данных после запроса - перевести суммы в одну валюту. Потом свернуть данные по контрагенту и только потом переходить к выводу в отчет.
(26) Вам повезло что у меня нашлась старая база клиента с УПП. Так то я не работаю с клиентами на конфах старше семейства УТ 11
Вот пригодный для вас запрос:
ВЫБРАТЬ
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент КАК Контрагент,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент.ИНН КАК ИНН,
ВЫБОР
КОГДА МАКСИМУМ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов.Код) = "978"
ТОГДА СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток, 0)) * МАКСИМУМ(КурсыВалютСрезПоследних.Курс)
ИНАЧЕ СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток, 0))
КОНЕЦ КАК Сумма1,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент.Наименование КАК КонтрагентНаименование,
ИСТИНА КАК ВыводитьСтроку,
ВЫБОР
КОГДА МАКСИМУМ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов.Код) = "978"
ТОГДА СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаРеглОстаток, 0)) * МАКСИМУМ(КурсыВалютСрезПоследних.Курс)
ИНАЧЕ СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаРеглОстаток, 0))
КОНЕЦ КАК Сумма2
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки(&ДатаСреза, ) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&ДатаСреза, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
ПО (ИСТИНА)
ГДЕ
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем)
И ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток > 0
СГРУППИРОВАТЬ ПО
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент
УПОРЯДОЧИТЬ ПО
КонтрагентНаименование
Я перенес из параметров запроса значение перечисления ВидыДоговоровКонтрагентов так как эту константу можно взять через ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем)
И вам придется добавить в параметры валюту евро
Заменив, в коде после запроса, строку " Запрос.УстановитьПараметр("СПокупателем", Перечисления.ВидыДоговоровКонтрагентов.СПокупателем);"
На строку: " Запрос.УстановитьПараметр("Валюта", справочники.валюты.найтипокоду("978")"
Так же я из запроса убрал сделки, ибо тут - Остатки.Свернуть("Контрагент, ИНН, КонтрагентНаименование, ДоговорКонтрагентаВалютаВзаиморасчетов, ВыводитьСтроку", "Сумма1, Сумма2");
Вы все равно их выкидываете из таблицы с результатом запроса.
Отдельного разговора заслуживает культура получения курса валюты на дату отчета в вашем случае параметр Запрос.УстановитьПараметр("ДатаСреза", КонецДня(ДатаСреза));
Но так как у вас в коде без изысков то и я в запросе присоединил таблицу курсов валют тупо на эту дату. По правилам ведения учета курс валюты при конверсии долга из одной валюты в другую должен браться на дату возникновения долга а не на произвольный момент времени.
С реализованным в вашем коде и унаследованным моим примером запроса методом вы получите разные рублевые массы долгов при неизменных показателях оборотов, формируя отчет на разные даты, просто в следствии волатильности евро!
Но переделать запрос так чтобы он конвертировал долг по курсу на дату его возникновения это уже совсем другая история. И тут потребуется измерение регистра ДокументРасчетовСКонтрагентом и несколько другое более сложное соединение с таблицей курсов валют
Впрочем возможно в исходной задаче и требуется оперативная оценка рублевой массы валютного долга по текущему курсу евро, тогда все нормально!
Вот пригодный для вас запрос:
ВЫБРАТЬ
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент КАК Контрагент,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент.ИНН КАК ИНН,
ВЫБОР
КОГДА МАКСИМУМ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов.Код) = "978"
ТОГДА СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток, 0)) * МАКСИМУМ(КурсыВалютСрезПоследних.Курс)
ИНАЧЕ СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток, 0))
КОНЕЦ КАК Сумма1,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент.Наименование КАК КонтрагентНаименование,
ИСТИНА КАК ВыводитьСтроку,
ВЫБОР
КОГДА МАКСИМУМ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов.Код) = "978"
ТОГДА СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаРеглОстаток, 0)) * МАКСИМУМ(КурсыВалютСрезПоследних.Курс)
ИНАЧЕ СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаРеглОстаток, 0))
КОНЕЦ КАК Сумма2
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки(&ДатаСреза, ) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&ДатаСреза, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
ПО (ИСТИНА)
ГДЕ
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем)
И ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток > 0
СГРУППИРОВАТЬ ПО
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент
УПОРЯДОЧИТЬ ПО
КонтрагентНаименование
Я перенес из параметров запроса значение перечисления ВидыДоговоровКонтрагентов так как эту константу можно взять через ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем)
И вам придется добавить в параметры валюту евро
Заменив, в коде после запроса, строку " Запрос.УстановитьПараметр("СПокупателем", Перечисления.ВидыДоговоровКонтрагентов.СПокупателем);"
На строку: " Запрос.УстановитьПараметр("Валюта", справочники.валюты.найтипокоду("978")"
Так же я из запроса убрал сделки, ибо тут - Остатки.Свернуть("Контрагент, ИНН, КонтрагентНаименование, ДоговорКонтрагентаВалютаВзаиморасчетов, ВыводитьСтроку", "Сумма1, Сумма2");
Вы все равно их выкидываете из таблицы с результатом запроса.
Отдельного разговора заслуживает культура получения курса валюты на дату отчета в вашем случае параметр Запрос.УстановитьПараметр("ДатаСреза", КонецДня(ДатаСреза));
Но так как у вас в коде без изысков то и я в запросе присоединил таблицу курсов валют тупо на эту дату. По правилам ведения учета курс валюты при конверсии долга из одной валюты в другую должен браться на дату возникновения долга а не на произвольный момент времени.
С реализованным в вашем коде и унаследованным моим примером запроса методом вы получите разные рублевые массы долгов при неизменных показателях оборотов, формируя отчет на разные даты, просто в следствии волатильности евро!
Но переделать запрос так чтобы он конвертировал долг по курсу на дату его возникновения это уже совсем другая история. И тут потребуется измерение регистра ДокументРасчетовСКонтрагентом и несколько другое более сложное соединение с таблицей курсов валют
Впрочем возможно в исходной задаче и требуется оперативная оценка рублевой массы валютного долга по текущему курсу евро, тогда все нормально!
(31) к сожалению что-то не то. Пишет ошибку, ссылаясь на строку , а именно на число "978". Ну на скрине видно. Сам текст выглядит так:
|КОГДА МАКСИМУМ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов.Код) = "978"
Запрос = Новый Запрос;
Запрос.Текст = " ВЫБРАТЬ
|ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент КАК Контрагент,
|ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент.ИНН КАК ИНН,
|ВЫБОР
|КОГДА МАКСИМУМ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов.Код) = "978"
|ТОГДА СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток, 0)) * МАКСИМУМ(КурсыВалютСрезПоследних.Курс)
|ИНАЧЕ СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток, 0))
|КОНЕЦ КАК Сумма1,
|ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент.Наименование КАК КонтрагентНаименование,
|ИСТИНА КАК ВыводитьСтроку,
|ВЫБОР
|КОГДА МАКСИМУМ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов.Код) = "978"
|ТОГДА СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаРеглОстаток, 0)) * МАКСИМУМ(КурсыВалютСрезПоследних.Курс)
|ИНАЧЕ СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаРеглОстаток, 0))
|КОНЕЦ КАК Сумма2
|ИЗ
|РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки(&ДатаСреза, ) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&ДатаСреза, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
|ПО (ИСТИНА)
|ГДЕ
|ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем)
|И ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток > 0
|СГРУППИРОВАТЬ ПО
|ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент
|УПОРЯДОЧИТЬ ПО
|КонтрагентНаименование";
Запрос.УстановитьПараметр("ДатаСреза", КонецДня(ДатаСреза));
//Запрос.УстановитьПараметр("СПокупателем", Перечисления.ВидыДоговоровКонтрагентов.СПокупателем);
Запрос.УстановитьПараметр("Валюта", справочники.валюты.найтипокоду "978");
Остатки = Запрос.Выполнить().Выгрузить();
ПоказатьПрикрепленные файлы:
(36) Спасибо большое :3
но ругается теперь, что неверное имя колонки в строке
случайно не из-за ДоговорКонтрагентаВалютаВзаиморасчетов? В запросе вроде Вы это убрали, да? и теперь надо как-то по другому колонку назвать или вообще удалить? но вроде как вообще удалить не получится, там вроде дальше это применяется
но ругается теперь, что неверное имя колонки в строке
Остатки.Свернуть("Контрагент, ИНН, КонтрагентНаименование, ДоговорКонтрагентаВалютаВзаиморасчетов, ВыводитьСтроку", "Сумма1, Сумма2");
случайно не из-за ДоговорКонтрагентаВалютаВзаиморасчетов? В запросе вроде Вы это убрали, да? и теперь надо как-то по другому колонку назвать или вообще удалить? но вроде как вообще удалить не получится, там вроде дальше это применяется
(37) Ваш ход рассуждений верен. Удаляйте колонку из первого параметра метода Свернуть.
Должно остаться "Контрагент, ИНН, КонтрагентНаименование, ВыводитьСтроку"
И дальше везде удаляйте, оно там применяется у вас для конвертации в рубли в коде - закомментируйте теперь у вас в запросе уже все в рублях
Должен выглядеть так
[/1C-CODE]
И вообще переделайте код вывода исходя из того что сумма у вас теперь всегда в рублях и обращение к тс.ДоговорКонтрагентаВалютаВзаиморасчетов больше не допустимо.
Должно остаться "Контрагент, ИНН, КонтрагентНаименование, ВыводитьСтроку"
И дальше везде удаляйте, оно там применяется у вас для конвертации в рубли в коде - закомментируйте теперь у вас в запросе уже все в рублях
Вот этот блок
Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда
СуммаВРублях = ИНН_.Итог("Сумма1")* КурсЕвро.Курс;;
Иначе
Секция.Параметры.Сумма1 = 0;
СуммаВРублях = ИНН_.Итог("Сумма1");
КонецЕсли;
Должен выглядеть так
[1C-CODE]
// Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда
// СуммаВРублях = ИНН_.Итог("Сумма1")* КурсЕвро.Курс;;
// Иначе
Секция.Параметры.Сумма1 = 0;
СуммаВРублях = ИНН_.Итог("Сумма1");
// КонецЕсли;
И вообще переделайте код вывода исходя из того что сумма у вас теперь всегда в рублях и обращение к тс.ДоговорКонтрагентаВалютаВзаиморасчетов больше не допустимо.
(6) я имею в виду буквально следующее: надо взять запрос, перенести его в консоль запросов, переписать так, чтобы результатом был правильный набор данных, потом этот набор данных выводить в табличный документ.
В процессе исправления ошибки не может быть никаких секций, потому что ошибка раньше, чем появляются секции.
(7) +1 именно так.
В процессе исправления ошибки не может быть никаких секций, потому что ошибка раньше, чем появляются секции.
(7) +1 именно так.
Перенесла вот эт вещь перед выводом Секции1:
Выводить стало куда надо, но из двух значений она выбирает последнее. Т.е. она делает обход, но первую строчку сразу забывает и выводит вторую только. Я так понимаю надо куда-то помещать значение из первого обхода, потом второй обход, потом результаты сложить. Но куда поместить значение из первого обхода?
Для Каждого ттс из ИНН_ Цикл
Если ттс.Сумма1 = 0 и ттс.Сумма2 = 0 Тогда
Стр_Осн = Остатки.НайтиСтроки(Новый Структура("Контрагент, ИНН, Сумма1, Сумма2",ттс.Контрагент, ттс.ИНН, ттс.Сумма1, ттс.Сумма2));
Для Каждого стр из Стр_Осн Цикл
стр.ВыводитьСтроку = Ложь;
КонецЦикла;
Продолжить;
КонецЕсли;
Секция1.Параметры.Контрагент = ттс.Контрагент;
Секция1.Параметры.Сумма1 = ттс.Сумма1;
СуммаВРублях = тс.Сумма2;
Если тс.ДоговорКонтрагентаВалютаВзаиморасчетов.Код = "978" Тогда
СуммаВРублях = ттс.Сумма1 * КурсЕвро.Курс;
Иначе
Секция.Параметры.Сумма1 = 0;
СуммаВРублях = тс.Сумма1;
КонецЕсли;
Секция1.Параметры.Сумма2 = СуммаВРублях;
//ТабличныйДокумент.Вывести(Секция2);
Стр_Осн = Остатки.НайтиСтроки(Новый Структура("Контрагент, ИНН, Сумма1, Сумма2",ттс.Контрагент, ттс.ИНН, ттс.Сумма1, ттс.Сумма2));
Для Каждого стр из Стр_Осн Цикл
стр.ВыводитьСтроку = Ложь;
КонецЦикла;
КонецЦикла;
ПоказатьВыводить стало куда надо, но из двух значений она выбирает последнее. Т.е. она делает обход, но первую строчку сразу забывает и выводит вторую только. Я так понимаю надо куда-то помещать значение из первого обхода, потом второй обход, потом результаты сложить. Но куда поместить значение из первого обхода?
Выгрузить в таблицу, добавить колонку с суммой в валюте отчета, пройтись по таблице, перевести каждую строчку в валюту отчета. В строке должна быть дата курса.
Потом таблицу свернуть.
Наймите программиста, это не будет дорогая задача. Так намного эффективнее будет.
Потом таблицу свернуть.
Наймите программиста, это не будет дорогая задача. Так намного эффективнее будет.
(21) я правильно понимаю,что строчка
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов КАК ДоговорКонтрагентаВалютаВзаиморасчетов
в запросе это и есть колонка с валютой? дальше через Добавить параметр я добавляю колонку с валютой отчета? Или как добавить колонку эту?
Не кидайте пожалуйста, хочу сама :с
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов КАК ДоговорКонтрагентаВалютаВзаиморасчетов
в запросе это и есть колонка с валютой? дальше через Добавить параметр я добавляю колонку с валютой отчета? Или как добавить колонку эту?
Не кидайте пожалуйста, хочу сама :с
(23) ну здесь получается, что "хочу обойтись" = "хочу, чтобы мне сделали бесплатно". По-моему, это не совсем правильно. Это же работа, работа должна быть оплачена. Я думаю, что здесь много людей, которые могут сделать эту работу, но почему они вдруг должны работать за так, не совсем понятно.
Работа не очень большая, я думаю, что за тыщу-полторы вполне реально найти исполнителя.
Работа не очень большая, я думаю, что за тыщу-полторы вполне реально найти исполнителя.
Предлагаю переделать текст запроса вот так и тогда всегда будет контрагент с одной сделкой и одной валютой:
Тем более Сделка судя по куда вообще нигде не нужна
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент КАК Контрагент,
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент.ИНН КАК ИНН,
| СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток, 0)) КАК Сумма1,
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент.Наименование КАК КонтрагентНаименование,
| ИСТИНА КАК ВыводитьСтроку,
| МАКСИМУМ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов) КАК ДоговорКонтрагентаВалютаВзаиморасчетов,
| СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаРеглОстаток, 0)) КАК Сумма2,
| МАКСИМУМ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Сделка) КАК Сделка
|ИЗ
| РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки(&ДатаСреза, ) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки
|ГДЕ
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ВидДоговора = &СПокупателем
| И ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток > 0
|
|СГРУППИРОВАТЬ ПО
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент,
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент.ИНН,
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент.Наименование
|
|УПОРЯДОЧИТЬ ПО
| ДоговорКонтрагентаВалютаВзаиморасчетов,
| КонтрагентНаименование";
Показать
Я бы заюзал СКД, табличку можно использовать ту же для макета, никто и не догадается.
В запросе использовать исключение именно и только для этого контрагента.
Здесь важна функция ИспользоватьЛимиты, ее тоже надо в СКД
В запросе использовать исключение именно и только для этого контрагента.
Здесь важна функция ИспользоватьЛимиты, ее тоже надо в СКД
Есть ощущение что код рабочий.
Вот эта строчка
Остатки.Свернуть("Контрагент, ИНН, КонтрагентНаименование, ДоговорКонтрагентаВалютаВзаиморасчетов, ВыводитьСтроку", "Сумма1, Сумма2");
по идее, должна решать, и раздвоение может быть или при наличии договоров с разной валютой или двух контрагентов с одинаковым ИНН.
Не может быть в справочнике два контрагента с одинаковым ИНН ?
Вот эта строчка
Остатки.Свернуть("Контрагент, ИНН, КонтрагентНаименование, ДоговорКонтрагентаВалютаВзаиморасчетов, ВыводитьСтроку", "Сумма1, Сумма2");
по идее, должна решать, и раздвоение может быть или при наличии договоров с разной валютой или двух контрагентов с одинаковым ИНН.
Не может быть в справочнике два контрагента с одинаковым ИНН ?
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)