Имя: Пароль:
1C
1С v8
Запрос 1с к двум табличным частям документа
Ø (Волшебник 25.02.2024 10:39)
,
0 DenVik
 
24.02.24
13:02
У док есть 2 ТЧ
1.этапы
2.оплаты
ключевое поле у них ВИД РАБОТ
ПРИМЕР:
тч этапы
вид работ     дата выполн
котлован      01.01.2024
котлован      20.01.2024
котлован      15.02.2024

тч оплаты
вид работ     дата платежа  сумма
котлован      11.01.2024    9000
котлован      27.01.2024    5000

как средствами запроса свести это в 3 строки(т е к ТЧ этапы)
вид работ     дата выполн дата платежа  сумма
котлован      01.01.2024   11.01.2024    9000
котлован      20.01.2024   27.01.2024    5000
котлован      15.02.2024
1 MyNick
 
24.02.24
13:18
Используйте булхгактерию, там это реализовано
2 DenVik
 
24.02.24
13:30
Хочу уточнить, мне это нужно в СКД сделать
3 АгентБезопасной Нацио
 
24.02.24
13:46
(0) А если оплат больше, чем этапов? :-)
Ну а вообще, если есть номер строки, то соединяй п онему. Если нет - сделай таблички с номером строки, и соединяй по номеру строки.
4 DenVik
 
24.02.24
13:58
(3) Да, оплат может быть больше чем этапов, как и этапов больше чем оплат.И виды работ могут быть разные...
5 Смотрящий
 
24.02.24
13:59
(4) Обана. Какой бюджет ?
6 АгентБезопасной Нацио
 
24.02.24
14:44
(4) Ну вот и делай, как в (3)
7 mikecool
 
24.02.24
15:56
(0) а что ты уже сделал?
8 d4rkmesa
 
24.02.24
16:09
(4) Тогда это не имеет смысла. Для оплат нет базы для распределения.
9 Волшебник
 
24.02.24
16:20
(2) Вы уточняете, Вам это нужно делать в СКД или не нужно? Нет, не нужно.
10 Волшебник
 
24.02.24
16:22
(0) Кстати, как называется документ? Ну просто чтобы понять степень бреда...
11 mikecool
 
24.02.24
18:09
(0) не делай попыток в запросе
1) код работать будет гарантировано
2) разобраться потом в коде будет проще, нежели в мегазапросе
12 RomanYS
 
24.02.24
18:19
(8) про распределение речи нигде не шло. Судя по примеру это просто вывод 2х ТЧ рядом.
13 DenVik
 
24.02.24
20:01
(12) Да распределение не нужно, можно конечно кодом сделать, а в скд передать готовую ТЗ
14 Одинист
 
24.02.24
22:36
(0) Надо тупо строки по номеру соединить или разделить сумму оплат на по суммам исполнения?

вид работ     дата выполн
котлован      01.01.2024 5000
котлован      20.01.2024 5000
котлован      15.02.2024 5000

тч оплаты
вид работ     дата платежа  сумма
котлован      11.01.2024    9000
котлован      27.01.2024    5000

как средствами запроса свести это в 3 строки(т е к ТЧ этапы)
вид работ     дата выполн дата платежа  сум.опл. неоплачено
котлован      01.01.2024   11.01.2024    5000
котлован      20.01.2024   11.01.2024    4000
котлован      20.01.2024   27.01.2024    1000
котлован      15.02.2024   27.01.2024    4000
котлован      15.02.2024   00.00.0000              1000
15 Волшебник
 
24.02.24
23:08
Запрос к документам — моветон.
16 DenVik
 
25.02.24
09:20
(15) Согласен, лучший вариант в обработке проведения средствами языка в регистр это все раскладывать, как надо.Предложу конечно заказчику, но это надо будет все соответствующие доки перепроводить, а он вроде просил отчет по документам
17 DenVik
 
25.02.24
09:28
(14) Разделять оплаты не нужно,по сути нужно 2 ТЧ документа вывести рядом как в (0).Но и по номеру строки соединить не прокатит.может быть ситуация:
в 1 ТЧ одна строка, а в ТЧ оплат 5 строк(эта ситуация корректно выводится, обычное левое соединение)
а если по 2 строки в обеих ТЧ(с одним видом работ) то соответственно суммы задваиваются
18 Одинист
 
25.02.24
09:49
(15) У 1С иное мнение.

Вот аналогичная задача в ERP
Процедура РаспределитьСуммыЭтаповОплатыДокументаПоЗаказам(Объект, СтруктураПараметров)

Данные по отгрузки берутся из ТЧ товары

    Запрос.Текст = "
    |ВЫБРАТЬ
    |    &Ссылка                    КАК Ссылка,
    |    &Дата                      КАК Дата,
    |    &ДатаСогласования          КАК ДатаСогласования,
    |    Товары.СуммаСНДС           КАК Сумма,
    |    Товары.Номенклатура        КАК Номенклатура,
    |    Товары.ДатаОтгрузки        КАК ДатаОтгрузки,
    |    Товары.Отменено            КАК Отменено,
    |    &ВернутьМногооборотнуюТару КАК ВернутьМногооборотнуюТару,
    |    &ТребуетсяЗалогЗаТару      КАК ТребуетсяЗалогЗаТару
    |ПОМЕСТИТЬ ВТТовары
    |ИЗ &Таблица КАК Товары
Запрос.УстановитьПараметр("Таблица", СсылкаОбъект.Товары);

Вот данные по оплатам берутся из ТЧ ЭтапыГрафикаОплаты

ЭтапыОплатыРеквизит            = ОбщегоНазначенияУТКлиентСервер.ДанныеДляПрисвоения(Объект, СтруктураПараметров.ПутьКДаннымТЧЭтапыОплаты);


Или если посмотреть документ ЗаключениеДоговораАренды там также в ТЧ данные ГрафикНачисленияУслуг, ГрафикОплатУслуг.
19 Одинист
 
25.02.24
10:02
(16) > Согласен, лучший вариант в обработке проведения средствами языка в регистр это все раскладывать

Зачем?
1. Регистр накопления нужен для ускорения работы с помощью хранения сумм в промежуточных итогов.
2. Регистр  может иметь смысл если есть некое сквозное хранение. Например когда есть несколько документов видов С/Ф и есть общий регистр сведений где хранятся данные. Или есть регистр выручки и есть документы Реализация, Реализация производственных услуг, Реализация ОС.
3. Регистр  сведений когда надо на уровне платформы исключить появление записей с повторяющимися полями.

Тут же скорее всего один документ, делать отчет: "Сводный план оплат" или "Планы оплат" по контрагенту ООО "Ромашка" за 5 лет. Тут речь по контроль исполнения отдельного заказа. Даже если конечно поставить задачу: "вывести контрагентов которые просрочивали оплату", но тут регистр не поможет, каждый заказ надо отдельно считать.

Можно ли эти данные засунуть в Регистр сведений, чтобы например, по одной дате и одному виду работ не было записей  — ну да можно.

Но если обратится к 1С, то раньше значения доп. реквизитов и контактная информация хранилась в регистрах сведений.

Сейчас эти данные в табличных частях справочников. Можно ли кривыми руками добавить один и тот же реквизит с двумя значениями или для контрагента добавить два юридических адреса? Да — можно. Но в 1С на это пошли.
20 Одинист
 
25.02.24
10:06
(17) > а если по 2 строки в обеих ТЧ(с одним видом работ) то соответственно суммы задваиваются

С чего им задваиваться если соединение по номеру строки?

Другое дело если будет
Услуги
1. Котлован
2. Септик
Оплата
1. Септик 1000
2. Котлован 2000

То тут по виду работ не номера строк не совпадут. Но тут классическая задача на нумерацию. Впрочем, если надо оплаты по заказам распределить не менее классическая задача на виртуальное FIFO.
21 Одинист
 
