Как понять, что написано в запросе типовой конфигурации.....?
Есть отчет "Оплата за период" и в нем какой то запрос дикий запрос, найдутся ли у вас совет как понять логику запроса, сам не особо опытен и в констукторе часть его не открывается
ТекстВрмТбл = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ВзаиморасчетыСКонтрагентамиОбороты.Регистратор,
| ВзаиморасчетыСКонтрагентамиОбороты.Период,
| ВзаиморасчетыСКонтрагентамиОбороты.Сделка,
| ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента,
| ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход
|ПОМЕСТИТЬ
| ВзаиморасчетыСКонтрагентамиОборотыНаДатуКон
|ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(, &ДатаКон, Регистратор, {ДоговорКонтрагента.* КАК ДоговорВзаиморасчетовПокупателя, Контрагент.* КАК Покупатель}) КАК ВзаиморасчетыСКонтрагентамиОбороты
|ГДЕ НЕ ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентом
|;
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ВзаиморасчетыСКонтрагентамиОбороты.Регистратор,
| ВзаиморасчетыСКонтрагентамиОбороты.Период,
| ВзаиморасчетыСКонтрагентамиОбороты.Сделка,
| ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента,
| ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход
|ПОМЕСТИТЬ
| ВзаиморасчетыСКонтрагентамиОборотыНаДатуНач
|ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(, &ДатаНач, Регистратор, {ДоговорКонтрагента.* КАК ДоговорВзаиморасчетовПокупателя, Контрагент.* КАК Покупатель}) КАК ВзаиморасчетыСКонтрагентамиОбороты
|ГДЕ НЕ ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентом
|;
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ВзаиморасчетыПоДок.Регистратор,
| ВзаиморасчетыПоДок.Период,
| ВзаиморасчетыПоДок.ДокументРасчетовСКонтрагентом,
| ВзаиморасчетыПоДок.ДоговорКонтрагента,
| ВзаиморасчетыПоДок.СуммаВзаиморасчетовПриход
|ПОМЕСТИТЬ
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОборотыНаДатуКон
|ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Обороты(, &ДатаКон, Регистратор, {ДоговорКонтрагента.* КАК ДоговорВзаиморасчетовПокупателя, Контрагент.* КАК Покупатель}) КАК ВзаиморасчетыПоДок
|ГДЕ ВзаиморасчетыПоДок.ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентом
|;
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ВзаиморасчетыПоДок.Регистратор,
| ВзаиморасчетыПоДок.Период,
| ВзаиморасчетыПоДок.ДокументРасчетовСКонтрагентом,
| ВзаиморасчетыПоДок.ДоговорКонтрагента,
| ВзаиморасчетыПоДок.СуммаВзаиморасчетовПриход
|ПОМЕСТИТЬ
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОборотыНаДатуНач
|ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Обороты(, &ДатаНач, Регистратор, {ДоговорКонтрагента.* КАК ДоговорВзаиморасчетовПокупателя, Контрагент.* КАК Покупатель}) КАК ВзаиморасчетыПоДок
|ГДЕ ВзаиморасчетыПоДок.ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентом
|;";
ТекстВложенногоЗапросаПоНеоплаченнымДокументамНаДатуКон = "
|ВЫБРАТЬ
// собственно, этот запрос и отвечает за то, чтобы для всех договоров,
// по которым есть начальное или конечное сальдо,
// извлечь "крайнего" регистратора.
| ВзаиморасчетыОиО.ДоговорКонтрагента,
| ВзаиморасчетыОиО.Сделка,
| ВзаиморасчетыОиО.Период,
| МИНИМУМ(ВзаиморасчетыОиО.Регистратор) КАК ПервыйРегистратор
|ИЗ
| ( ВЫБРАТЬ ВзаиморасчетыОиО.Регистратор
| , ВзаиморасчетыОиО.ДоговорКонтрагента
| , ВзаиморасчетыОиО.Сделка
| , ВзаиморасчетыОиО.Период
| ИЗ ВзаиморасчетыСКонтрагентамиОборотыНаДатуКон КАК ВзаиморасчетыОиО
| ОБЪЕДИНИТЬ
| ВЫБРАТЬ ВзаиморасчетыПоДок.Регистратор
| , ВзаиморасчетыПоДок.ДоговорКонтрагента
| , ВзаиморасчетыПоДок.ДокументРасчетовСКонтрагентом
| , ВзаиморасчетыПоДок.Период
| ИЗ ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОборотыНаДатуКон КАК ВзаиморасчетыПоДок
| ) КАК ВзаиморасчетыОиО
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ
| (
| ВЫБРАТЬ
| ДоговорКонтрагента,
| Сделка,
| МИНИМУМ(ПериодКон) КАК Период,
| СуммаВалОстаток
| ИЗ
| (ВЫБРАТЬ
// этот запрос выбирает Договоры-сделки, Регистраторы и их периоды,
// которые являются оплаченными на ДатаНач или на ДатаКон
// Критерий того, что регистратор является оплаченным:
// Сумма движений регистра "приход" после него больше,
// чем конечное сальдо по тому же набору измерений,
// или равно ему.
// Вышележащий запрос обеспечивает извлечение первого такого регистратора
// и его период
| ВзаиморасчетыОиО.ДоговорКонтрагента КАК ДоговорКонтрагента,
| ВзаиморасчетыОиО.Сделка КАК Сделка,
| МИНИМУМ(ВзаиморасчетыОиО.Период) КАК ПериодКон,
| ВзаиморасчетыО.СуммаВалОстаток
| ИЗ
| ( ВЫБРАТЬ ВзаиморасчетыОиО.Регистратор
| , ВзаиморасчетыОиО.ДоговорКонтрагента
| , ВзаиморасчетыОиО.Сделка
| , ВзаиморасчетыОиО.Период
| ИЗ ВзаиморасчетыСКонтрагентамиОборотыНаДатуКон КАК ВзаиморасчетыОиО
| ОБЪЕДИНИТЬ
| ВЫБРАТЬ ВзаиморасчетыПоДок.Регистратор
| , ВзаиморасчетыПоДок.ДоговорКонтрагента
| , ВзаиморасчетыПоДок.ДокументРасчетовСКонтрагентом
| , ВзаиморасчетыПоДок.Период
| ИЗ ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОборотыНаДатуКон КАК ВзаиморасчетыПоДок
| ) КАК ВзаиморасчетыОиО
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ
| (ВЫБРАТЬ
//этот подзапрос извлекает все договоры-сделки, по которым есть задолжнность
//контрагента на ДатаНач или ДатаКон
//Здесь работает во внутреннем соединении как фильтр, заодно извлекает конечное сальдо
//Его псевдоним - ВзаиморасчетыО
| ВзаиморасчетыОстатки.ДоговорКонтрагента КАК ДоговорКонтрагента,
| ВзаиморасчетыОстатки.Сделка КАК Сделка,
| ВзаиморасчетыОстатки.СуммаВзаиморасчетовОстаток КАК СуммаВалОстаток
| ИЗ
| ( ВЫБРАТЬ ВзаиморасчетыОстатки.ДоговорКонтрагента
| , ВзаиморасчетыОстатки.Сделка
| , ВзаиморасчетыОстатки.СуммаВзаиморасчетовОстаток
| ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&ДатаКонОст, {ДоговорКонтрагента.* КАК ДоговорВзаиморасчетовПокупателя, Контрагент.* КАК Покупатель}) КАК ВзаиморасчетыОстатки
| ГДЕ НЕ ВзаиморасчетыОстатки.ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентом
| ОБЪЕДИНИТЬ
| ВЫБРАТЬ ВзаиморасчетыОстаткиПоДок.ДоговорКонтрагента
| , ВзаиморасчетыОстаткиПоДок.ДокументРасчетовСКонтрагентом
| , ВзаиморасчетыОстаткиПоДок.СуммаВзаиморасчетовОстаток
| ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки(&ДатаКонОст, {ДоговорКонтрагента.* КАК ДоговорВзаиморасчетовПокупателя, Контрагент.* КАК Покупатель}) КАК ВзаиморасчетыОстаткиПоДок
| ГДЕ ВзаиморасчетыОстаткиПоДок.ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентом
| ) КАК ВзаиморасчетыОстатки
| ГДЕ
| (ВзаиморасчетыОстатки.СуммаВзаиморасчетовОстаток > 0)) КАК ВзаиморасчетыО
| ПО ВзаиморасчетыО.ДоговорКонтрагента = ВзаиморасчетыОиО.ДоговорКонтрагента
| И ВзаиморасчетыО.Сделка = ВзаиморасчетыОиО.Сделка
| // теперь остались только те договоры-сделки, по которым сальдо на
| // конец периода положительно
| ЛЕВОЕ СОЕДИНЕНИЕ
//Это левое соединение "подтягивает" к периодам из вышележащего запроса
//регистраторов, которые на оси времени лежат позже,
//а заодно достает их движения "приход".
//Движения "приход" в дальнейшем пригодятся для того, чтобы
//отобрать только те периоды вышележащего запроса, приход после которых
//больше, чем конечное сальдо по регистратору-сделке из ВзаиморасчетыО
//все делается именно так из-за того, что возможно существование регистраторов
//с одинаковым Периодом.
| ( ВЫБРАТЬ ВзаиморасчетыОиО2.Регистратор
| , ВзаиморасчетыОиО2.Период
| , ВзаиморасчетыОиО2.Сделка
| , ВзаиморасчетыОиО2.ДоговорКонтрагента
| , ВзаиморасчетыОиО2.СуммаВзаиморасчетовПриход
| ИЗ ВзаиморасчетыСКонтрагентамиОборотыНаДатуКон КАК ВзаиморасчетыОиО2
| ОБЪЕДИНИТЬ
| ВЫБРАТЬ ВзаиморасчетыПоДок.Регистратор
| , ВзаиморасчетыПоДок.Период
| , ВзаиморасчетыПоДок.ДокументРасчетовСКонтрагентом
| , ВзаиморасчетыПоДок.ДоговорКонтрагента
| , ВзаиморасчетыПоДок.СуммаВзаиморасчетовПриход
| ИЗ ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОборотыНаДатуКон КАК ВзаиморасчетыПоДок
| ) КАК ВзаиморасчетыОиО2
| ПО ВзаиморасчетыОиО.ДоговорКонтрагента = ВзаиморасчетыОиО2.ДоговорКонтрагента
| И ВзаиморасчетыОиО.Сделка = ВзаиморасчетыОиО2.Сделка
| И (ВзаиморасчетыОиО.Период < ВзаиморасчетыОиО2.Период
| ИЛИ ВзаиморасчетыОиО.Период = ВзаиморасчетыОиО2.Период И ВзаиморасчетыОиО.Регистратор < ВзаиморасчетыОиО2.Регистратор)
| СГРУППИРОВАТЬ ПО
| ВзаиморасчетыОиО.ДоговорКонтрагента,
| ВзаиморасчетыОиО.Сделка,
| ВзаиморасчетыОиО.Регистратор,
| ВзаиморасчетыО.СуммаВалОстаток
| ИМЕЮЩИЕ
| СУММА(ВЫБОР
| КОГДА (ВзаиморасчетыОиО2.СуммаВзаиморасчетовПриход) ЕСТЬ NULL
| ТОГДА 0
| ИНАЧЕ ВзаиморасчетыОиО2.СуммаВзаиморасчетовПриход
| КОНЕЦ) < ВзаиморасчетыО.СуммаВалОстаток
| ) КАК ПервыеПериодыПромежуточный
| СГРУППИРОВАТЬ ПО
| ДоговорКонтрагента,
| Сделка,
| СуммаВалОстаток
| ) КАК ПервыеПериоды
| ПО ПервыеПериоды.Период = ВзаиморасчетыОиО.Период
| И ПервыеПериоды.Сделка = ВзаиморасчетыОиО.Сделка
| И ПервыеПериоды.ДоговорКонтрагента = ВзаиморасчетыОиО.ДоговорКонтрагента
| ЛЕВОЕ СОЕДИНЕНИЕ
| ( ВЫБРАТЬ ВзаиморасчетыОиО2.Регистратор
| , ВзаиморасчетыОиО2.ДоговорКонтрагента
| , ВзаиморасчетыОиО2.Сделка
| , ВзаиморасчетыОиО2.Период
| , ВзаиморасчетыОиО2.СуммаВзаиморасчетовПриход
| ИЗ ВзаиморасчетыСКонтрагентамиОборотыНаДатуКон КАК ВзаиморасчетыОиО2
| ОБЪЕДИНИТЬ
| ВЫБРАТЬ ВзаиморасчетыПоДок.Регистратор
| , ВзаиморасчетыПоДок.ДоговорКонтрагента
| , ВзаиморасчетыПоДок.ДокументРасчетовСКонтрагентом
| , ВзаиморасчетыПоДок.Период
| , ВзаиморасчетыПоДок.СуммаВзаиморасчетовПриход
| ИЗ ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОборотыНаДатуКон КАК ВзаиморасчетыПоДок
| ) КАК ВзаиморасчетыОиО2
| ПО ВзаиморасчетыОиО2.Сделка = ВзаиморасчетыОиО.Сделка
| И ВзаиморасчетыОиО2.ДоговорКонтрагента = ВзаиморасчетыОиО.ДоговорКонтрагента
| И (//ВзаиморасчетыОиО.Период < ВзаиморасчетыОиО2.Период ИЛИ
| ВзаиморасчетыОиО.Период = ВзаиморасчетыОиО2.Период И ВзаиморасчетыОиО.Регистратор < ВзаиморасчетыОиО2.Регистратор)
|СГРУППИРОВАТЬ ПО
| ВзаиморасчетыОиО.ДоговорКонтрагента,
| ВзаиморасчетыОиО.Сделка,
| ВзаиморасчетыОиО.Период,
| ПервыеПериоды.СуммаВалОстаток
| ИМЕЮЩИЕ
|СУММА(ВЫБОР
| КОГДА (ВзаиморасчетыОиО2.СуммаВзаиморасчетовПриход) ЕСТЬ NULL
| ТОГДА 0
| ИНАЧЕ ВзаиморасчетыОиО2.СуммаВзаиморасчетовПриход
| КОНЕЦ) < ПервыеПериоды.СуммаВалОстаток
|";
ТекстВложенногоЗапросаПоНеоплаченнымДокументамНаДатуНач = СтрЗаменить(ТекстВложенногоЗапросаПоНеоплаченнымДокументамНаДатуКон, "ВзаиморасчетыСКонтрагентамиОборотыНаДатуКон", "ВзаиморасчетыСКонтрагентамиОборотыНаДатуНач");
ТекстВложенногоЗапросаПоНеоплаченнымДокументамНаДатуНач = СтрЗаменить(ТекстВложенногоЗапросаПоНеоплаченнымДокументамНаДатуНач, "ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОборотыНаДатуКон", "ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОборотыНаДатуНач");
ТекстВложенногоЗапросаПоНеоплаченнымДокументамНаДатуНач = СтрЗаменить(ТекстВложенногоЗапросаПоНеоплаченнымДокументамНаДатуНач, "&ДатаКонОст", "&ДатаНачОст");
ТекстЗапроса = ТекстВрмТбл + "
|
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ПродажиСДатамиЦенИДатамиКурсов.СуммаПродажиОборот КАК СуммаПродажи,
| ПродажиСДатамиЦенИДатамиКурсов.КоличествоОборот КАК КоличествоОборот,
| ПродажиСДатамиЦенИДатамиКурсов.КоличествоОборот * ПродажиСДатамиЦенИДатамиКурсов.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ПродажиСДатамиЦенИДатамиКурсов.Номенклатура.ЕдиницаДляОтчетов.Коэффициент КАК КоличествоЕдиницДляОтчетовОборот,
| ПродажиСДатамиЦенИДатамиКурсов.СебестоимостьОборот КАК Себестоимость,
| ПродажиСДатамиЦенИДатамиКурсов.СуммаПродажиОборот - ПродажиСДатамиЦенИДатамиКурсов.СебестоимостьОборот КАК Маржа,
| ПродажиСДатамиЦенИДатамиКурсов.СуммаПродажиОборот - ПродажиСДатамиЦенИДатамиКурсов.СебестоимостьОборот КАК ЧистаяМаржа,
| 0 КАК СуммаЗатрат,
| РСЦеныКомпании.Цена * ПродажиСДатамиЦенИДатамиКурсов.КоличествоОборот * ПродажиСДатамиЦенИДатамиКурсов.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / РСЦеныКомпании.ЕдиницаИзмерения.Коэффициент * РСКурсыВалютыЦен.Курс / РСКурсыВалютыЦен.Кратность * РСКурсыВалютыУпрУчета.Кратность / РСКурсыВалютыУпрУчета.Курс * &КоэффициентОтБазовогоТипа КАК ПлановаяСебестоимость,
| ПродажиСДатамиЦенИДатамиКурсов.СуммаПродажиОборот - РСЦеныКомпании.Цена * ПродажиСДатамиЦенИДатамиКурсов.КоличествоОборот * ПродажиСДатамиЦенИДатамиКурсов.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / РСЦеныКомпании.ЕдиницаИзмерения.Коэффициент * РСКурсыВалютыЦен.Курс / РСКурсыВалютыЦен.Кратность * РСКурсыВалютыУпрУчета.Кратность / РСКурсыВалютыУпрУчета.Курс * &КоэффициентОтБазовогоТипа КАК ПлановаяПрибыль,
| ПродажиСДатамиЦенИДатамиКурсов.Регистратор КАК ДокументРеализации,
| ПродажиСДатамиЦенИДатамиКурсов.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| ПродажиСДатамиЦенИДатамиКурсов.Подразделение КАК Подразделение,
| ПродажиСДатамиЦенИДатамиКурсов.ЗаказПокупателя КАК ЗаказПокупателя,
| ПродажиСДатамиЦенИДатамиКурсов.ДоговорВзаиморасчетовПокупателя КАК ДоговорВзаиморасчетовПокупателя,
| ПродажиСДатамиЦенИДатамиКурсов.ЗаказПокупателя.Ответственный КАК Ответственный,
| ПродажиСДатамиЦенИДатамиКурсов.Номенклатура КАК Номенклатура,
| ПродажиСДатамиЦенИДатамиКурсов.Контрагент КАК Покупатель
|{ВЫБРАТЬ
| СуммаПродажи,
| КоличествоОборот,
| КоличествоЕдиницДляОтчетовОборот,
| Себестоимость,
| Маржа,
| ЧистаяМаржа,
| СуммаЗатрат,
| ПлановаяСебестоимость,
| ПлановаяПрибыль,
| ДокументРеализации.*,
| ХарактеристикаНоменклатуры.*,
| ЗаказПокупателя.*,
| Ответственный.*,
| ДоговорВзаиморасчетовПокупателя.*,
| Покупатель.*,
| Подразделение.*,
| Номенклатура.*,
| ПродажиСДатамиЦенИДатамиКурсов.ДокументПродажи.*}
|ИЗ (
|ВЫБРАТЬ
| ПродажиОбороты.СтоимостьОборот*ДопКоэффициент КАК СуммаПродажиОборот,
| (ВЫБОР КОГДА (ПродажиСебестоимостьОбороты.СтоимостьОборот) ЕСТЬ NULL ТОГДА 0 ИНАЧЕ ПродажиСебестоимостьОбороты.СтоимостьОборот КОНЕЦ + ВЫБОР КОГДА (ПродажиСебестоимостьКорректировка.Стоимость) ЕСТЬ NULL ТОГДА 0 ИНАЧЕ ПродажиСебестоимостьКорректировка.Стоимость КОНЕЦ)*ДопКоэффициент КАК СебестоимостьОборот,
| ПродажиОбороты.КоличествоОборот*ДопКоэффициент КАК КоличествоОборот,
| ПродажиОбороты.Регистратор,
| ПродажиОбороты.Номенклатура,
| ПродажиОбороты.ХарактеристикаНоменклатуры,
| ПродажиОбороты.ДоговорКонтрагента КАК ДоговорВзаиморасчетовПокупателя,
| ПродажиОбороты.Контрагент,
| ПродажиОбороты.ЗаказПокупателя,
| ПродажиОбороты.Подразделение,
| ПродажиОбороты.ДокументПродажи,
| СписокРегистраторов.ДатаКурсаВалютыУпрУчета,
| МАКСИМУМ(РСЦеныКомпании.Период) КАК ДатаЦены,
| МАКСИМУМ(РСКурсыВалют.Период) КАК ДатаКурсаВалютыЦены
|ИЗ
| РегистрНакопления.Продажи.Обороты(, &ДатаКон, Регистратор,
| {Номенклатура.*, ХарактеристикаНоменклатуры.*, ЗаказПокупателя.*, Подразделение.*, ДоговорКонтрагента.* КАК ДоговорВзаиморасчетовПокупателя, Контрагент.* КАК Покупатель, ДокументПродажи.*}
| ) КАК ПродажиОбороты
// Ниже пошел запрос, отвечающий за передачу Продажам только тех регистраторов, которые оплатились
// в течение периода отчета.
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ОсновнаяТаблица.Регистратор,
| ОсновнаяТаблица.Сделка,
| МАКСИМУМ(ВЫБОР КОГДА
| ВЫБОР //документ не был оплаченным на ДатаНач
| КОГДА НеоплаченныеНаДатуКон.ДоговорКонтрагента ЕСТЬ НЕ NULL ТОГДА
| ОсновнаяТаблица.Период < НеоплаченныеНаДатуКон.Период
| ИЛИ ОсновнаяТаблица.Период = НеоплаченныеНаДатуКон.Период
| И ОсновнаяТаблица.Регистратор<НеоплаченныеНаДатуКон.ПервыйРегистратор
| ИНАЧЕ
| ОсновнаяТаблица.Период <= &КонДата
| КОНЕЦ
| И
| ВЫБОР //и стал оплаченным на ДатаКон
| КОГДА НеоплаченныеНаДатуНач.ДоговорКонтрагента ЕСТЬ НЕ NULL ТОГДА
| ОсновнаяТаблица.Период > НеоплаченныеНаДатуНач.Период
| ИЛИ ОсновнаяТаблица.Период = НеоплаченныеНаДатуНач.Период
| И ОсновнаяТаблица.Регистратор>=НеоплаченныеНаДатуНач.ПервыйРегистратор
| ИНАЧЕ
| ОсновнаяТаблица.Период >= &НачДата
| КОНЕЦ ТОГДА 1
| ИНАЧЕ -1 КОНЕЦ) КАК ДопКоэффициент,
| МАКСИМУМ(РСКВ.Период) КАК ДатаКурсаВалютыУпрУчета //это даты курсов
| ИЗ
| ( ВЫБРАТЬ ОсновнаяТаблица.Регистратор
| , ОсновнаяТаблица.ДоговорКонтрагента
| , ОсновнаяТаблица.Сделка
| , ОсновнаяТаблица.Период
| ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ОсновнаяТаблица
| ГДЕ НЕ ОсновнаяТаблица.ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентом
| ОБЪЕДИНИТЬ
| ВЫБРАТЬ ОсновнаяТаблицаДок.Регистратор
| , ОсновнаяТаблицаДок.ДоговорКонтрагента
| , ОсновнаяТаблицаДок.ДокументРасчетовСКонтрагентом
| , ОсновнаяТаблицаДок.Период
| ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов КАК ОсновнаяТаблицаДок
| ГДЕ ОсновнаяТаблицаДок.ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентом
| ) КАК ОсновнаяТаблица
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК РСКВ
| ПО РСКВ.Валюта = &ВалютаУпрУчета И РСКВ.Период<=ОсновнаяТаблица.Период
| ЛЕВОЕ СОЕДИНЕНИЕ ("+ТекстВложенногоЗапросаПоНеоплаченнымДокументамНаДатуКон+") КАК НеоплаченныеНаДатуКон
| ПО НеоплаченныеНаДатуКон.ДоговорКонтрагента = ОсновнаяТаблица.ДоговорКонтрагента
| И НеоплаченныеНаДатуКон.Сделка = ОсновнаяТаблица.Сделка
| ЛЕВОЕ СОЕДИНЕНИЕ ("+ТекстВложенногоЗапросаПоНеоплаченнымДокументамНаДатуНач+") КАК НеоплаченныеНаДатуНач
| ПО НеоплаченныеНаДатуНач.ДоговорКонтрагента = ОсновнаяТаблица.ДоговорКонтрагента
| И НеоплаченныеНаДатуНач.Сделка = ОсновнаяТаблица.Сделка
| ГДЕ
| ВЫБОР //документ не был оплаченным на ДатаНач
| КОГДА НеоплаченныеНаДатуКон.ДоговорКонтрагента ЕСТЬ НЕ NULL ТОГДА
| ОсновнаяТаблица.Период < НеоплаченныеНаДатуКон.Период
| ИЛИ ОсновнаяТаблица.Период = НеоплаченныеНаДатуКон.Период
| И ОсновнаяТаблица.Регистратор<НеоплаченныеНаДатуКон.ПервыйРегистратор
| ИНАЧЕ
| ОсновнаяТаблица.Период <= &КонДата
| КОНЕЦ
| И
| ВЫБОР //и стал оплаченным на ДатаКон
| КОГДА НеоплаченныеНаДатуНач.ДоговорКонтрагента ЕСТЬ НЕ NULL ТОГДА
| ОсновнаяТаблица.Период > НеоплаченныеНаДатуНач.Период
| ИЛИ ОсновнаяТаблица.Период = НеоплаченныеНаДатуНач.Период
| И ОсновнаяТаблица.Регистратор>=НеоплаченныеНаДатуНач.ПервыйРегистратор
| ИНАЧЕ
| ОсновнаяТаблица.Период >= &НачДата
| КОНЕЦ
| ИЛИ
| ВЫБОР //документ был оплаченным на ДатаНач, т.е. находился левее границы
| КОГДА НеоплаченныеНаДатуНач.ДоговорКонтрагента ЕСТЬ НЕ NULL ТОГДА
| ОсновнаяТаблица.Период < НеоплаченныеНаДатуНач.Период
| ИЛИ ОсновнаяТаблица.Период = НеоплаченныеНаДатуНач.Период
| И ОсновнаяТаблица.Регистратор<НеоплаченныеНаДатуНач.ПервыйРегистратор
| ИНАЧЕ
| ОсновнаяТаблица.Период < &НачДата
| КОНЕЦ
| И
| ВЫБОР //и стал НЕоплаченным на ДатаКон, т.е находится правее границы
| КОГДА НеоплаченныеНаДатуКон.ДоговорКонтрагента ЕСТЬ НЕ NULL ТОГДА
| ОсновнаяТаблица.Период > НеоплаченныеНаДатуКон.Период
| ИЛИ ОсновнаяТаблица.Период = НеоплаченныеНаДатуКон.Период
| И ОсновнаяТаблица.Регистратор>=НеоплаченныеНаДатуКон.ПервыйРегистратор
| ИНАЧЕ
| Ложь //этот вариант предполагает, что появились неоплаченные документы
| КОНЕЦ
| СГРУППИРОВАТЬ ПО
| ОсновнаяТаблица.Регистратор,
| ОсновнаяТаблица.Сделка
| ) КАК СписокРегистраторов
| ПО ПродажиОбороты.Регистратор = СписокРегистраторов.Регистратор
| И ВЫБОР КОГДА ПродажиОбороты.ДоговорКонтрагента.ВедениеВзаиморасчетов = ЗНАЧЕНИЕ(Перечисление.ВедениеВзаиморасчетовПоДоговорам.ПоЗаказам)
| ТОГДА ПродажиОбороты.ЗаказПокупателя = СписокРегистраторов.Сделка
| ИНАЧЕ ИСТИНА
| КОНЕЦ
// Себестоимость продаж, списываемая сразу
| ЛЕВОЕ СОЕДИНЕНИЕ
| (ВЫБРАТЬ СУММА(СтоимостьОборот) КАК СтоимостьОборот, Номенклатура, ХарактеристикаНоменклатуры, ЗаказПокупателя, Регистратор
| ИЗ РегистрНакопления.ПродажиСебестоимость.Обороты(,&ДатаКон,Регистратор) КАК ПродажиСебестоимость
| СГРУППИРОВАТЬ ПО Номенклатура, ХарактеристикаНоменклатуры, ЗаказПокупателя, Регистратор) ПродажиСебестоимостьОбороты
| ПО ПродажиОбороты.Регистратор = ПродажиСебестоимостьОбороты.Регистратор
| И ПродажиОбороты.Номенклатура = ПродажиСебестоимостьОбороты.Номенклатура
| И ПродажиОбороты.ХарактеристикаНоменклатуры = ПродажиСебестоимостьОбороты.ХарактеристикаНоменклатуры
| И ПродажиОбороты.ЗаказПокупателя = ПродажиСебестоимостьОбороты.ЗаказПокупателя
// Себестоимость продаж, списываемая при корректировке
| ЛЕВОЕ СОЕДИНЕНИЕ
| (ВЫБРАТЬ СУММА(Стоимость) КАК Стоимость, Номенклатура, ДокументДвижения, ХарактеристикаНоменклатуры, ЗаказПокупателя, Подразделение
| ИЗ РегистрНакопления.ПродажиСебестоимость КАК ПродажиСебестоимость
|// ГДЕ ПродажиСебестоимость.ДокументДвижения <> Неопределено
| СГРУППИРОВАТЬ ПО Номенклатура, ДокументДвижения, ХарактеристикаНоменклатуры, ЗаказПокупателя, Подразделение
| ) ПродажиСебестоимостьКорректировка
| ПО ПродажиСебестоимостьКорректировка.Номенклатура = ПродажиОбороты.Номенклатура
| И ПродажиСебестоимостьКорректировка.ХарактеристикаНоменклатуры = ПродажиОбороты.ХарактеристикаНоменклатуры
| И ПродажиСебестоимостьКорректировка.ДокументДвижения = ПродажиОбороты.Регистратор
| И ПродажиСебестоимостьКорректировка.ЗаказПокупателя = ПродажиОбороты.ЗаказПокупателя
| И ПродажиСебестоимостьКорректировка.Подразделение = ПродажиОбороты.Подразделение
// ...
// Цены для плановой себестоимости
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК РСЦеныКомпании
| ПО РСЦеныКомпании.ТипЦен = &ТипЦенПлановойСебестоимости
| И ПродажиОбороты.Номенклатура = РСЦеныКомпании.Номенклатура
| И ПродажиОбороты.ХарактеристикаНоменклатуры = РСЦеныКомпании.ХарактеристикаНоменклатуры
| И РСЦеныКомпании.Период<=ПродажиОбороты.Период
// Курсы валют для плановой себестоимости
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК РСКурсыВалют
| ПО РСКурсыВалют.Валюта = РСЦеныКомпании.Валюта
| И РСКурсыВалют.Период<=РСЦеныКомпании.Период
|СГРУППИРОВАТЬ ПО
| ПродажиОбороты.СтоимостьОборот*ДопКоэффициент,
| (ВЫБОР КОГДА (ПродажиСебестоимостьОбороты.СтоимостьОборот) ЕСТЬ NULL ТОГДА 0 ИНАЧЕ ПродажиСебестоимостьОбороты.СтоимостьОборот КОНЕЦ + ВЫБОР КОГДА (ПродажиСебестоимостьКорректировка.Стоимость) ЕСТЬ NULL ТОГДА 0 ИНАЧЕ ПродажиСебестоимостьКорректировка.Стоимость КОНЕЦ)*ДопКоэффициент,
| ПродажиОбороты.КоличествоОборот*ДопКоэффициент,
| ПродажиОбороты.Регистратор,
| ПродажиОбороты.Номенклатура,
| ПродажиОбороты.ХарактеристикаНоменклатуры,
| ПродажиОбороты.Контрагент,
| ПродажиОбороты.ДоговорКонтрагента,
| ПродажиОбороты.ЗаказПокупателя,
| ПродажиОбороты.Подразделение,
| ПродажиОбороты.ДокументПродажи,
| СписокРегистраторов.ДатаКурсаВалютыУпрУчета
|) КАК ПродажиСДатамиЦенИДатамиКурсов
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК РСЦеныКомпании
| ПО РСЦеныКомпании.ТипЦен = &ТипЦенПлановойСебестоимости
| И РСЦеныКомпании.Период = ПродажиСДатамиЦенИДатамиКурсов.ДатаЦены
| И РСЦеныКомпании.Номенклатура = ПродажиСДатамиЦенИДатамиКурсов.Номенклатура
| И РСЦеныКомпании.ХарактеристикаНоменклатуры = ПродажиСДатамиЦенИДатамиКурсов.ХарактеристикаНоменклатуры
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК РСКурсыВалютыУпрУчета
| ПО РСКурсыВалютыУпрУчета.Период = ПродажиСДатамиЦенИДатамиКурсов.ДатаКурсаВалютыУпрУчета
| И РСКурсыВалютыУпрУчета.Валюта = &ВалютаУпрУчета
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК РСКурсыВалютыЦен
| ПО РСКурсыВалютыЦен.Валюта = РСЦеныКОмпании.Валюта
| И РСКурсыВалютыЦен.Период = ПродажиСДатамиЦенИДатамиКурсов.ДатаКурсаВалютыЦены
|{ГДЕ
| ПродажиСДатамиЦенИДатамиКурсов.Подразделение.* КАК Подразделение,
| ПродажиСДатамиЦенИДатамиКурсов.ЗаказПокупателя.Ответственный.* КАК Ответственный,
| ПродажиСДатамиЦенИДатамиКурсов.ДоговорВзаиморасчетовПокупателя.Владелец.* КАК Покупатель,
| ПродажиСДатамиЦенИДатамиКурсов.ДоговорВзаиморасчетовПокупателя.* КАК ДоговорВзаиморасчетовПокупателя,
| ПродажиСДатамиЦенИДатамиКурсов.ЗаказПокупателя.* КАК ЗаказПокупателя,
| ПродажиСДатамиЦенИДатамиКурсов.Номенклатура.* КАК Номенклатура,
| ПродажиСДатамиЦенИДатамиКурсов.СуммаПродажиОборот КАК СуммаПродажи,
| ПродажиСДатамиЦенИДатамиКурсов.КоличествоОборот КАК КоличествоОборот,
| ПродажиСДатамиЦенИДатамиКурсов.КоличествоОборот * ПродажиСДатамиЦенИДатамиКурсов.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ПродажиСДатамиЦенИДатамиКурсов.Номенклатура.ЕдиницаДляОтчетов.Коэффициент КАК КоличествоЕдиницДляОтчетовОборот,
| ПродажиСДатамиЦенИДатамиКурсов.СебестоимостьОборот КАК Себестоимость,
| ПродажиСДатамиЦенИДатамиКурсов.СуммаПродажиОборот - ПродажиСДатамиЦенИДатамиКурсов.СебестоимостьОборот КАК Маржа,
| ПродажиСДатамиЦенИДатамиКурсов.СуммаПродажиОборот - ПродажиСДатамиЦенИДатамиКурсов.СебестоимостьОборот КАК ЧистаяМаржа,
| 0 КАК СуммаЗатрат,
| РСЦеныКомпании.Цена * ПродажиСДатамиЦенИДатамиКурсов.КоличествоОборот * ПродажиСДатамиЦенИДатамиКурсов.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / РСЦеныКомпании.ЕдиницаИзмерения.Коэффициент * РСКурсыВалютыЦен.Курс / РСКурсыВалютыЦен.Кратность * РСКурсыВалютыУпрУчета.Кратность / РСКурсыВалютыУпрУчета.Курс * &КоэффициентОтБазовогоТипа КАК ПлановаяСебестоимость,
| ПродажиСДатамиЦенИДатамиКурсов.СуммаПродажиОборот - РСЦеныКомпании.Цена * ПродажиСДатамиЦенИДатамиКурсов.КоличествоОборот * ПродажиСДатамиЦенИДатамиКурсов.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / РСЦеныКомпании.ЕдиницаИзмерения.Коэффициент * РСКурсыВалютыЦен.Курс / РСКурсыВалютыЦен.Кратность * РСКурсыВалютыУпрУчета.Кратность / РСКурсыВалютыУпрУчета.Курс * &КоэффициентОтБазовогоТипа КАК ПлановаяПрибыль
| //СВОЙСТВА
| //КАТЕГОРИИ
|}
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ
| 0 КАК СуммаПродажи,
| 0 КАК КоличествоОборот,
| 0 КАК КоличествоЕдиницДляОтчетовОборот,
| 0 КАК Себестоимость,
| 0 КАК МАРЖА,
| -ЗатратыОбороты.СуммаОборот КАК ЧистаяМаржа,
| ЗатратыОбороты.СуммаОборот КАК СуммаЗатрат,
| 0 КАК ПлановаяСебестоимость,
| 0 КАК ПлановаяПрибыль,
| ЗатратыОбороты.Регистратор КАК ДокументРеализации,
| NULL КАК ХарактеристикаНоменклатуры,
| ЗатратыОбороты.Подразделение КАК Подразделение,
| ЗатратыОбороты.Заказ КАК ЗаказПокупателя,
| ЗатратыОбороты.Заказ.ДоговорКонтрагента КАК ДоговорВзаиморасчетовПокупателя,
| ЗатратыОбороты.Заказ.Ответственный КАК Ответственный,
| ЗатратыОбороты.СтатьяЗатрат КАК Номенклатура,
| ЗатратыОбороты.Заказ.Контрагент КАК Покупатель
|{ВЫБРАТЬ
| СуммаПродажи,
| КоличествоОборот,
| КоличествоЕдиницДляОтчетовОборот,
| Себестоимость,
| Маржа,
| ЧистаяМаржа,
| СуммаЗатрат,
| ПлановаяСебестоимость,
| ПлановаяПрибыль,
| ДокументРеализации.*,
| ХарактеристикаНоменклатуры.*,
| Покупатель.*,
| ЗаказПокупателя.*,
| ДоговорВзаиморасчетовПокупателя,
| Ответственный.*,
| Подразделение.*,
| Номенклатура.*}
|ИЗ РегистрНакопления.Затраты.Обороты(&ДатаНач, &ДатаКон, Регистратор {&Периодичность}, Заказ <> НЕОПРЕДЕЛЕНО) КАК ЗатратыОбороты
|{ГДЕ
| ЗатратыОбороты.Подразделение.* КАК Подразделение,
| ЗатратыОбороты.Заказ.Ответственный.* КАК Ответственный,
| ЗатратыОбороты.Заказ.Контрагент.* КАК Покупатель,
| ЗатратыОбороты.Заказ.ДоговорКонтрагента.* КАК ДоговорВзаиморасчетовПокупателя,
| ЗатратыОбороты.Заказ.* КАК ЗаказПокупателя,
| ЗатратыОбороты.СтатьяЗатрат КАК Номенклатура,
| 0 КАК СуммаПродажи,
| 0 КАК КоличествоОборот,
| 0 КАК КоличествоЕдиницДляОтчетовОборот,
| 0 КАК Себестоимость,
| 0 КАК МАРЖА,
| -ЗатратыОбороты.СуммаОборот КАК ЧистаяМаржа,
| ЗатратыОбороты.СуммаОборот КАК СуммаЗатрат,
| 0 КАК ПлановаяСебестоимость,
| 0 КАК ПлановаяПрибыль
| //СВОЙСТВА
| //КАТЕГОРИИ
|}
|{УПОРЯДОЧИТЬ ПО
| ЗаказПокупателя.*,
| Подразделение.*,
| Покупатель.*,
| Ответственный.*,
| Номенклатура.*,
| СуммаПродажи,
| КоличествоОборот,
| КоличествоЕдиницДляОтчетовОборот,
| Себестоимость,
| Маржа,
| ЧистаяМаржа,
| СуммаЗатрат,
| ПлановаяСебестоимость,
| ПлановаяПрибыль
| //СВОЙСТВА
|}
|ИТОГИ
| СУММА(СуммаПродажи),
| СУММА(КоличествоОборот),
| СУММА(КоличествоЕдиницДляОтчетовОборот),
| СУММА(Себестоимость),
| СУММА(Маржа),
| СУММА(ЧистаяМаржа),
| СУММА(СуммаЗатрат),
| СУММА(ПлановаяСебестоимость),
| СУММА(ПлановаяПрибыль)
|
|ПО ОБЩИЕ
|
|{ИТОГИ ПО
| ЗаказПокупателя.*,
| Подразделение.*,
| Покупатель.*,
| Ответственный.*,
| Номенклатура.*
| //СВОЙСТВА
|}
|";
ПоказатьНайденные решения
1. Так как запрос динамически меняется, ставите в отладчике точку остановки после текста запроса на операторе: Запрос.Выполнить() или Запрос.ВыполнитьПакет().
2. Смотрите значение переменной в отладчике Запрос.Текст и значения переменных Запрос.Параметры если таковые есть. Можете скопировать этот текст в Консоль запросов.
3. В консоли запросов управляемого приложения можете выполнить текст запроса со всеми промежуточными таблицами и посмотреть в них данные. Также в консоли запросов можно менять запрос или устанавливать дополнительные параметры и смотреть что будет получаться.
4. Советую в запросе наложить фильтр по договору иначе Вы утонете в данных и таблицах если в базе много контрагентов, договоров и документов.
5. Вообще советую при анализе запроса держать в голове для чего Вы этот анализ хотите сделать, какую задачу решить, как правильно заметил выше пользователь "TokarevV. А" пытаться анализировать такой запрос бесцельно - это потеря времени.
2. Смотрите значение переменной в отладчике Запрос.Текст и значения переменных Запрос.Параметры если таковые есть. Можете скопировать этот текст в Консоль запросов.
3. В консоли запросов управляемого приложения можете выполнить текст запроса со всеми промежуточными таблицами и посмотреть в них данные. Также в консоли запросов можно менять запрос или устанавливать дополнительные параметры и смотреть что будет получаться.
4. Советую в запросе наложить фильтр по договору иначе Вы утонете в данных и таблицах если в базе много контрагентов, договоров и документов.
5. Вообще советую при анализе запроса держать в голове для чего Вы этот анализ хотите сделать, какую задачу решить, как правильно заметил выше пользователь "TokarevV. А" пытаться анализировать такой запрос бесцельно - это потеря времени.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(4) Очередной ленивец ,который работать не хочет.
По-теме: в запросе данные выгружаются в виртуальные таблицы, из которых потом данные повторно используются. Набор данных там небольшой, но много раз повторяется, поэтому - записывайте на листок и структурируйте. Позже, если поймете, сможете эти все "двадцать квадриллионов" строк держать в голове, как шаблон.
и ещё, для понимания всего этого, нужно знать архитектуру конфигурации и бизнес-процессы. Но вы же на всё готовы?
По-теме: в запросе данные выгружаются в виртуальные таблицы, из которых потом данные повторно используются. Набор данных там небольшой, но много раз повторяется, поэтому - записывайте на листок и структурируйте. Позже, если поймете, сможете эти все "двадцать квадриллионов" строк держать в голове, как шаблон.
и ещё, для понимания всего этого, нужно знать архитектуру конфигурации и бизнес-процессы. Но вы же на всё готовы?
1. Так как запрос динамически меняется, ставите в отладчике точку остановки после текста запроса на операторе: Запрос.Выполнить() или Запрос.ВыполнитьПакет().
2. Смотрите значение переменной в отладчике Запрос.Текст и значения переменных Запрос.Параметры если таковые есть. Можете скопировать этот текст в Консоль запросов.
3. В консоли запросов управляемого приложения можете выполнить текст запроса со всеми промежуточными таблицами и посмотреть в них данные. Также в консоли запросов можно менять запрос или устанавливать дополнительные параметры и смотреть что будет получаться.
4. Советую в запросе наложить фильтр по договору иначе Вы утонете в данных и таблицах если в базе много контрагентов, договоров и документов.
5. Вообще советую при анализе запроса держать в голове для чего Вы этот анализ хотите сделать, какую задачу решить, как правильно заметил выше пользователь "TokarevV. А" пытаться анализировать такой запрос бесцельно - это потеря времени.
2. Смотрите значение переменной в отладчике Запрос.Текст и значения переменных Запрос.Параметры если таковые есть. Можете скопировать этот текст в Консоль запросов.
3. В консоли запросов управляемого приложения можете выполнить текст запроса со всеми промежуточными таблицами и посмотреть в них данные. Также в консоли запросов можно менять запрос или устанавливать дополнительные параметры и смотреть что будет получаться.
4. Советую в запросе наложить фильтр по договору иначе Вы утонете в данных и таблицах если в базе много контрагентов, договоров и документов.
5. Вообще советую при анализе запроса держать в голове для чего Вы этот анализ хотите сделать, какую задачу решить, как правильно заметил выше пользователь "TokarevV. А" пытаться анализировать такой запрос бесцельно - это потеря времени.
(7)Добавлю.
К п1. в отладчике может быть не весь текст запроса, а только первые несколько тысяч символов. Один раз мне пришлось подписывать код сохранения текста запроса в текстовый файл: в блокноте увидел весь запрос.
Так как там куча временных таблиц: если нет МенеджерВременныхТаблиц - укажите. Можно будет посмотреть их в отладчике.
За п 5 - однозначно плюс.
К п1. в отладчике может быть не весь текст запроса, а только первые несколько тысяч символов. Один раз мне пришлось подписывать код сохранения текста запроса в текстовый файл: в блокноте увидел весь запрос.
Так как там куча временных таблиц: если нет МенеджерВременныхТаблиц - укажите. Можно будет посмотреть их в отладчике.
За п 5 - однозначно плюс.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот