Функция СформироватьОстПоГТДИзДругойБазы() //Описание алгоритма формирования запроса по месячно. //bkttl_vt.DATE - это всегда дата начала квартала за которое формируется таблица //Запрос осуществляется на дату, в целях оптимизации считаем так: //если запрос осуществляется на дату строго больше 15 числа месяца, тогда считаем от обратного //если дата запроса остатков совподает с последним днем квартала, то UNION ALL с таблицей движений не используется. ИБ=СоздатьОбъект("ODBCDataBase"); ИБ.ПрисоединитьИБ(ПутьКБазе,"Администратор","****"); Мета.ПрисоединитьМд(СокрЛП(ПутьКБазе)+"1cv7.md"); ЗапросОстатковГТД.УстБд(ИБ); ЗапросОстатковГТД.Отладка(1); //Сформируем переменные дат запроса Если ВыбДата = КонКвартала(ВыбДата) Тогда ДатаНачалаКвартала = ВыбДата + 1; Иначе ДатаНачалаКвартала = НачКвартала(ВыбДата); КонецЕсли; флСлМес = 0; Если ДатаЧисло(ВыбДата) > 15 Тогда //считаем от начала следущего месяца НачальнаяДатаТаблицыОборотов = ВыбДата + 1; КонечнаяДатаТаблицыОборотов = НачМесяца(ДобавитьМесяц(ВыбДата,1)); Если (ДатаМесяц(ВыбДата) = 3) или (ДатаМесяц(ВыбДата) = 6) или (ДатаМесяц(ВыбДата) = 9) или (ДатаМесяц(ВыбДата) = 12) Тогда СтрокаКоличествоОстаток = "CASE WHEN bkttl_vt.KIND = '3' THEN bkttl_vt.SD ELSE 0 END AS КоличествоОстаток"; ИначеЕсли (ДатаМесяц(ВыбДата) = 2) или (ДатаМесяц(ВыбДата) = 5) или (ДатаМесяц(ВыбДата) = 8) или (ДатаМесяц(ВыбДата) = 11) Тогда СтрокаКоличествоОстаток = "CASE WHEN bkttl_vt.KIND = '3' THEN bkttl_vt.SD+bkttl_vt.OBDT1-bkttl_vt.OBKT1+bkttl_vt.OBDT2-bkttl_vt.OBKT2 ELSE 0 END AS КоличествоОстаток"; Иначе СтрокаКоличествоОстаток = "CASE WHEN bkttl_vt.KIND = '3' THEN bkttl_vt.SD+bkttl_vt.OBDT1-bkttl_vt.OBKT1 ELSE 0 END AS КоличествоОстаток"; КонецЕсли; флСлМес = 1; Иначе //считаем текущий месяц НачальнаяДатаТаблицыОборотов = НачМесяца(ВыбДата); КонечнаяДатаТаблицыОборотов = ВыбДата + 1; Если (ДатаМесяц(ВыбДата) = 3) или (ДатаМесяц(ВыбДата) = 6) или (ДатаМесяц(ВыбДата) = 9) или (ДатаМесяц(ВыбДата) = 12) Тогда СтрокаКоличествоОстаток = "CASE WHEN bkttl_vt.KIND = '3' THEN bkttl_vt.SD+bkttl_vt.OBDT1-bkttl_vt.OBKT1+bkttl_vt.OBDT2-bkttl_vt.OBKT2 ELSE 0 END AS КоличествоОстаток"; ИначеЕсли (ДатаМесяц(ВыбДата) = 2) или (ДатаМесяц(ВыбДата) = 5) или (ДатаМесяц(ВыбДата) = 8) или (ДатаМесяц(ВыбДата) = 11) Тогда СтрокаКоличествоОстаток = "CASE WHEN bkttl_vt.KIND = '3' THEN bkttl_vt.SD+bkttl_vt.OBDT1-bkttl_vt.OBKT1 ELSE 0 END AS КоличествоОстаток"; Иначе СтрокаКоличествоОстаток = "CASE WHEN bkttl_vt.KIND = '3' THEN bkttl_vt.SD ELSE 0 END AS КоличествоОстаток"; КонецЕсли; КонецЕсли; //Если у нас дата равна концу квартала то UNION ALL не делаем //и не используем НачальнаяДатаТаблицыОборотов/КонечнаяДатаТаблицыОборотов Если ВыбДата = КонКвартала(ВыбДата) Тогда ТекстЗапроса = " |SELECT | ПС.SCHKOD As КодСчета |,БИ.Счет AS Счет_Ссылка |,БИ.Субконто1 AS Номенклатура_Ссылка |,СпрНоменклатура.CODE AS Номенклатура_КОД |,Спр.DESCR AS Наименование |,$Спр.СтранаПроисхождения AS СтранаПроисхождения |,БИ.КоличествоОстатокДт AS КонОстКол |FROM | ( | SELECT | Счет | ,Валюта | ,Субконто1,Субконто1_вид | ,Субконто2,Субконто2_вид | | ,SUM(КоличествоОстаток) КоличествоОстаток | ,CASE WHEN SUM(КоличествоОстаток) > 0 THEN SUM(КоличествоОстаток) ELSE 0 END КоличествоОстатокДт | ,CASE WHEN SUM(КоличествоОстаток) < 0 THEN -SUM(КоличествоОстаток) ELSE 0 END КоличествоОстатокКт | FROM ( | SELECT | bkttl_vt.ACCID Счет | ,bkttl_vt.CURRID Валюта | ,bkttl_vt.SC0 Субконто1 | ,bkttl_vt.VSC0 Субконто1_вид | ,bkttl_vt.SC1 Субконто2 | ,bkttl_vt.VSC1 Субконто2_вид | | ,CASE WHEN bkttl_vt.KIND = '3' THEN bkttl_vt.SD ELSE 0 END AS КоличествоОстаток | FROM _1SBKTTL bkttl_vt (nolock) | WHERE (bkttl_vt.DATE = :ДатаНачалаКвартала) | AND (bkttl_vt.KIND = '3') | ) AS accountingbalance | GROUP BY | Счет,Валюта | ,Субконто1,Субконто1_вид | ,Субконто2,Субконто2_вид | | HAVING (SUM(КоличествоОстаток) <> 0) |) AS БИ |LEFT JOIN _1SACCS AS ПС (nolock) |ON (ПС.ID = БИ.Счет) |LEFT JOIN $Справочник.Номенклатура AS СпрНоменклатура (nolock) |ON (СпрНоменклатура.ID = БИ.Субконто1) |LEFT JOIN $Справочник.ГТД AS Спр (nolock) |ON (Спр.ID = БИ.Субконто2) |WHERE (ПС.SCHKOD like 'ГТД%') AND (БИ.КоличествоОстатокДт <> 0) |ORDER BY СпрНоменклатура.CODE |"; Иначе ТекстЗапроса = " |SELECT | ПС.SCHKOD As КодСчета |,БИ.Счет AS Счет_Ссылка |,БИ.Субконто1 AS Номенклатура_Ссылка |,СпрНоменклатура.CODE AS Номенклатура_КОД |,Спр.DESCR AS Наименование |,$Спр.СтранаПроисхождения AS СтранаПроисхождения |,БИ.КоличествоОстатокДт AS КонОстКол |FROM | ( | SELECT | Счет | ,Валюта | ,Субконто1,Субконто1_вид | ,Субконто2,Субконто2_вид | | ,SUM(КоличествоОстаток) КоличествоОстаток | ,CASE WHEN SUM(КоличествоОстаток) > 0 THEN SUM(КоличествоОстаток) ELSE 0 END КоличествоОстатокДт | ,CASE WHEN SUM(КоличествоОстаток) < 0 THEN -SUM(КоличествоОстаток) ELSE 0 END КоличествоОстатокКт | FROM ( | SELECT | bkttl_vt.ACCID Счет | ,bkttl_vt.CURRID Валюта | ,bkttl_vt.SC0 Субконто1 | ,bkttl_vt.VSC0 Субконто1_вид | ,bkttl_vt.SC1 Субконто2 | ,bkttl_vt.VSC1 Субконто2_вид | | ,"+СтрокаКоличествоОстаток+" | FROM _1SBKTTL bkttl_vt (nolock) | WHERE (bkttl_vt.DATE = :ДатаНачалаКвартала) | AND (bkttl_vt.KIND = '3') | | | | UNION ALL | | SELECT | entry_vt.ACCDTID | ,CASE WHEN entry_vt.DTFLAGS & 1 = 1 THEN entry_vt.CURRID ELSE ' 0 ' END | ,entry_vt.DTSC0 | ,entry_vt.VDTSC0 | ,entry_vt.DTSC1 | ,entry_vt.VDTSC1 | | ,"+?(флСлМес=0,"entry_vt.AMOUNT","-entry_vt.AMOUNT")+" | FROM _1SENTRY entry_vt (nolock) | WHERE (entry_vt.DATE_TIME_DOCID >= '"+Формат(НачальнаяДатаТаблицыОборотов,"ДГГГГММДД")+" 0 0 ') | AND (entry_vt.DATE_TIME_DOCID < '"+Формат(КонечнаяДатаТаблицыОборотов,"ДГГГГММДД")+" 0 0 ') | AND (entry_vt.ACTIVE = ' ') | | | AND (entry_vt.PROVKIND <> 'K') | | UNION ALL | | SELECT | entry_vt.ACCKTID | ,CASE WHEN entry_vt.KTFLAGS & 1 = 1 THEN entry_vt.CURRID ELSE ' 0 ' END | ,entry_vt.KTSC0 | ,entry_vt.VKTSC0 | ,entry_vt.KTSC1 | ,entry_vt.VKTSC1 | | ,"+?(флСлМес=0,"-entry_vt.AMOUNT","entry_vt.AMOUNT")+" | FROM _1SENTRY entry_vt (nolock) | WHERE (entry_vt.DATE_TIME_DOCID >= '"+Формат(НачальнаяДатаТаблицыОборотов,"ДГГГГММДД")+" 0 0 ') | AND (entry_vt.DATE_TIME_DOCID < '"+Формат(КонечнаяДатаТаблицыОборотов,"ДГГГГММДД")+" 0 0 ') | AND (entry_vt.ACTIVE = ' ') | | | AND (entry_vt.PROVKIND <> 'D') | | ) AS accountingbalance | GROUP BY | Счет,Валюта | ,Субконто1,Субконто1_вид | ,Субконто2,Субконто2_вид | | HAVING (SUM(КоличествоОстаток) <> 0) |) AS БИ |LEFT JOIN _1SACCS AS ПС (nolock) |ON (ПС.ID = БИ.Счет) |LEFT JOIN $Справочник.Номенклатура AS СпрНоменклатура (nolock) |ON (СпрНоменклатура.ID = БИ.Субконто1) |LEFT JOIN $Справочник.ГТД AS Спр (nolock) |ON (Спр.ID = БИ.Субконто2) |WHERE (ПС.SCHKOD like 'ГТД%') AND (БИ.КоличествоОстатокДт <> 0) |ORDER BY СпрНоменклатура.CODE |"; КонецЕсли; итТз = СоздатьОбъект("ИндексированнаяТаблица"); ЗапросОстатковГТД.УстановитьТекстовыйПараметр("ДатаНачалаКвартала",ДатаНачалаКвартала); ЗапросОстатковГТД.УстановитьТекстовыйПараметр("НачальнаяДатаТаблицыОборотов",НачальнаяДатаТаблицыОборотов); ЗапросОстатковГТД.УстановитьТекстовыйПараметр("КонечнаяДатаТаблицыОборотов",КонечнаяДатаТаблицыОборотов); ЗапросОстатковГТД.ВыполнитьИнструкцию(ТекстЗапроса,итТз); итТз.Показать(); КонецФункции