25.02.24
10:22
(0) Примерно так:

ВЫБРАТЬ
    взЭтапы.ссДок КАК ссДок,
    взЭтапы.ВидРабот КАК ВидРабот,
    взЭтапы.ДатаОтгрузки КАК ДатаОтгрузки,
    взЭтапы.НомерСтроки КАК НомерСтроки,
    взЭтапы.Стоимость КАК Стоимость
ПОМЕСТИТЬ втЭтапы
ИЗ
    (ВЫБРАТЬ
        АвансовыйОтчетТовары.Ссылка КАК ссДок,
        АвансовыйОтчетТовары.Номенклатура КАК ВидРабот,
        АвансовыйОтчетТовары.ДатаВходящегоДокумента КАК ДатаОтгрузки,
        АвансовыйОтчетТовары.НомерСтроки КАК НомерСтроки,
        АвансовыйОтчетТовары.Сумма КАК Стоимость
    ИЗ
        Документ.АвансовыйОтчет.Товары КАК АвансовыйОтчетТовары
    ГДЕ
        АвансовыйОтчетТовары.Ссылка.Дата > ДАТАВРЕМЯ(2024, 1, 1)) КАК взЭтапы

ИНДЕКСИРОВАТЬ ПО
    ссДок,
    ВидРабот,
    ДатаОтгрузки,
    НомерСтроки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    взОплаты.ссДок КАК ссДок,
    взОплаты.ВидРабот КАК ВидРабот,
    взОплаты.ДатаОплаты КАК ДатаОплаты,
    взОплаты.НомерСтроки КАК НомерСтроки,
    взОплаты.Оплата КАК Оплата
ПОМЕСТИТЬ втОплаты
ИЗ
    (ВЫБРАТЬ
        АвансовыйОтчетПрочее.Ссылка КАК ссДок,
        АвансовыйОтчетПрочее.Номенклатура КАК ВидРабот,
        АвансовыйОтчетПрочее.ДатаВходящегоДокумента КАК ДатаОплаты,
        АвансовыйОтчетПрочее.НомерСтроки КАК НомерСтроки,
        АвансовыйОтчетПрочее.Сумма КАК Оплата
    ИЗ
        Документ.АвансовыйОтчет.Прочее КАК АвансовыйОтчетПрочее
    ГДЕ
        АвансовыйОтчетПрочее.Ссылка.Дата > ДАТАВРЕМЯ(2024, 1, 1)) КАК взОплаты

ИНДЕКСИРОВАТЬ ПО
    ссДок,
    ВидРабот,
    ДатаОплаты,
    НомерСтроки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    взНППЭтаны.ссДок КАК ссДок,
    взНППЭтаны.ВидРабот КАК ВидРабот,
    взНППЭтаны.ДатаОтгрузки КАК ДатаОтгрузки,
    взНППЭтаны.Стоимость КАК Стоимость,
    взНППЭтаны.чНПП КАК чНПП
ПОМЕСТИТЬ втНППСтоимость
ИЗ
    (ВЫБРАТЬ
        втЭтапы.НомерСтроки КАК НомерСтроки,
        втЭтапы.ссДок КАК ссДок,
        втЭтапы.ВидРабот КАК ВидРабот,
        втЭтапы.ДатаОтгрузки КАК ДатаОтгрузки,
        втЭтапы.Стоимость КАК Стоимость,
        СУММА(1) КАК чНПП
    ИЗ
        втЭтапы КАК втЭтапы
            ЛЕВОЕ СОЕДИНЕНИЕ втЭтапы КАК втЭтапы1
            ПО втЭтапы.ссДок = втЭтапы1.ссДок
                И втЭтапы.ВидРабот = втЭтапы1.ВидРабот
                И втЭтапы.ДатаОтгрузки > втЭтапы1.ДатаОтгрузки
                И (втЭтапы.ДатаОтгрузки > втЭтапы1.ДатаОтгрузки
                    ИЛИ втЭтапы.ДатаОтгрузки = втЭтапы1.ДатаОтгрузки
                        И втЭтапы.НомерСтроки > втЭтапы1.НомерСтроки)
    
    СГРУППИРОВАТЬ ПО
        втЭтапы.ссДок,
        втЭтапы.ВидРабот,
        втЭтапы.ДатаОтгрузки,
        втЭтапы.Стоимость,
        втЭтапы.НомерСтроки) КАК взНППЭтаны
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    взНППОплата.ссДок КАК ссДок,
    взНППОплата.ВидРабот КАК ВидРабот,
    взНППОплата.ДатаОплаты КАК ДатаОплаты,
    взНППОплата.Оплата КАК Оплата,
    взНППОплата.чНПП КАК чНПП
ПОМЕСТИТЬ втНППОплата
ИЗ
    (ВЫБРАТЬ
        втОплаты.НомерСтроки КАК НомерСтроки,
        втОплаты.ссДок КАК ссДок,
        втОплаты.ВидРабот КАК ВидРабот,
        втОплаты.ДатаОплаты КАК ДатаОплаты,
        втОплаты.Оплата КАК Оплата,
        СУММА(1) КАК чНПП
    ИЗ
        втОплаты КАК втОплаты
            ЛЕВОЕ СОЕДИНЕНИЕ втОплаты КАК втОплаты1
            ПО втОплаты.ссДок = втОплаты1.ссДок
                И втОплаты.ВидРабот = втОплаты1.ВидРабот
                И (втОплаты.ДатаОплаты > втОплаты1.ДатаОплаты
                    ИЛИ втОплаты.ДатаОплаты > втОплаты1.ДатаОплаты
                        И втОплаты.НомерСтроки > втОплаты.НомерСтроки)
    
    СГРУППИРОВАТЬ ПО
        втОплаты.ВидРабот,
        втОплаты.ДатаОплаты,
        втОплаты.ссДок,
        втОплаты.Оплата,
        втОплаты.НомерСтроки) КАК взНППОплата
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    взРезультат.ссДок КАК ссДок,
    взРезультат.ВидРабот КАК ВидРабот,
    взРезультат.чНПП КАК чНПП,
    взРезультат.ДатаОтгрузки КАК ДатаОтгрузки,
    взРезультат.ДатаОплаты КАК ДатаОплаты,
    взРезультат.Стоимость КАК Стоимость,
    взРезультат.Оплата КАК Оплата
ИЗ
    (ВЫБРАТЬ
        ЕСТЬNULL(втНППСтоимость.ссДок, втНППОплата.ссДок) КАК ссДок,
        ЕСТЬNULL(втНППСтоимость.ВидРабот, втНППОплата.ВидРабот) КАК ВидРабот,
        ЕСТЬNULL(втНППСтоимость.чНПП, втНППОплата.чНПП) КАК чНПП,
        ЕСТЬNULL(втНППСтоимость.ДатаОтгрузки, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаОтгрузки,
        ЕСТЬNULL(втНППОплата.ДатаОплаты, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаОплаты,
        ЕСТЬNULL(втНППСтоимость.Стоимость, 0) КАК Стоимость,
        ЕСТЬNULL(втНППОплата.Оплата, 0) КАК Оплата
    ИЗ
        втНППСтоимость КАК втНППСтоимость,
        втНППОплата КАК втНППОплата) КАК взРезультат
22 Одинист
 
25.02.24
10:23
+ Индексы для таблиц НПП возможно стоит добавить.
23 Одинист
 
25.02.24
10:24
+ строчку
ИЛИ втОплаты.ДатаОплаты > втОплаты1.ДатаОплаты

Надо заменить на
ИЛИ втОплаты.ДатаОплаты = втОплаты1.ДатаОплаты
24 Одинист
 
25.02.24
10:28
Опять затупил в последнюю таблицу забыл соединение добавить вот поправленный варинат



ВЫБРАТЬ
    взЭтапы.ссДок КАК ссДок,
    взЭтапы.ВидРабот КАК ВидРабот,
    взЭтапы.ДатаОтгрузки КАК ДатаОтгрузки,
    взЭтапы.НомерСтроки КАК НомерСтроки,
    взЭтапы.Стоимость КАК Стоимость
ПОМЕСТИТЬ втЭтапы
ИЗ
    (ВЫБРАТЬ
        АвансовыйОтчетТовары.Ссылка КАК ссДок,
        АвансовыйОтчетТовары.Номенклатура КАК ВидРабот,
        АвансовыйОтчетТовары.ДатаВходящегоДокумента КАК ДатаОтгрузки,
        АвансовыйОтчетТовары.НомерСтроки КАК НомерСтроки,
        АвансовыйОтчетТовары.Сумма КАК Стоимость
    ИЗ
        Документ.АвансовыйОтчет.Товары КАК АвансовыйОтчетТовары
    ГДЕ
        АвансовыйОтчетТовары.Ссылка.Дата > ДАТАВРЕМЯ(2024, 1, 1)) КАК взЭтапы

ИНДЕКСИРОВАТЬ ПО
    ссДок,
    ВидРабот,
    ДатаОтгрузки,
    НомерСтроки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    взОплаты.ссДок КАК ссДок,
    взОплаты.ВидРабот КАК ВидРабот,
    взОплаты.ДатаОплаты КАК ДатаОплаты,
    взОплаты.НомерСтроки КАК НомерСтроки,
    взОплаты.Оплата КАК Оплата
ПОМЕСТИТЬ втОплаты
ИЗ
    (ВЫБРАТЬ
        АвансовыйОтчетПрочее.Ссылка КАК ссДок,
        АвансовыйОтчетПрочее.Номенклатура КАК ВидРабот,
        АвансовыйОтчетПрочее.ДатаВходящегоДокумента КАК ДатаОплаты,
        АвансовыйОтчетПрочее.НомерСтроки КАК НомерСтроки,
        АвансовыйОтчетПрочее.Сумма КАК Оплата
    ИЗ
        Документ.АвансовыйОтчет.Прочее КАК АвансовыйОтчетПрочее
    ГДЕ
        АвансовыйОтчетПрочее.Ссылка.Дата > ДАТАВРЕМЯ(2024, 1, 1)) КАК взОплаты

ИНДЕКСИРОВАТЬ ПО
    ссДок,
    ВидРабот,
    ДатаОплаты,
    НомерСтроки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    взНППЭтаны.ссДок КАК ссДок,
    взНППЭтаны.ВидРабот КАК ВидРабот,
    взНППЭтаны.ДатаОтгрузки КАК ДатаОтгрузки,
    взНППЭтаны.Стоимость КАК Стоимость,
    взНППЭтаны.чНПП КАК чНПП
ПОМЕСТИТЬ втНППСтоимость
ИЗ
    (ВЫБРАТЬ
        втЭтапы.НомерСтроки КАК НомерСтроки,
        втЭтапы.ссДок КАК ссДок,
        втЭтапы.ВидРабот КАК ВидРабот,
        втЭтапы.ДатаОтгрузки КАК ДатаОтгрузки,
        втЭтапы.Стоимость КАК Стоимость,
        СУММА(1) КАК чНПП
    ИЗ
        втЭтапы КАК втЭтапы
            ЛЕВОЕ СОЕДИНЕНИЕ втЭтапы КАК втЭтапы1
            ПО втЭтапы.ссДок = втЭтапы1.ссДок
                И втЭтапы.ВидРабот = втЭтапы1.ВидРабот
                И втЭтапы.ДатаОтгрузки > втЭтапы1.ДатаОтгрузки
                И (втЭтапы.ДатаОтгрузки > втЭтапы1.ДатаОтгрузки
                    ИЛИ втЭтапы.ДатаОтгрузки = втЭтапы1.ДатаОтгрузки
                        И втЭтапы.НомерСтроки > втЭтапы1.НомерСтроки)
    
    СГРУППИРОВАТЬ ПО
        втЭтапы.ссДок,
        втЭтапы.ВидРабот,
        втЭтапы.ДатаОтгрузки,
        втЭтапы.Стоимость,
        втЭтапы.НомерСтроки) КАК взНППЭтаны

ИНДЕКСИРОВАТЬ ПО
    ссДок,
    ВидРабот,
    чНПП
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    взНППОплата.ссДок КАК ссДок,
    взНППОплата.ВидРабот КАК ВидРабот,
    взНППОплата.ДатаОплаты КАК ДатаОплаты,
    взНППОплата.Оплата КАК Оплата,
    взНППОплата.чНПП КАК чНПП
ПОМЕСТИТЬ втНППОплата
ИЗ
    (ВЫБРАТЬ
        втОплаты.НомерСтроки КАК НомерСтроки,
        втОплаты.ссДок КАК ссДок,
        втОплаты.ВидРабот КАК ВидРабот,
        втОплаты.ДатаОплаты КАК ДатаОплаты,
        втОплаты.Оплата КАК Оплата,
        СУММА(1) КАК чНПП
    ИЗ
        втОплаты КАК втОплаты
            ЛЕВОЕ СОЕДИНЕНИЕ втОплаты КАК втОплаты1
            ПО втОплаты.ссДок = втОплаты1.ссДок
                И втОплаты.ВидРабот = втОплаты1.ВидРабот
                И (втОплаты.ДатаОплаты > втОплаты1.ДатаОплаты
                    ИЛИ втОплаты.ДатаОплаты = втОплаты1.ДатаОплаты
                        И втОплаты.НомерСтроки > втОплаты.НомерСтроки)
    
    СГРУППИРОВАТЬ ПО
        втОплаты.ВидРабот,
        втОплаты.ДатаОплаты,
        втОплаты.ссДок,
        втОплаты.Оплата,
        втОплаты.НомерСтроки) КАК взНППОплата

ИНДЕКСИРОВАТЬ ПО
    ссДок,
    ВидРабот,
    чНПП
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    взРезультат.ссДок КАК ссДок,
    взРезультат.ВидРабот КАК ВидРабот,
    взРезультат.чНПП КАК чНПП,
    взРезультат.ДатаОтгрузки КАК ДатаОтгрузки,
    взРезультат.ДатаОплаты КАК ДатаОплаты,
    взРезультат.Стоимость КАК Стоимость,
    взРезультат.Оплата КАК Оплата
ИЗ
    (ВЫБРАТЬ
        ЕСТЬNULL(втНППСтоимость.ссДок, втНППОплата.ссДок) КАК ссДок,
        ЕСТЬNULL(втНППСтоимость.ВидРабот, втНППОплата.ВидРабот) КАК ВидРабот,
        ЕСТЬNULL(втНППСтоимость.чНПП, втНППОплата.чНПП) КАК чНПП,
        ЕСТЬNULL(втНППСтоимость.ДатаОтгрузки, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаОтгрузки,
        ЕСТЬNULL(втНППОплата.ДатаОплаты, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаОплаты,
        ЕСТЬNULL(втНППСтоимость.Стоимость, 0) КАК Стоимость,
        ЕСТЬNULL(втНППОплата.Оплата, 0) КАК Оплата
    ИЗ
        втНППСтоимость КАК втНППСтоимость
            ЛЕВОЕ СОЕДИНЕНИЕ втНППОплата КАК втНППОплата
            ПО втНППСтоимость.ссДок = втНППОплата.ссДок
                И втНППСтоимость.ВидРабот = втНППОплата.ВидРабот
                И втНППСтоимость.чНПП = втНППОплата.чНПП) КАК взРезультат
25 Волшебник
 
25.02.24
10:39
Хватит разврата