Оптимизация кода

1. kar911 14.02.17 22:22 Сейчас в теме
Помогите оптимизировать код

&НаСервере
Процедура Проверка()Экспорт 
		
	Запрос = новый Запрос("ВЫБРАТЬ
	                      |	СУММА(ХозрасчетныйДвиженияССубконто.Сумма) - ВложенныйЗапрос.ОплаченоОстаток КАК Разность,
	                      |	ВложенныйЗапрос.Реализация КАК Реализация,
	                      |	ВложенныйЗапрос.ОплаченоОстаток КАК ОплаченоОстаток,
	                      |	СУММА(ХозрасчетныйДвиженияССубконто.Сумма) КАК Сумма,
	                      |	РАЗНОСТЬДАТ(ВложенныйЗапрос.Реализация.Дата, &Дата, ДЕНЬ) КАК КоличествоДней,
	                      |	ВложенныйЗапрос.Реализация.Контрагент КАК Контрагент,
	                      |	ВложенныйЗапрос.Реализация.СуммаДокумента КАК СуммаДокумента,
	                      |	МЕСЯЦ(ВложенныйЗапрос.Реализация.Дата) + 1 КАК Месяц,
	                      |	ГОД(ВложенныйЗапрос.Реализация.Дата) КАК Год,
	                      |	0 КАК ВыставлятьЧерез,
						  |	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК Дата60Дней,
	                      |	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК ДатаОплаты
	                      |ИЗ
	                      |	РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК ХозрасчетныйДвиженияССубконто
	                      |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
	                      |			ОплатыЭСЧФОстатки.Реализация КАК Реализация,
	                      |			ОплатыЭСЧФОстатки.ОплаченоОстаток КАК ОплаченоОстаток
	                      |		ИЗ
	                      |			РегистрНакопления.ОплатыЭСЧФ.Остатки КАК ОплатыЭСЧФОстатки
	                      |		ГДЕ
	                      |			ОплатыЭСЧФОстатки.ОстатокОплатыОстаток > 0) КАК ВложенныйЗапрос
	                      |		ПО ХозрасчетныйДвиженияССубконто.СубконтоКт3 = ВложенныйЗапрос.Реализация
	                      |
	                      |СГРУППИРОВАТЬ ПО
	                      |	ВложенныйЗапрос.ОплаченоОстаток,
	                      |	ВложенныйЗапрос.Реализация,
	                      |	РАЗНОСТЬДАТ(ВложенныйЗапрос.Реализация.Дата, &Дата, ДЕНЬ),
	                      |	ВложенныйЗапрос.Реализация.Контрагент,
	                      |	ВложенныйЗапрос.Реализация.СуммаДокумента,
	                      |	МЕСЯЦ(ВложенныйЗапрос.Реализация.Дата) + 1,
	                      |	ГОД(ВложенныйЗапрос.Реализация.Дата)
	                      |
	                      |УПОРЯДОЧИТЬ ПО
	                      |	Сумма,
	                      |	Реализация,
	                      |	КоличествоДней,
	                      |	Контрагент,
	                      |	Разность,
	                      |	ОплаченоОстаток,
	                      |	СуммаДокумента");
	Запрос2 = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1
	                       |	ХозрасчетныйДвиженияССубконто.Регистратор
	                       |ИЗ
	                       |	РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК ХозрасчетныйДвиженияССубконто
	                       |ГДЕ
	                       |	ХозрасчетныйДвиженияССубконто.СубконтоКт3 = &СубконтоКт3");					  
	Запрос.УстановитьПараметр("Дата",ТекущаяДата());					  
	Регистр = РегистрыСведений.ПроверкаЭСЧФ.СоздатьНаборЗаписей();
	Запись = Регистр.Добавить();
	Запись.Период = ТекущаяДата();
	Таблица = Запрос.Выполнить().Выгрузить();
	Таблица.Колонки.Добавить("ДокументПоступления");
	Для каждого строка из Таблица Цикл
		Запрос2.УстановитьПараметр("СубконтоКт3",Строка.Реализация);
		Выборка = Запрос2.Выполнить().Выбрать();
		Поступление = Документы.ПоступлениеНаРасчетныйСчет.ПустаяСсылка();
		Пока Выборка.Следующий() Цикл
			Поступление = Выборка.Регистратор;	
		КонецЦикла;
		Строка.ДокументПоступления = Поступление;
		Дата = Строка.Реализация.Дата;
		Дата10Числа = Дата(Строка(Формат(Строка.Год,"ЧГ=0"))+?(СтрДлина(Строка(Строка.Месяц))=1,"0"+Строка(Строка.Месяц),Строка(Строка.Месяц))+"10");
		Если не Строка.Разность=0 тогда
			ДатаПоступленияСредств = ((Строка.ДокументПоступления.Дата+172800)-ТекущаяДата())/86400;
			//Выставление в течение дней оплаты
			Если ТекущаяДата()>=НачалоДня(Дата+5184000) тогда
				Строка.КоличествоДней = ДатаПоступленияСредств;
				Строка.ДатаОплаты = ((Строка.ДокументПоступления.Дата+172800));
			Иначе
				Если ТекущаяДата() < Дата10Числа тогда
					Строка.КоличествоДней = (Дата10Числа-ТекущаяДата())/86400;		
				Иначе
					Строка.КоличествоДней = ДатаПоступленияСредств;
					Строка.ДатаОплаты = ((Строка.ДокументПоступления.Дата+172800));
				КонецЕсли;
			КонецЕсли;	
		Иначе
			//Количество Дней до оплаты
			Если ТекущаяДата()>=НачалоДня(Дата+5184000) тогда
				ДатаПоступленияСредств = ((Строка.ДокументПоступления.Дата+172800)-ТекущаяДата())/86400;
				Строка.КоличествоДней = ДатаПоступленияСредств;
				Строка.ДатаОплаты = ((Строка.ДокументПоступления.Дата+172800));
			Иначе
				Строка.Дата60Дней = Дата+5184000;
				Строка.КоличествоДней = 0;
				Строка.ВыставлятьЧерез = (Дата+5184000-ТекущаяДата())/86400;
			КонецЕсли;
		КонецЕсли;	
			
	КонецЦикла;	
	Таблица.Индексы.Добавить("Разность,Реализация,ОплаченоОстаток,Сумма,КоличествоДней,Контрагент,СуммаДокумента");
	Запись.ТаблицаЗначений = Новый ХранилищеЗначения(Таблица);
	Регистр.Записать();
	
КонецПроцедуры
Показать
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
13. karpik666 3775 15.02.17 15:17 Сейчас в теме
(1) через точку в запросе можно обращаться, если реквизит один, поэтому в данном случае нужно сделать внутреннее соединение с реализацией, плюс в регистре хозрасчетный нужно днлать скорее отбор по счетам, так как не у всех счетов есть 3е субконто с типом реализация
+
2. shurikvz 14.02.17 23:30 Сейчас в теме
1. В коде, убрать везде функцию ТекущаяДата(). Получить текущую дату один раз в переменную и дальше по коду использовать только эту переменную.

2. Дата10Числа = Дата(Строка(Формат(Строка.Год,"ЧГ=0"))+?(СтрДлина(Строка(Строка.Месяц))=1,"0"+Строка(Строка.Месяц),Строка(Строка.Месяц))+"10");
это что? почему нельзя сразу в запросе посчитать?

3. Дата = Строка.Реализация.Дата; Строка.ДокументПоступления.Дата и т.п.
Дату что нельзя получить прямо в запросе? Зачем базу данных в цикле дергать?

4. ТекущаяДата()>=НачалоДня(Дата+5184000) и т.п.
Насчет ТекущаяДата() - см. п.1 Насчет сложения - нафига это делать в цикле, в запросе нельзя сразу получить то, что нужно? Там куча сложений-вычитаний с одинаковыми числами. Задать их в начале кода в переменных, передать переменные в запрос, и вычислить все что нужно в момент выполнения запроса.

5. Запрос2. Почему условие не в параметрах виртуальной таблицы?

6. Сама необходимость наличия запрос2. Сначала в первом запросе получаем реализацию, потом вторым запросом получаем регистратор по этой реализации по условию нахождения ее на субконто3. Нельзя ли все что нужно в одном запросе получить? опять таки - зачем базу данных в цикле еще раз дергать?

7. Регистр.Записать() в попытку.

8. обоснованность хранения ТаблицаЗначений в ресурсе типа хранилище значения (учитывая то, что судя по коду - в ТЗ ссылочные типы).
+
3. kar911 14.02.17 23:39 Сейчас в теме
(2) со 2 по 6 пункты я с тобой согласен пробовал засовывать в запрос но нечего у меня не вышло то выдавало ошибку с датами когда к дате прибавлял значение то после выполнения запроса выдавало пустую таблицу.

8 пункт не очень понял
+
4. shurikvz 15.02.17 00:14 Сейчас в теме
(3)
8 пункт не очень понял

При подобном способе хранения как будет контролироваться ссылочная целостность?
+
5. kar911 15.02.17 00:22 Сейчас в теме
(4) принципе не как но это вроде и ненужно просто эти данные будут часто обновляться
+
6. kar911 15.02.17 00:29 Сейчас в теме
(2)помоги правильно составить запрос
+
7. signum2009 1029 15.02.17 09:02 Сейчас в теме
в дополнение к вышесказанному)
1) текущую дату лучше вообще вывести в параметры процедуры Проверка()
2) обход выборки лучше делать через выборку
+
8. signum2009 1029 15.02.17 09:08 Сейчас в теме
3) Вместо вложенного запроса сделать временную таблицу
4) Остаток в запросе лучше получать на какой-то момент времени
+
9. KazanKokos 10 15.02.17 09:10 Сейчас в теме
выход один: запрос оптимизировать.
+
10. kar911 15.02.17 09:17 Сейчас в теме
(9)
запрос оптимизировать

ну в принципе да но с запросами у меня вообще что то не получаеться
+
11. user633533_encantado 11 15.02.17 09:52 Сейчас в теме
(10) Например так, только замени регистры в запросе на свои:

Запрос = новый Запрос("ВЫБРАТЬ
                        |	ОплатыЭСЧФОстатки.ЗаказПоставщику КАК Реализация,
                        |	ОплатыЭСЧФОстатки.ОплачиваетсяОстаток КАК ОплаченоОстаток,
                        |	ВЫРАЗИТЬ(ОплатыЭСЧФОстатки.ЗаказПоставщику КАК Документ.ПоступлениеТоваровУслуг).Контрагент КАК Контрагент,
                        |	ВЫРАЗИТЬ(ОплатыЭСЧФОстатки.ЗаказПоставщику КАК Документ.ПоступлениеТоваровУслуг).СуммаДокумента КАК СуммаДокумента,
                        |	ВЫРАЗИТЬ(ОплатыЭСЧФОстатки.ЗаказПоставщику КАК Документ.ПоступлениеТоваровУслуг).Дата КАК Дата
                        |ПОМЕСТИТЬ ВТ_ОплатыОстатки
                        |ИЗ
                        |	РегистрНакопления.РасчетыСПоставщиками.Остатки КАК ОплатыЭСЧФОстатки
                        |ГДЕ
                        |	ОплатыЭСЧФОстатки.ОплачиваетсяОстаток > 0
                        |;
                        |
                        |////////////////////////////////////////////////////////////­////////////////////
                        |ВЫБРАТЬ
                        |	СУММА(ХозрасчетныйДвиженияССубконто.Сумма) - ВТ_ОплатыОстатки.ОплаченоОстаток КАК Разность,
                        |	ВТ_ОплатыОстатки.Реализация КАК Реализация,
                        |	ВТ_ОплатыОстатки.ОплаченоОстаток КАК ОплаченоОстаток,
                        |	СУММА(ХозрасчетныйДвиженияССубконто.Сумма) КАК Сумма,
                        |	РАЗНОСТЬДАТ(ВТ_ОплатыОстатки.Дата, &Дата, ДЕНЬ) КАК КоличествоДней,
                        |	ВТ_ОплатыОстатки.Контрагент КАК Контрагент,
                        |	ВТ_ОплатыОстатки.СуммаДокумента КАК СуммаДокумента,
                        |	МЕСЯЦ(ВТ_ОплатыОстатки.Дата) + 1 КАК Месяц,
                        |	ГОД(ВТ_ОплатыОстатки.Дата) КАК Год,
                        |	0 КАК ВыставлятьЧерез,
                        |	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК Дата60Дней,
                        |	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК ДатаОплаты
                        |ИЗ
                        |	РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(
                        |			,
                        |			,
                        |			СубконтоКт3 В
                        |				(ВЫБРАТЬ
                        |					ВТ_ОплатыОстатки.Реализация
                        |				ИЗ
                        |					ВТ_ОплатыОстатки КАК ВТ_ОплатыОстатки),
                        |			,
                        |			) КАК ХозрасчетныйДвиженияССубконто
                        |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ОплатыОстатки КАК ВТ_ОплатыОстатки
                        |		ПО ХозрасчетныйДвиженияССубконто.СубконтоКт3 = ВТ_ОплатыОстатки.Реализация
                        |
                        |СГРУППИРОВАТЬ ПО
                        |	ВТ_ОплатыОстатки.ОплаченоОстаток,
                        |	ВТ_ОплатыОстатки.Реализация,
                        |	ВТ_ОплатыОстатки.Контрагент,
                        |	ВТ_ОплатыОстатки.СуммаДокумента,
                        |	МЕСЯЦ(ВТ_ОплатыОстатки.Дата) + 1,
                        |	ГОД(ВТ_ОплатыОстатки.Дата),
                        |	РАЗНОСТЬДАТ(ВТ_ОплатыОстатки.Дата, &Дата, ДЕНЬ)
                        |
                        |УПОРЯДОЧИТЬ ПО
                        |	Сумма,
                        |	Реализация,
                        |	КоличествоДней,
                        |	Контрагент,
                        |	Разность,
                        |	ОплаченоОстаток,
                        |	СуммаДокумента");
Показать
kar911; +1
12. signum2009 1029 15.02.17 13:09 Сейчас в теме
РегистрНакопления.РасчетыСПоставщиками.Остатки(&МоментВремени) КАК ОплатыЭСЧФОстатки
+
16. kar911 21.02.17 20:49 Сейчас в теме
(12) мне всегда нужно получать текущие данные смысл заводить &МоментВремени
(15)
(14)
я так и не понял как сделать всё в одном запросе чтобы убрать запрос из цикла, выходит что нужно указывать &СубконтоКт3 для каждого выбора.
вот что пока что выходит
Процедура Проверка(ТекущаяДата)Экспорт 
		
	Запрос = новый Запрос("ВЫБРАТЬ
	                      |	ОплатыЭСЧФОстатки.Реализация КАК Реализация,
	                      |	ОплатыЭСЧФОстатки.ОплаченоОстаток КАК ОплаченоОстаток,
	                      |	ОплатыЭСЧФОстатки.Реализация.Контрагент КАК Контрагент,
	                      |	ОплатыЭСЧФОстатки.Реализация.СуммаДокумента КАК СуммаДокумента,
	                      |	ОплатыЭСЧФОстатки.Реализация.Дата КАК Дата,
	                      |	ОплатыЭСЧФОстатки.ОстатокОплатыОстаток КАК ОстатокОплатыОстаток
	                      |ПОМЕСТИТЬ ВТ_ОплатыОстатки
	                      |ИЗ
	                      |	РегистрНакопления.ОплатыЭСЧФ.Остатки КАК ОплатыЭСЧФОстатки
	                      |ГДЕ
	                      |	ОплатыЭСЧФОстатки.ОстатокОплатыОстаток > 0
	                      |	И ОплатыЭСЧФОстатки.Реализация.ВалютаДокумента.Наименование = ""BYN""
	                      |;
	                      |
	                      |////////////////////////////////////////////////////////////­////////////////////
	                      |ВЫБРАТЬ
	                      |	СУММА(ХозрасчетныйДвиженияССубконто.Сумма) - ВТ_ОплатыОстатки.ОплаченоОстаток КАК СуммаДляЭСЧФ,
	                      |	ВТ_ОплатыОстатки.Реализация КАК Реализация,
	                      |	ВТ_ОплатыОстатки.ОплаченоОстаток КАК СуммаВыставлено,
	                      |	СУММА(ХозрасчетныйДвиженияССубконто.Сумма) КАК Оплачено,
	                      |	РАЗНОСТЬДАТ(ВТ_ОплатыОстатки.Дата, &Дата, ДЕНЬ) КАК Срок60Дней,
	                      |	ВТ_ОплатыОстатки.Контрагент КАК Контрагент,
	                      |	ВТ_ОплатыОстатки.СуммаДокумента КАК СуммаДокумента,
	                      |	МЕСЯЦ(ВТ_ОплатыОстатки.Дата) + 1 КАК Месяц,
	                      |	ГОД(ВТ_ОплатыОстатки.Дата) КАК Год,
	                      |	0 КАК СрокВыставления,
	                      |	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК Дата60Дней,
	                      |	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК ДатаОплаты,
	                      |	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК ВыставитьДо,
	                      |	ВТ_ОплатыОстатки.ОстатокОплатыОстаток
	                      |ИЗ
	                      |	ВТ_ОплатыОстатки КАК ВТ_ОплатыОстатки
	                      |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(
	                      |				,
	                      |				,
	                      |				СубконтоКт3 В
	                      |					(ВЫБРАТЬ
	                      |						ВТ_ОплатыОстатки.Реализация
	                      |					ИЗ
	                      |						ВТ_ОплатыОстатки КАК ВТ_ОплатыОстатки),
	                      |				,
	                      |				) КАК ХозрасчетныйДвиженияССубконто
	                      |		ПО ВТ_ОплатыОстатки.Реализация = ХозрасчетныйДвиженияССубконто.СубконтоКт3
	                      |
	                      |СГРУППИРОВАТЬ ПО
	                      |	ВТ_ОплатыОстатки.ОплаченоОстаток,
	                      |	ВТ_ОплатыОстатки.Реализация,
	                      |	ВТ_ОплатыОстатки.Контрагент,
	                      |	ВТ_ОплатыОстатки.СуммаДокумента,
	                      |	МЕСЯЦ(ВТ_ОплатыОстатки.Дата) + 1,
	                      |	ГОД(ВТ_ОплатыОстатки.Дата),
	                      |	РАЗНОСТЬДАТ(ВТ_ОплатыОстатки.Дата, &Дата, ДЕНЬ),
	                      |	ВТ_ОплатыОстатки.ОстатокОплатыОстаток
	                      |
	                      |УПОРЯДОЧИТЬ ПО
	                      |	Оплачено,
	                      |	Реализация,
	                      |	Срок60Дней,
	                      |	Контрагент,
	                      |	СуммаВыставлено,
	                      |	СуммаДляЭСЧФ,
	                      |	СуммаДокумента
	                      |;
	                      |
	                      |////////////////////////////////////////////////////////////­////////////////////
	                      |ВЫБРАТЬ
	                      |	0 КАК СуммаДляЭСЧФ,
	                      |	ОплатыЭСЧФОстатки.Реализация,
	                      |	ОплатыЭСЧФОстатки.ОплаченоОстаток КАК СуммаВыставлено,
	                      |	0 КАК Оплачено,
	                      |	РАЗНОСТЬДАТ(ОплатыЭСЧФОстатки.Реализация.Дата, &Дата, ДЕНЬ) КАК Срок60Дней,
	                      |	ОплатыЭСЧФОстатки.Реализация.Контрагент КАК Контрагент,
	                      |	ОплатыЭСЧФОстатки.Реализация.СуммаДокумента КАК СуммаДокумента,
	                      |	МЕСЯЦ(ОплатыЭСЧФОстатки.Реализация.Дата) + 1 КАК Месяц,
	                      |	ГОД(ОплатыЭСЧФОстатки.Реализация.Дата) КАК Год,
	                      |	0 КАК СрокВыставления,
	                      |	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК Дата60Дней,
	                      |	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК ДатаОплаты,
	                      |	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК ВыставитьДо,
	                      |	ОплатыЭСЧФОстатки.ОстатокОплатыОстаток
	                      |ИЗ
	                      |	РегистрНакопления.ОплатыЭСЧФ.Остатки КАК ОплатыЭСЧФОстатки
	                      |ГДЕ
	                      |	ОплатыЭСЧФОстатки.ОстатокОплатыОстаток > 0
	                      |	И ОплатыЭСЧФОстатки.Реализация.ВалютаДокумента.Наименование = ""BYN""");
	Запрос2 = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1
	                       |	ХозрасчетныйДвиженияССубконто.Регистратор.Дата КАК РегистраторДата
	                       |ИЗ
	                       |	РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК ХозрасчетныйДвиженияССубконто
	                       |ГДЕ
	                       |	ХозрасчетныйДвиженияССубконто.СубконтоКт3 = &СубконтоКт3
	                       |
	                       |УПОРЯДОЧИТЬ ПО
	                       |	РегистраторДата УБЫВ");					  
						   
	Запрос.УстановитьПараметр("Дата",ТекущаяДата);
	Выборка1 = Запрос.ВыполнитьПакет()[2].выгрузить();
	Выборка2 = Запрос.ВыполнитьПакет()[1].выгрузить();
	
	Соответствие = новый Соответствие();
	
	Для каждого строка из Выборка1 Цикл
		Соответствие.Вставить(строка.Реализация,строка);
	КонецЦикла;	
	Для каждого строка из Выборка2 Цикл
		Соответствие.Вставить(строка.Реализация,строка);
	КонецЦикла;
	ТаблицаЗнч = новый ТаблицаЗначений();
	ТаблицаЗнч.Колонки.Добавить("СуммаВыставлено"); //1
	ТаблицаЗнч.Колонки.Добавить("Реализация");      //3
	ТаблицаЗнч.Колонки.Добавить("СуммаДляЭСЧФ");    //8
	ТаблицаЗнч.Колонки.Добавить("Оплачено");
	ТаблицаЗнч.Колонки.Добавить("Срок60Дней");
	ТаблицаЗнч.Колонки.Добавить("Контрагент");
	ТаблицаЗнч.Колонки.Добавить("СуммаДокумента");
	ТаблицаЗнч.Колонки.Добавить("Месяц");
	ТаблицаЗнч.Колонки.Добавить("Год");
	ТаблицаЗнч.Колонки.Добавить("СрокВыставления");
	ТаблицаЗнч.Колонки.Добавить("Дата60Дней");
	ТаблицаЗнч.Колонки.Добавить("ДатаОплаты");
	ТаблицаЗнч.Колонки.Добавить("ОстатокОплатыОстаток");	
	ТаблицаЗнч.Колонки.Добавить("ВыставитьДо");	                          
	
	Для Каждого Элемент Из Соответствие Цикл
		СтрокаТаблицыПриемника = ТаблицаЗнч.Добавить();
		
        ЗаполнитьЗначенияСвойств(СтрокаТаблицыПриемника,Элемент.Значение);
    КонецЦикла;
	
	Регистр = РегистрыСведений.ПроверкаЭСЧФ.СоздатьНаборЗаписей();
	Запись = Регистр.Добавить();
	Запись.Период = ТекущаяДата;
	Таблица = ТаблицаЗнч;
	//Таблица.Колонки.Добавить("ДокументПоступления");
	Для каждого строка из Таблица Цикл
		Запрос2.УстановитьПараметр("СубконтоКт3",Строка.Реализация);
		Выборка = Запрос2.Выполнить().Выбрать();
		ДатаПоступления = '00010101';
		Пока Выборка.Следующий() Цикл
			ДатаПоступления = Выборка.РегистраторДата;	
		КонецЦикла;
		
		Строка.ДатаОплаты = ДатаПоступления;
		Дата = Строка.Реализация.Дата;
		Дата10Числа = Дата(Строка(Формат(Строка.Год,"ЧГ=0"))+?(СтрДлина(Строка(Строка.Месяц))=1,"0"+Строка(Строка.Месяц),Строка(Строка.Месяц))+"10");
		Дата60Дней = Дата+5184000;
		Д = НачалоДня(Дата+5191200); //60+2 дня
		
		Строка.Дата60Дней = Дата60Дней;
		
		Если не Строка.СуммаДляЭСЧФ=0 тогда
			//Выставление в течение дней оплаты
			Если ТекущаяДата>=НачалоДня(Дата60Дней) тогда
				Строка.ВыставитьДо = Д;
				Строка.СрокВыставления = Д-ТекущаяДата/86400;
			Иначе
				Если ТекущаяДата < Дата10Числа тогда
					Строка.ВыставитьДо = Дата10Числа;
					Строка.СрокВыставления = (Дата10Числа-ТекущаяДата)/86400;		
				Иначе
					Строка.ВыставитьДо = ДатаПоступления+172800;
					Строка.СрокВыставления = ((ДатаПоступления+172800)-ТекущаяДата)/86400;
				КонецЕсли;
			КонецЕсли;	
		Иначе
			//Количество Дней до оплаты
			Если ТекущаяДата>=Д тогда
				Строка.ВыставитьДо = Д;
				Строка.СрокВыставления = Д-ТекущаяДата/86400;
			
			КонецЕсли;
		КонецЕсли;	
			
	КонецЦикла;	
	//Таблица.Индексы.Добавить("Разность,Реализация,ОплаченоОстаток,Сумма,КоличествоДней,Контрагент,СуммаДокумента");
	Запись.ТаблицаЗначений = Новый ХранилищеЗначения(Таблица);
	Регистр.Записать();
	
КонецПроцедуры
Показать


+
17. karpik666 3775 21.02.17 20:58 Сейчас в теме
(16) ух, вот это жесть, блин тут нужно изучать основы, а не оптимизировать что то, налицо явное непонимание, что делают различные функции в 1с. К примеру, зачем ты добавил соответствии в код, или почему у тебя два раза подряд стоит выполнитьПакет?
+
18. kar911 21.02.17 21:05 Сейчас в теме
(17)ну пакет выполнитьПакет это да я что то не увидел, а вот соответствие я добавил что бы выбрать все данные по позициям из временной таблицы, если просто оставлять связь
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто
то выбираются данные только те по которым есть движения в РегистрБухгалтерии
+
19. karpik666 3775 22.02.17 05:54 Сейчас в теме
(18) а про функцию "Объединить ВСЕ" в запросе слышал? И Что вторым запросом ты получаешь только дату поступления и поступление, что мешает поместить это в один запрос я не представляю, вот как раз тогда и нужно использовать выполнитьПакет, а в соответствие помещать Ключ - Регистратор, Значение - Поступление. "ОплатыЭСЧФОстатки.Реализация.ВалютаДокумента.Наименование = ""BYN""" - вот это строка вообще капец, если используется отбор по валюте, то во первых ее нужно получать как параметр, а во вторых нужно ее видимо использовать как "Измерения" в регистре накопления. Также непонятно про ресурс - "ОстатокОплаты", если он является единственным, то в виртуальной таблице "Остатки", если он будет равен 0, то по нему не должно быть записей, поэтому "Условие" на больше 0 избыточно.
Да и в принципе здесь нечего оптимизировать, если изначально все неправильно, тут явно серьезные ошибки как архитектурно, нехватка измерений для регистра накопления, и хранилище значений, в которое помещается таблица значений - в регистре сведений; так и программные. Какая задача стоит у всего этого, я не представляю, надеюсь клиент от вас уйдет довольным.
kar911; +1
20. kar911 24.02.17 16:31 Сейчас в теме
(19)
а про функцию "Объединить ВСЕ" в запросе слышал? И Что вторым запросом ты получаешь только дату поступления и поступление, что мешает поместить это в один запрос я не представляю, вот как раз тогда и нужно использовать выполнитьПакет, а в соответствие помещать Ключ - Регистратор, Значение - Поступление. "ОплатыЭСЧФОстатки.Реализация.ВалютаДокумента.Наименование = ""BYN""" - вот это строка вообще капец, если используется отбор по валюте, то во первых ее нужно получать как параметр, а во вторых нужно ее видимо использовать как "Измерения" в регистре накопления. Также непонятно про ресурс - "ОстатокОплаты", если он является единственным, то в виртуальной таблице "Остатки", если он будет равен 0, то по нему не должно быть записей, поэтому "Условие" на больше 0 избыточно.

ресурс - "ОстатокОплаты" не единственный поэтому есть условие
сколько я бы не пытался сделать через Объединить ВСЕ нечего не выходило получилось только вот так
&НаСервере
Процедура Проверка(ТекущаяДата)Экспорт 
		
	Запрос =новый запрос("ВЫБРАТЬ
	                     |	ОплатыЭСЧФОстатки.Реализация КАК Реализация,
	                     |	ОплатыЭСЧФОстатки.ОплаченоОстаток КАК ОплаченоОстаток,
	                     |	ОплатыЭСЧФОстатки.Реализация.Контрагент КАК Контрагент,
	                     |	ОплатыЭСЧФОстатки.Реализация.СуммаДокумента КАК СуммаДокумента,
	                     |	ОплатыЭСЧФОстатки.Реализация.Дата КАК Дата,
	                     |	ОплатыЭСЧФОстатки.ОстатокОплатыОстаток КАК ОстатокОплатыОстаток
	                     |ПОМЕСТИТЬ ВТ_ОплатыОстатки
	                     |ИЗ
	                     |	РегистрНакопления.ОплатыЭСЧФ.Остатки КАК ОплатыЭСЧФОстатки
	                     |ГДЕ
	                     |	ОплатыЭСЧФОстатки.ОстатокОплатыОстаток > 0
	                     |;
	                     |
	                     |////////////////////////////////////////////////////////////­////////////////////
	                     |ВЫБРАТЬ
	                     |	ЕСТЬNULL(СУММА(ХозрасчетныйДвиженияССубконто.Сумма) - ВТ_ОплатыОстатки.ОплаченоОстаток, 0) КАК СуммаДляЭСЧФ,
	                     |	ВТ_ОплатыОстатки.Реализация КАК Реализация,
	                     |	ВТ_ОплатыОстатки.ОплаченоОстаток КАК СуммаВыставлено,
	                     |	СУММА(ЕСТЬNULL(ХозрасчетныйДвиженияССубконто.Сумма, 0)) КАК Оплачено,
	                     |	РАЗНОСТЬДАТ(ВТ_ОплатыОстатки.Дата, &Дата, ДЕНЬ) КАК Срок60Дней,
	                     |	ВТ_ОплатыОстатки.Контрагент КАК Контрагент,
	                     |	ВТ_ОплатыОстатки.СуммаДокумента КАК СуммаДокумента,
	                     |	МЕСЯЦ(ВТ_ОплатыОстатки.Дата) + 1 КАК Месяц,
	                     |	ГОД(ВТ_ОплатыОстатки.Дата) КАК Год,
	                     |	0 КАК СрокВыставления,
	                     |	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК Дата60Дней,
	                     |	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК ДатаОплаты,
	                     |	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК ВыставитьДо,
	                     |	ВТ_ОплатыОстатки.ОстатокОплатыОстаток
	                     |ИЗ
	                     |	ВТ_ОплатыОстатки КАК ВТ_ОплатыОстатки
	                     |		ПОЛНОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(
	                     |				,
	                     |				,
	                     |				СубконтоКт3 В
	                     |					(ВЫБРАТЬ
	                     |						ВТ_ОплатыОстатки.Реализация
	                     |					ИЗ
	                     |						ВТ_ОплатыОстатки КАК ВТ_ОплатыОстатки),
	                     |				,
	                     |				) КАК ХозрасчетныйДвиженияССубконто
	                     |		ПО ВТ_ОплатыОстатки.Реализация = ХозрасчетныйДвиженияССубконто.СубконтоКт3
	                     |
	                     |СГРУППИРОВАТЬ ПО
	                     |	ВТ_ОплатыОстатки.ОплаченоОстаток,
	                     |	ВТ_ОплатыОстатки.Реализация,
	                     |	ВТ_ОплатыОстатки.Контрагент,
	                     |	ВТ_ОплатыОстатки.СуммаДокумента,
	                     |	МЕСЯЦ(ВТ_ОплатыОстатки.Дата) + 1,
	                     |	ГОД(ВТ_ОплатыОстатки.Дата),
	                     |	РАЗНОСТЬДАТ(ВТ_ОплатыОстатки.Дата, &Дата, ДЕНЬ),
	                     |	ВТ_ОплатыОстатки.ОстатокОплатыОстаток
	                     |;
	                     |
	                     |////////////////////////////////////////////////////////////­////////////////////
	                     |ВЫБРАТЬ
	                     |	ХозрасчетныйДвиженияССубконто.СубконтоКт3 КАК Реализация,
	                     |	ХозрасчетныйДвиженияССубконто.Регистратор КАК Поступление
	                     |ИЗ
	                     |	РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК ХозрасчетныйДвиженияССубконто
	                     |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ОплатыОстатки КАК ВТ_ОплатыОстатки
	                     |		ПО ХозрасчетныйДвиженияССубконто.СубконтоКт3 = ВТ_ОплатыОстатки.Реализация
	                     |
	                     |УПОРЯДОЧИТЬ ПО
	                     |	ХозрасчетныйДвиженияССубконто.Регистратор.Дата");					   

	Запрос.УстановитьПараметр("Дата",ТекущаяДата);
	Выборка = Запрос.ВыполнитьПакет();
	Выборка1 = Выборка[1].выгрузить();
	Выборка2 = Выборка[2].Выбрать();
	
	Соответствие = новый Соответствие();
	Пока Выборка2.Следующий() Цикл
		Соответствие.Вставить(Выборка2.Реализация,Выборка2.Поступление);	
	КонецЦикла;
	
	Для Каждого Элемент Из Соответствие Цикл
		Строка =  Выборка1.найти(Элемент.Ключ);
		Строка.ДатаОплаты = Элемент.Значение.Дата;
	КонецЦикла;
	
	Регистр = РегистрыСведений.ПроверкаЭСЧФ.СоздатьНаборЗаписей();
	Запись = Регистр.Добавить();
	Запись.Период = ТекущаяДата;
	Таблица = Выборка1;
	//Таблица.Колонки.Добавить("ДокументПоступления");
	Для каждого строка из Таблица Цикл
				
		Дата = Строка.Реализация.Дата;
		Дата10Числа = Дата(Строка(Формат(Строка.Год,"ЧГ=0"))+?(СтрДлина(Строка(Строка.Месяц))=1,"0"+Строка(Строка.Месяц),Строка(Строка.Месяц))+"10");
		Дата60Дней = Дата+5184000;
		Д = НачалоДня(Дата+5191200); //60+2 дня
		
		Строка.Дата60Дней = Дата60Дней;
		
		Если не Строка.СуммаДляЭСЧФ=0 тогда
			//Выставление в течение дней оплаты
			Если ТекущаяДата>=НачалоДня(Дата60Дней) тогда
				Строка.ВыставитьДо = Д;
				Строка.СрокВыставления = Д-ТекущаяДата/86400;
			Иначе
				Если ТекущаяДата < Дата10Числа тогда
					Строка.ВыставитьДо = Дата10Числа;
					Строка.СрокВыставления = (Дата10Числа-ТекущаяДата)/86400;		
				Иначе
					Строка.ВыставитьДо = Строка.ДатаОплаты+172800;
					Строка.СрокВыставления = ((Строка.ДатаОплаты+172800)-ТекущаяДата)/86400;
				КонецЕсли;
			КонецЕсли;	
		Иначе
			//Количество Дней до оплаты
			Если ТекущаяДата>=Д тогда
				Строка.ВыставитьДо = Д;
				Строка.СрокВыставления = Д-ТекущаяДата/86400;
			КонецЕсли;
		КонецЕсли;	
			
	КонецЦикла;	
	//Таблица.Индексы.Добавить("Разность,Реализация,ОплаченоОстаток,Сумма,КоличествоДней,Контрагент,СуммаДокумента");
	Запись.ТаблицаЗначений = Новый ХранилищеЗначения(Таблица);
	Регистр.Записать();
	
КонецПроцедуры
Показать
+
21. starik-2005 3036 24.02.17 23:34 Сейчас в теме
(20) забыли ВТ проиндексировать. Есть мнение, что на большой ВТ это может помочь. А так код конечно страшный. Все эти даты 10 и 60 можно по-другому получить, например через "НачалоМесяца(Дата)+24*60*60*10" - 10-е число месяца.
+
24. kar911 27.02.17 09:09 Сейчас в теме
(21)
"НачалоМесяца(Дата)+24*60*60*10" - 10-е число месяца.

это 10 число этого месяца а нужно следующего
+
25. spacecraft 27.02.17 09:18 Сейчас в теме
(24)
это 10 число этого месяца а нужно следующего

КонецМесяца(Дата)+1+24*60*60*10
kar911; +1
22. karpik666 3775 25.02.17 08:43 Сейчас в теме
(20) лучше напишите, какая перед вами стоит задача, и структуру, используемых регистров, а то что уже сделали спрячьте от греха подальше
+
23. kar911 27.02.17 09:04 Сейчас в теме
(22)Регистр ОплатыЭСЧФ
Измерения
Реализация (ДокументСсылка.РеализацияТоваровУслуг)
Ресурсы
ОстатокОплаты(Число)
Оплачено(Число)

Задача: Определить были ли оплаты по реализациям если были то необходимо знать на какую сумму и какого числа было последнее поступление. Также нужно узнать выставлена ли ЭСЧФ на эту реализацию, если выставлена то в каком размере. Далее необходимо учесть что если реализация была в этом месяце то ЭСЧФ на неё можно выставлять до 10 числа следующего месяца(даже если не полностью была оплачена реализация), если реализация была в прошлом месяце но оплата была после 10 числа следующего месяца необходимо указать дату что ЭСЧФ необходимо выставить в течение 2 дней с момента поступления денежных средств на р/с, если в течение 60 дней с реализации покупатель не полностью оплатил реализацию то нужно показать дату что нужно выставить ЭСЧФ в течение 2 дней после 60 дней после реализации.

В регистр я записывал изменения при приведение ЭСЧФ и при реализации для отслеживания остатка оплаты
+
26. karpik666 3775 27.02.17 09:41 Сейчас в теме
(23) Во первых структура регистра наверная, Остаток Оплаты - нужно удалить. Так он получается уже в виртуальной таблице регистра накопления "Остатки", т.е. когда создается реализация, мы делаем приход по данному регистру на сумму оплаты, затем когда делается приходной кассовый ордер, либо платежное поручение входящее, то мы делаем расход на сумму оплаты по данной реализации. По сути ваш регистр вообще не нужен, так как данные, которые вы используете уже есть в программе.
А какая у вас конфигурация? С Бухгалтерией будет посложнее, так как там нужно понимать по каким счетам проходят взаиморасчеты, например по 44, если торговля то там проще есть регистр накопления "Взаиморасчеты с контрагентами по документам расчета", там вам нужны записи с видом движения расход за заданный период, для контрагентов, которые являются покупателями. так вы получите оплаты. Обратите внимание, что записи в таком регистре будут только если в договоре с контрагентом стоит галка "Вести по документам расчетов с контрагентами", По сути это можно сделать одним запросом, и в итоговой таблице указать дату счет фактуры, сумму поступления, дату поступления дс, дату реализации, а затем все это сравнивать для того, чтобы выполнять различные оповещения.
+
27. kar911 27.02.17 09:51 Сейчас в теме
(26) Бухгалтерия для Беларуси, редакция 2.1. Локализация для Республики Беларусь: СООО "1С-Минск" (2.1.10.7)
поступления проверяются через выписки банка(Поступление на р/с) но в выписках реализация не указывается, как я понял можно посмотреть на какие документы распределились деньги через приводки поступления
+
28. karpik666 3775 27.02.17 11:54 Сейчас в теме
(27) Хм, ну в бух учете я не так разбираюсь, причем Беларусии, вам лучше с бухгалтером пообщаться, во первых по каким счетам происходят взаиморасчеты с покупателями, затем как происходит зачет оплаты по задолженности контрагента, возможно при закрытии месяца.
+
29. kar911 27.02.17 14:17 Сейчас в теме
(28)
по каким счетам происходят взаиморасчеты с покупателями

спросил у бухгалтера она сказала по 51(Расчетные счета) и 62(Расчеты с покупателями и заказчиками) счетам, взаиморасчёт происходит по дебет 51 кредит 62
+
30. karpik666 3775 27.02.17 14:40 Сейчас в теме
(29) ну вот, теперь вы можете получить все поступления дс, учтите, что поступления могут быть еще не только на расчетный счет, но и в кассу. В регистре бухгалтерии в отборе по счетам нужно поставить заданные, и субконтокт3 Ссылка Документ,РеализацияТоваров. У вас в задаче не стоит, погасили они эту задолженность или нет, поэтому не нужно учитывать остатки по взаиморасчетам, Регистратор в данном регистре и будет документ поступления денежных средств, Период - дата поступления средств, Теперь остается только получить проведенные счет фактуры выданные, связав их с документом реализация, и мы получим все заданные поля.
+
31. kar911 27.02.17 15:08 Сейчас в теме
(30) так как мы работаем по безналу и с физ лицами не работаем то кассы нету
+
32. karpik666 3775 27.02.17 15:13 Сейчас в теме
(31) еще проще, делайте запрос, в первой таблице, получаете реализацию и все документы поступления, помещаете ее во временную, затем во второй группирует по реализации и получая максимальную дату, чтобы получить последнюю дату поступления, затем связываете ее с временной таблицей, чтобы получить реализация, сумму последнего поступления. и дату поступления, в 4 таблице связываете третью таблицу со счет фактурами. Если будет долго формироваться проиндексируйте реквизиты, по которым будет происходить связь. В конечном счете получится всего одна таблица, в которой находятся все необходимые данные, а после делайте с ней, что хотите: сравнивайте, делайте оповещалки, хоть, что угодно.
+
33. kar911 28.02.17 16:58 Сейчас в теме
(32)вот так у меня вышло не совсем то что ты говорил но одним запросом и без регистра самодельного. Но выполняется секунд 5-6(или из-за того что я выбираю прямо из документов беру данные а не из регистра время увеличилось или запрос мой кривой)
Процедура Проверка(ТекущаяДата)Экспорт 
		
	Запрос =новый запрос("ВЫБРАТЬ
	                     |	СчетФактураВыданный.СуммаДокумента КАК СуммаДокумента,
	                     |	ВЫРАЗИТЬ(СчетФактураВыданный.ДокументОснование КАК Документ.РеализацияТоваровУслуг) КАК ДокументОснование
	                     |ПОМЕСТИТЬ ВТ_ЭСЧФ
	                     |ИЗ
	                     |	РегистрСведений.СостоянияЭД КАК СостоянияЭД
	                     |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СчетФактураВыданный КАК СчетФактураВыданный
	                     |		ПО СостоянияЭД.СсылкаНаОбъект = СчетФактураВыданный.Ссылка,
	                     |	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
	                     |ГДЕ
	                     |	СостоянияЭД.ДействияСоСтороныДругогоУчастника <> ""Аннулирован""
	                     |	И СчетФактураВыданный.ДокументОснование.Дата > ДАТАВРЕМЯ(2017, 1, 1, 0, 0, 0)
	                     |	И СчетФактураВыданный.ДокументОснование.ВалютаДокумента = &ВалютаДокумента
	                     |	И СостоянияЭД.СостояниеВерсииЭД = &СостояниеВерсииЭД
	                     |	И РеализацияТоваровУслуг.Проведен = ИСТИНА
	                     |
	                     |СГРУППИРОВАТЬ ПО
	                     |	СчетФактураВыданный.СуммаДокумента,
	                     |	ВЫРАЗИТЬ(СчетФактураВыданный.ДокументОснование КАК Документ.РеализацияТоваровУслуг)
	                     |
	                     |ИНДЕКСИРОВАТЬ ПО
	                     |	ДокументОснование
	                     |;
	                     |
	                     |////////////////////////////////////////////////////////////­////////////////////
	                     |ВЫБРАТЬ
	                     |	СУММА(ЕСТЬNULL(ВТ_ЭСЧФ.СуммаДокумента, 0)) КАК ОплаченоОстаток,
	                     |	РеализацияТоваровУслуг.Ссылка КАК Реализация,
	                     |	РеализацияТоваровУслуг.Дата,
	                     |	РеализацияТоваровУслуг.Контрагент,
	                     |	РеализацияТоваровУслуг.СуммаДокумента КАК СуммаДокумента
	                     |ПОМЕСТИТЬ ВТ_Итог
	                     |ИЗ
	                     |	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
	                     |		ПОЛНОЕ СОЕДИНЕНИЕ ВТ_ЭСЧФ КАК ВТ_ЭСЧФ
	                     |		ПО РеализацияТоваровУслуг.Ссылка = ВТ_ЭСЧФ.ДокументОснование
	                     |ГДЕ
	                     |	РеализацияТоваровУслуг.Дата > ДАТАВРЕМЯ(2017, 1, 1, 0, 0, 0)
	                     |	И РеализацияТоваровУслуг.ВалютаДокумента = &ВалютаДокумента
	                     |	И РеализацияТоваровУслуг.Проведен = ИСТИНА
	                     |
	                     |СГРУППИРОВАТЬ ПО
	                     |	РеализацияТоваровУслуг.Контрагент,
	                     |	РеализацияТоваровУслуг.Дата,
	                     |	РеализацияТоваровУслуг.Ссылка,
	                     |	РеализацияТоваровУслуг.СуммаДокумента
	                     |;
	                     |
	                     |////////////////////////////////////////////////////////////­////////////////////
	                     |ВЫБРАТЬ
	                     |	ВТ_Итог.ОплаченоОстаток,
	                     |	ВТ_Итог.Реализация КАК Реализация,
	                     |	ВТ_Итог.Дата,
	                     |	ВТ_Итог.Контрагент,
	                     |	ВТ_Итог.СуммаДокумента,
	                     |	ВТ_Итог.СуммаДокумента - ВТ_Итог.ОплаченоОстаток КАК ОстатокОплатыОстаток
	                     |ПОМЕСТИТЬ ВТ_ОплатыОстатки
	                     |ИЗ
	                     |	ВТ_Итог КАК ВТ_Итог
	                     |ГДЕ
	                     |	ВТ_Итог.СуммаДокумента - ВТ_Итог.ОплаченоОстаток > 0
	                     |
	                     |ИНДЕКСИРОВАТЬ ПО
	                     |	Реализация
	                     |;
	                     |
	                     |////////////////////////////////////////////////////////////­////////////////////
	                     |ВЫБРАТЬ
	                     |	МАКСИМУМ(ВЫБОР
	                     |			КОГДА ХозрасчетныйДвиженияССубконто.СчетДт = &СчетДт2
	                     |				ТОГДА ВЫРАЗИТЬ(ХозрасчетныйДвиженияССубконто.СубконтоДт3 КАК Документ.ПоступлениеНаРасчетныйСчет)
	                     |			ИНАЧЕ ВЫРАЗИТЬ(ХозрасчетныйДвиженияССубконто.Регистратор КАК Документ.ПоступлениеНаРасчетныйСчет)
	                     |		КОНЕЦ) КАК Поступление,
	                     |	ВЫРАЗИТЬ(ХозрасчетныйДвиженияССубконто.СубконтоКт3 КАК Документ.РеализацияТоваровУслуг) КАК СубконтоКт3,
	                     |	СУММА(ХозрасчетныйДвиженияССубконто.Сумма) КАК Сумма
	                     |ПОМЕСТИТЬ ВТ_Поступление
	                     |ИЗ
	                     |	РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК ХозрасчетныйДвиженияССубконто
	                     |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ОплатыОстатки КАК ВТ_ОплатыОстатки
	                     |		ПО ХозрасчетныйДвиженияССубконто.СубконтоКт3 = ВТ_ОплатыОстатки.Реализация
	                     |ГДЕ
	                     |	(ХозрасчетныйДвиженияССубконто.СчетДт = &СчетДт
	                     |			ИЛИ ХозрасчетныйДвиженияССубконто.СчетДт = &СчетДт2)
	                     |	И ХозрасчетныйДвиженияССубконто.СчетКт = &СчетКт
	                     |
	                     |СГРУППИРОВАТЬ ПО
	                     |	ВЫРАЗИТЬ(ХозрасчетныйДвиженияССубконто.СубконтоКт3 КАК Документ.РеализацияТоваровУслуг)
	                     |
	                     |ИНДЕКСИРОВАТЬ ПО
	                     |	СубконтоКт3
	                     |;
	                     |
	                     |////////////////////////////////////////////////////////////­////////////////////
	                     |ВЫБРАТЬ
	                     |	ЕСТЬNULL(ВТ_Поступление.Сумма - ВТ_ОплатыОстатки.ОплаченоОстаток, 0) КАК СуммаДляЭСЧФ,
	                     |	ВТ_ОплатыОстатки.Реализация КАК Реализация,
	                     |	ВТ_ОплатыОстатки.ОплаченоОстаток КАК СуммаВыставлено,
	                     |	ЕСТЬNULL(ВТ_Поступление.Сумма, 0) КАК Оплачено,
	                     |	РАЗНОСТЬДАТ(ВТ_ОплатыОстатки.Дата, &Дата, ДЕНЬ) КАК Срок60Дней,
	                     |	ВТ_ОплатыОстатки.Контрагент КАК Контрагент,
	                     |	ВТ_ОплатыОстатки.СуммаДокумента КАК СуммаДокумента,
	                     |	0 КАК СрокВыставления,
	                     |	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК Дата60Дней,
	                     |	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК ВыставитьДо,
	                     |	ЕСТЬNULL(ВТ_Поступление.Поступление.Дата, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) КАК ДатаОплаты,
	                     |	ВТ_ОплатыОстатки.ОстатокОплатыОстаток,
	                     |	ЕСТЬNULL(ВТ_Поступление.Поступление, ЗНАЧЕНИЕ(Документ.ПоступлениеНаРасчетныйСчет.ПустаяСсылка)) КАК Поступление,
	                     |	ЕСТЬNULL(ВТ_ОплатыОстатки.Дата, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) КАК Дата
	                     |ИЗ
	                     |	ВТ_ОплатыОстатки КАК ВТ_ОплатыОстатки
	                     |		ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Поступление КАК ВТ_Поступление
	                     |		ПО ВТ_ОплатыОстатки.Реализация.Ссылка = ВТ_Поступление.СубконтоКт3.Ссылка
	                     |
	                     |СГРУППИРОВАТЬ ПО
	                     |	ВТ_ОплатыОстатки.ОплаченоОстаток,
	                     |	ВТ_ОплатыОстатки.Реализация,
	                     |	ВТ_ОплатыОстатки.Контрагент,
	                     |	ВТ_ОплатыОстатки.СуммаДокумента,
	                     |	РАЗНОСТЬДАТ(ВТ_ОплатыОстатки.Дата, &Дата, ДЕНЬ),
	                     |	ВТ_ОплатыОстатки.ОстатокОплатыОстаток,
	                     |	ЕСТЬNULL(ВТ_Поступление.Поступление, ЗНАЧЕНИЕ(Документ.ПоступлениеНаРасчетныйСчет.ПустаяСсылка)),
	                     |	ЕСТЬNULL(ВТ_Поступление.Сумма, 0),
	                     |	ЕСТЬNULL(ВТ_Поступление.Сумма - ВТ_ОплатыОстатки.ОплаченоОстаток, 0),
	                     |	ЕСТЬNULL(ВТ_ОплатыОстатки.Дата, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)),
	                     |	ЕСТЬNULL(ВТ_Поступление.Поступление.Дата, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0))
	                     |
	                     |УПОРЯДОЧИТЬ ПО
	                     |	Реализация");					   

	Запрос.УстановитьПараметр("Дата",ТекущаяДата);
	Запрос.УстановитьПараметр("ВалютаДокумента",Справочники.Валюты.НайтиПоКоду(933));
	Запрос.УстановитьПараметр("СостояниеВерсииЭД",Перечисления.СтатусыЭД.Отправлен);
	Запрос.УстановитьПараметр("СчетДт",ПланыСчетов.Хозрасчетный.РасчетныеСчета);				//ПланыСчетов.Хозрасчетный.НайтиПоКоду("51")); 
	Запрос.УстановитьПараметр("СчетДт2",ПланыСчетов.Хозрасчетный.РасчетыПоАвансамПолученным);	//ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.5"));  
	Запрос.УстановитьПараметр("СчетКт",ПланыСчетов.Хозрасчетный.РасчетыСПокупателями);			//ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.1"));  

	Выборка = Запрос.ВыполнитьПакет();
	Выборка1 = Выборка[4].выгрузить();
		
	Регистр = РегистрыСведений.ПроверкаЭСЧФ.СоздатьНаборЗаписей();
	Запись = Регистр.Добавить();
	Запись.Период = ТекущаяДата;	
	Таблица = Выборка1;
	
	Для каждого строка из Таблица Цикл
				
		Дата = Строка.Дата;
		День = 24*60*60; //86400
		Дня2 = День*2;
		Дата10Числа = НачалоДня(КонецМесяца(Дата)+День*10);
		Дата60Дней = Дата+День*60; //60дней = 5184000
		Д = НачалоДня(Дата60Дней+Дня2); //60+2 дня
		
		Строка.Дата60Дней = Дата60Дней;
		
		Если ТекущаяДата>=НачалоДня(Дата60Дней) тогда
			Строка.ВыставитьДо = Д;
			Строка.СрокВыставления = Д-ТекущаяДата/День;
		Иначе
			Если не Строка.СуммаДляЭСЧФ=0 тогда
				Если ТекущаяДата < Дата10Числа тогда
					Строка.ВыставитьДо = Дата10Числа;
					Строка.СрокВыставления = (Дата10Числа-ТекущаяДата)/День;		
				Иначе
					Строка.ВыставитьДо = Строка.ДатаОплаты+Дня2;
					Строка.СрокВыставления = ((Строка.ДатаОплаты+Дня2)-ТекущаяДата)/День;
				КонецЕсли;	
			КонецЕсли;	
		КонецЕсли;	
					
	КонецЦикла;	
	//Таблица.Индексы.Добавить("Разность,Реализация,ОплаченоОстаток,Сумма,КоличествоДней,Контрагент,СуммаДокумента");
	Запись.ТаблицаЗначений = Новый ХранилищеЗначения(Таблица);
	Регистр.Записать();
	
КонецПроцедуры
Показать
+
14. karpik666 3775 15.02.17 15:21 Сейчас в теме
И самое важное убери запрос в цикле, получи данные 1 запросом, либо пакетом, а если нужно соответствии регистратор реализация, то помести это все в "соответствие"
Ганс; alex-l19041; +2
15. igor-pn 72 15.02.17 15:39 Сейчас в теме
Навскидку:
1.Можно использовать пакетный запрос, тогда система будет обращаться к базе не два раза, один. То есть запрос 1 и 2 вложить в пакет, а потом Использовать Запрос.Выполнитьпакет() ;
2. Можно в запросе использовать конструкцию ВЫБОР КОГДА РАЗНОСТЬДАТ(ВложенныйЗапрос.Реализация.Дата, &Дата, ДЕНЬ) <> 0 Тогда и потом установить в запрос расчеты, которые прописаны в коде после запроса.
+
34. karpik666 3775 28.02.17 18:25 Сейчас в теме
Запрос кривой. нужно получать вначале реализации, и не счет фактуры, нельзя ставить Отбор по строке, нельзя обращаться через точку несколько раз, Обращение "СчетФактураВыданный.ДокументОснование.ВалютаДокумента", будет выполняться очень долго, так как "ДокументОснование" может быть разных типов, а это проверка на разные таблицы, ДатаВремя() лучше не использовать, а использовать Параметр, тем более у тебя она используется несколько раз.
Вообще не верно обращение к реализациям, чтобы получить остатки на оплату, остатки тебе вообще не нужны. сразу обращайся к регистру хозрасчетный, чтобы получить приход денежных средств по определенной реализации, и сразу получишь необходимые реализации. Также скорее всего у вас Валюта с кодом "933" это Валюта регламентированного учета, поэтому лучше использовать константу ВалютаРегламентированногоУчета.
+
35. kar911 01.03.17 12:57 Сейчас в теме
(34) вышло типо этого но мне кажется тоже самое сделал но немного по другому, скорость не изменилась (в последнем пакете не все данные на вывод сделал пока что)

Запрос6 =новый запрос("ВЫБРАТЬ
                      |	МАКСИМУМ(ВЫБОР
                      |			КОГДА ХозрасчетныйДвиженияССубконто.СчетДт = &СчетДт2
                      |				ТОГДА ВЫРАЗИТЬ(ХозрасчетныйДвиженияССубконто.СубконтоДт3 КАК Документ.ПоступлениеНаРасчетныйСчет)
                      |			ИНАЧЕ ВЫРАЗИТЬ(ХозрасчетныйДвиженияССубконто.Регистратор КАК Документ.ПоступлениеНаРасчетныйСчет)
                      |		КОНЕЦ) КАК Поступление,
                      |	ЕСТЬNULL(ВЫРАЗИТЬ(ХозрасчетныйДвиженияССубконто.СубконтоКт3 КАК Документ.РеализацияТоваровУслуг), ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка)) КАК Реализация,
                      |	СУММА(ХозрасчетныйДвиженияССубконто.Сумма) КАК Сумма,
                      |	ХозрасчетныйДвиженияССубконто.Период
                      |ПОМЕСТИТЬ ВТ_Поступления
                      |ИЗ
                      |	РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК ХозрасчетныйДвиженияССубконто
                      |ГДЕ
                      |	(ХозрасчетныйДвиженияССубконто.СчетДт = &СчетДт
                      |			ИЛИ ХозрасчетныйДвиженияССубконто.СчетДт = &СчетДт2)
                      |	И ХозрасчетныйДвиженияССубконто.СчетКт = &СчетКт
                      |
                      |СГРУППИРОВАТЬ ПО
                      |	ЕСТЬNULL(ВЫРАЗИТЬ(ХозрасчетныйДвиженияССубконто.СубконтоКт3 КАК Документ.РеализацияТоваровУслуг), ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка)),
                      |	ХозрасчетныйДвиженияССубконто.Период
                      |
                      |ИНДЕКСИРОВАТЬ ПО
                      |	Реализация
                      |;
                      |
                      |////////////////////////////////////////////////////////////­////////////////////
                      |ВЫБРАТЬ
                      |	ВЫРАЗИТЬ(СостоянияЭД.СсылкаНаОбъект КАК Документ.СчетФактураВыданный) КАК ЭСЧФ,
                      |	ВТ_Поступления.Реализация КАК Реализация
                      |ПОМЕСТИТЬ ВТ_ЭСЧФ
                      |ИЗ
                      |	ВТ_Поступления КАК ВТ_Поступления
                      |		ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияЭД КАК СостоянияЭД
                      |		ПО ВТ_Поступления.Реализация = СостоянияЭД.СсылкаНаОбъект.ДокументОснование
                      |ГДЕ
                      |	СостоянияЭД.ДействияСоСтороныДругогоУчастника <> ""Аннулирован""
                      |	И СостоянияЭД.СостояниеВерсииЭД = &СостояниеВерсииЭД
                      |	И ВТ_Поступления.Реализация.Дата > &ДатаНачалоГода
                      |
                      |ИНДЕКСИРОВАТЬ ПО
                      |	Реализация
                      |;
                      |
                      |////////////////////////////////////////////////////////////­////////////////////
                      |ВЫБРАТЬ
                      |	ВТ_Поступления.Сумма,
                      |	РеализацияТоваровУслуг.Ссылка КАК Ссылка,
                      |	РеализацияТоваровУслуг.Дата,
                      |	РеализацияТоваровУслуг.СуммаДокумента,
                      |	ВТ_Поступления.Период,
                      |	РеализацияТоваровУслуг.ВалютаДокумента
                      |ПОМЕСТИТЬ ВТ_1
                      |ИЗ
                      |	ВТ_Поступления КАК ВТ_Поступления
                      |		ПОЛНОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
                      |		ПО ВТ_Поступления.Реализация = РеализацияТоваровУслуг.Ссылка
                      |ГДЕ
                      |	РеализацияТоваровУслуг.Дата > &ДатаНачалоГода
                      |	И РеализацияТоваровУслуг.Проведен = ИСТИНА
                      |
                      |ИНДЕКСИРОВАТЬ ПО
                      |	Ссылка
                      |;
                      |
                      |////////////////////////////////////////////////////////////­////////////////////
                      |ВЫБРАТЬ
                      |	СУММА(ЕСТЬNULL(ВТ_ЭСЧФ.ЭСЧФ.СуммаДокумента, 0)) КАК ЭСЧФСуммаДокумента,
                      |	ВТ_1.Ссылка КАК Реализация,
                      |	ЕСТЬNULL(ВТ_1.Сумма, 0) КАК СуммаПоступления,
                      |	ВТ_1.СуммаДокумента,
                      |	ВТ_1.Дата,
                      |	ВТ_1.Период
                      |ПОМЕСТИТЬ ВТ_Итог
                      |ИЗ
                      |	ВТ_1 КАК ВТ_1
                      |		ПОЛНОЕ СОЕДИНЕНИЕ ВТ_ЭСЧФ КАК ВТ_ЭСЧФ
                      |		ПО ВТ_1.Ссылка = ВТ_ЭСЧФ.Реализация
                      |ГДЕ
                      |	ВТ_1.ВалютаДокумента = &ВалютаДокумента
                      |
                      |СГРУППИРОВАТЬ ПО
                      |	ВТ_1.Ссылка,
                      |	ВТ_1.СуммаДокумента,
                      |	ВТ_1.Дата,
                      |	ЕСТЬNULL(ВТ_1.Сумма, 0),
                      |	ВТ_1.Период
                      |;
                      |
                      |////////////////////////////////////////////////////////////­////////////////////
                      |ВЫБРАТЬ
                      |	ВТ_Итог.ЭСЧФСуммаДокумента,
                      |	ВТ_Итог.Реализация КАК Реализация,
                      |	ВТ_Итог.СуммаПоступления,
                      |	ВТ_Итог.СуммаДокумента,
                      |	ВТ_Итог.Дата,
                      |	ВТ_Итог.Реализация.Контрагент,
                      |	ЕСТЬNULL(ВТ_Итог.Период, &ДатаНачалоГода) КАК Период
                      |ИЗ
                      |	ВТ_Итог КАК ВТ_Итог
                      |ГДЕ
                      |	ВТ_Итог.СуммаДокумента - ВТ_Итог.ЭСЧФСуммаДокумента > 0
                      |
                      |УПОРЯДОЧИТЬ ПО
                      |	Реализация");					  
					  
Запрос6.УстановитьПараметр("Дата",ТекущаяДата());
Запрос6.УстановитьПараметр("ВалютаДокумента",Константы.ВалютаРегламентированногоУчета.Получить());
Запрос6.УстановитьПараметр("СостояниеВерсииЭД",Перечисления.СтатусыЭД.Отправлен);
Запрос6.УстановитьПараметр("СчетДт",ПланыСчетов.Хозрасчетный.РасчетныеСчета);				//ПланыСчетов.Хозрасчетный.НайтиПоКоду("51")); 
Запрос6.УстановитьПараметр("СчетДт2",ПланыСчетов.Хозрасчетный.РасчетыПоАвансамПолученным);	//ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.5"));  
Запрос6.УстановитьПараметр("СчетКт",ПланыСчетов.Хозрасчетный.РасчетыСПокупателями);			//ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.1"));  
Запрос6.УстановитьПараметр("ДатаНачалоГода",'20170101');
Показать

+
36. kar911 01.03.17 16:20 Сейчас в теме
(34)попробовал вот такой запрос , время выполнения всё равно 5 сек
остатки тебе вообще не нужны

Остатки мне нужно выводить
ВЫБРАТЬ
	РеализацияТоваровУслуг.Ссылка КАК Ссылка,
	РеализацияТоваровУслуг.Дата,
	РеализацияТоваровУслуг.Контрагент,
	РеализацияТоваровУслуг.СуммаДокумента
ПОМЕСТИТЬ ВТ_Реализации
ИЗ
	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
	РеализацияТоваровУслуг.Дата > &ДатаНачалоГода
	И РеализацияТоваровУслуг.Проведен = ИСТИНА
	И РеализацияТоваровУслуг.ВалютаДокумента = &ВалютаДокумента

ИНДЕКСИРОВАТЬ ПО
	Ссылка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Реализации.Ссылка КАК Реализация,
	СУММА(ХозрасчетныйДвиженияССубконто.Сумма) КАК Сумма,
	МАКСИМУМ(ХозрасчетныйДвиженияССубконто.Период) КАК Период
ПОМЕСТИТЬ ВТ_Поступления
ИЗ
	ВТ_Реализации КАК ВТ_Реализации
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК ХозрасчетныйДвиженияССубконто
		ПО ВТ_Реализации.Ссылка = ХозрасчетныйДвиженияССубконто.СубконтоКт3
ГДЕ
	(ХозрасчетныйДвиженияССубконто.СчетДт = &СчетДт
			ИЛИ ХозрасчетныйДвиженияССубконто.СчетДт = &СчетДт2)
	И ХозрасчетныйДвиженияССубконто.СчетКт = &СчетКт

СГРУППИРОВАТЬ ПО
	ВТ_Реализации.Ссылка

ИНДЕКСИРОВАТЬ ПО
	Реализация
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВЫРАЗИТЬ(СостоянияЭД.СсылкаНаОбъект КАК Документ.СчетФактураВыданный) КАК ЭСЧФ,
	ЕСТЬNULL(ВТ_Реализации.Ссылка, ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка)) КАК Реализация
ПОМЕСТИТЬ ВТ_ЭСЧФ
ИЗ
	ВТ_Реализации КАК ВТ_Реализации
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияЭД КАК СостоянияЭД
		ПО ВТ_Реализации.Ссылка = СостоянияЭД.СсылкаНаОбъект.ДокументОснование
ГДЕ
	СостоянияЭД.ДействияСоСтороныДругогоУчастника <> "Аннулирован"
	И СостоянияЭД.СостояниеВерсииЭД = &СостояниеВерсииЭД

ИНДЕКСИРОВАТЬ ПО
	Реализация
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Реализации.Ссылка КАК Ссылка,
	ВТ_Реализации.Контрагент,
	ВТ_Реализации.Дата,
	ВТ_Поступления.Сумма,
	ВТ_Поступления.Период,
	ВТ_Реализации.СуммаДокумента
ПОМЕСТИТЬ ВТ_общий
ИЗ
	ВТ_Реализации КАК ВТ_Реализации
		ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Поступления КАК ВТ_Поступления
		ПО ВТ_Реализации.Ссылка = ВТ_Поступления.Реализация

ИНДЕКСИРОВАТЬ ПО
	Ссылка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_общий.Ссылка КАК Реализация,
	ВТ_общий.Контрагент,
	ВТ_общий.Дата КАК ДатаРеализации,
	ВТ_общий.Сумма КАК СуммаОплачено,
	ВТ_общий.Период КАК ДатаПоступления,
	СУММА(ВТ_ЭСЧФ.ЭСЧФ.СуммаДокумента) КАК ЭСЧФСуммаДокумента,
	ВТ_общий.СуммаДокумента КАК СуммаРеализации
ПОМЕСТИТЬ ВТ_Итог
ИЗ
	ВТ_общий КАК ВТ_общий
		ПОЛНОЕ СОЕДИНЕНИЕ ВТ_ЭСЧФ КАК ВТ_ЭСЧФ
		ПО ВТ_общий.Ссылка = ВТ_ЭСЧФ.Реализация

СГРУППИРОВАТЬ ПО
	ВТ_общий.Ссылка,
	ВТ_общий.Контрагент,
	ВТ_общий.Дата,
	ВТ_общий.Сумма,
	ВТ_общий.Период,
	ВТ_общий.СуммаДокумента

ИНДЕКСИРОВАТЬ ПО
	ЭСЧФСуммаДокумента,
	СуммаРеализации
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ЕСТЬNULL(ВТ_Итог.ЭСЧФСуммаДокумента, 0) КАК Поле2,
	ВТ_Итог.Реализация,
	ВТ_Итог.Контрагент,
	ВТ_Итог.ДатаРеализации,
	ЕСТЬNULL(ВТ_Итог.СуммаОплачено, 0) КАК Поле3,
	ВТ_Итог.ДатаПоступления,
	ЕСТЬNULL(ВТ_Итог.ЭСЧФСуммаДокумента, 0) КАК Поле1,
	ВТ_Итог.СуммаРеализации
ИЗ
	ВТ_Итог КАК ВТ_Итог
ГДЕ
	ВТ_Итог.СуммаРеализации - ЕСТЬNULL(ВТ_Итог.ЭСЧФСуммаДокумента, 0) > 0
Показать
+
37. kar911 01.03.17 17:12 Сейчас в теме
я тестировал эти запросы через внешнюю обработку время выходило больше сейчас попробовал на тестовой базе запускать вышло что 1.7-3 сек обрабатываться и выгружается
+
38. karpik666 3775 01.03.17 17:59 Сейчас в теме
(37) Попробуй что-то типо такого
ВЫБРАТЬ
	МАКСИМУМ(ВЫБОР
			КОГДА ХозрасчетныйДвиженияССубконто.Регистратор ССЫЛКА Документ.ПоступлениеНаРасчетныйСчет
				ТОГДА ВЫРАЗИТЬ(ХозрасчетныйДвиженияССубконто.Регистратор КАК Документ.ПоступлениеНаРасчетныйСчет)
			ИНАЧЕ ХозрасчетныйДвиженияССубконто.Регистратор
		КОНЕЦ) КАК Поступление,
	ХозрасчетныйДвиженияССубконто.СубконтоКт3 КАК Реализация,
	СУММА(ХозрасчетныйДвиженияССубконто.Сумма) КАК Сумма,
	ХозрасчетныйДвиженияССубконто.Период
ПОМЕСТИТЬ ВТ_Поступления
ИЗ
	РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(
			&ДатаНач,
			&ДатаКон,
			СчетДт = &СчетДт
				И СчетКт = &СчетКт,
			,
			) КАК ХозрасчетныйДвиженияССубконто
ГДЕ
	ХозрасчетныйДвиженияССубконто.СубконтоКт3 ССЫЛКА Документ.РеализацияТоваровУслуг

СГРУППИРОВАТЬ ПО
	ХозрасчетныйДвиженияССубконто.Период,
	ХозрасчетныйДвиженияССубконто.СубконтоКт3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	МАКСИМУМ(ВЫБОР
			КОГДА ХозрасчетныйДвиженияССубконто.СубконтоДт3 ССЫЛКА Документ.ПоступлениеНаРасчетныйСчет
				ТОГДА ВЫРАЗИТЬ(ХозрасчетныйДвиженияССубконто.СубконтоДт3 КАК Документ.ПоступлениеНаРасчетныйСчет)
			ИНАЧЕ ХозрасчетныйДвиженияССубконто.СубконтоДт3
		КОНЕЦ),
	ХозрасчетныйДвиженияССубконто.СубконтоКт3,
	СУММА(ХозрасчетныйДвиженияССубконто.Сумма),
	ХозрасчетныйДвиженияССубконто.Период
ИЗ
	РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(
			&ДатаНач,
			&ДатаКон,
			СчетКт = &СчетКт
				И СчетДт = &СчетДт2,
			,
			) КАК ХозрасчетныйДвиженияССубконто
ГДЕ
	ХозрасчетныйДвиженияССубконто.СубконтоКт3 ССЫЛКА Документ.РеализацияТоваровУслуг

СГРУППИРОВАТЬ ПО
	ХозрасчетныйДвиженияССубконто.Период,
	ХозрасчетныйДвиженияССубконто.СубконтоКт3

ИНДЕКСИРОВАТЬ ПО
	Реализация
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Поступления.Поступление,
	ВТ_Поступления.Реализация,
	ВТ_Поступления.Сумма,
	ВТ_Поступления.Период
ПОМЕСТИТЬ ВтПоследниеПоступления
ИЗ
	(ВЫБРАТЬ
		ВТ_Поступления.Реализация КАК Реализация,
		МАКСИМУМ(ВТ_Поступления.Период) КАК Период
	ИЗ
		ВТ_Поступления КАК ВТ_Поступления
	
	СГРУППИРОВАТЬ ПО
		ВТ_Поступления.Реализация) КАК ВЛТ
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Поступления КАК ВТ_Поступления
		ПО ВЛТ.Реализация = ВТ_Поступления.Реализация
			И ВЛТ.Период = ВТ_Поступления.Период
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВтПоследниеПоступления.Поступление,
	ВтПоследниеПоступления.Реализация,
	ВтПоследниеПоступления.Сумма,
	ВтПоследниеПоступления.Период КАК ДатаПоступления,
	ЕСТЬNULL(СчетФактураВыданныйДокументыОснования.Ссылка, ЗНАЧЕНИЕ(Документ.СчетФактураВыданный.ПустаяСсылка)) КАК СчетФактура,
	ЕСТЬNULL(СчетФактураВыданныйДокументыОснования.Ссылка.Дата, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаСчетФактуры
ПОМЕСТИТЬ ВтРеализацииИСчетФактуры
ИЗ
	ВтПоследниеПоступления КАК ВтПоследниеПоступления
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактураВыданный.ДокументыОснования КАК СчетФактураВыданныйДокументыОснования
		ПО ВтПоследниеПоступления.Реализация = СчетФактураВыданныйДокументыОснования.ДокументОснование
			И (СчетФактураВыданныйДокументыОснования.Ссылка.Проведен)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СУММА(ХозрасчетныйОстатки.СуммаОстаток) КАК Остаток,
	ХозрасчетныйОстатки.Субконто3 КАК Реализация
ПОМЕСТИТЬ ВтОстатки
ИЗ
	РегистрБухгалтерии.Хозрасчетный.Остатки(
			ДОБАВИТЬКДАТЕ(&ДатаКон, СЕКУНДА, 1),
			Счет = &СчетКт,
			,
			Субконто3 В
				(ВЫБРАТЬ
					ВТ.Реализация
				ИЗ
					ВтРеализацииИСчетФактуры КАК ВТ)) КАК ХозрасчетныйОстатки

СГРУППИРОВАТЬ ПО
	ХозрасчетныйОстатки.Субконто3
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВтРеализацииИСчетФактуры.Поступление,
	ВтРеализацииИСчетФактуры.Реализация,
	ВтРеализацииИСчетФактуры.Сумма,
	ВтРеализацииИСчетФактуры.ДатаПоступления,
	ВтРеализацииИСчетФактуры.СчетФактура,
	ВтРеализацииИСчетФактуры.ДатаСчетФактуры,
	ЕСТЬNULL(ВтОстатки.Остаток, 0) КАК Остаток
ИЗ
	ВтРеализацииИСчетФактуры КАК ВтРеализацииИСчетФактуры
		ЛЕВОЕ СОЕДИНЕНИЕ ВтОстатки КАК ВтОстатки
		ПО ВтРеализацииИСчетФактуры.Реализация = ВтОстатки.Реализация
Показать
+
39. kar911 01.03.17 18:15 Сейчас в теме
(38)в итоге не совсем то что надо вышло но я на основе этого запроса попробую сделать потом скину что получиться
+
40. karpik666 3775 01.03.17 18:25 Сейчас в теме
(38) если что, первый запрос должен быть без группировки "Максимум"
+
41. kar911 02.03.17 16:48 Сейчас в теме
(40)Ты когда делал запрос ты отталкивался больше от поступления, а мне надо было от ЭСЧФ, ну и лишние поля я убрал которые не нужны. Вот такой запрос вышел
ВЫБРАТЬ
	РеализацияТоваровУслуг.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ_Реализация
ИЗ
	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
	РеализацияТоваровУслуг.Дата > &ДатаНач
	И РеализацияТоваровУслуг.Проведен = ИСТИНА
	И РеализацияТоваровУслуг.ВалютаДокумента = &ВалютаДокумента

ИНДЕКСИРОВАТЬ ПО
	Ссылка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ХозрасчетныйДвиженияССубконто.Сумма КАК СуммаОплачено,
	ЕСТЬNULL(ХозрасчетныйДвиженияССубконто.Период, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаПоступления,
	ВЫРАЗИТЬ(ХозрасчетныйДвиженияССубконто.СубконтоКт3 КАК Документ.РеализацияТоваровУслуг) КАК СубконтоКт3
ПОМЕСТИТЬ ВТ_Поступления
ИЗ
	РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(
			,
			,
			СчетДт = &СчетДт
				И СчетКт = &СчетКт,
			,
			) КАК ХозрасчетныйДвиженияССубконто

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ХозрасчетныйДвиженияССубконто.Сумма,
	ЕСТЬNULL(ХозрасчетныйДвиженияССубконто.Период, ДАТАВРЕМЯ(1, 1, 1)),
	ВЫРАЗИТЬ(ХозрасчетныйДвиженияССубконто.СубконтоКт3 КАК Документ.РеализацияТоваровУслуг)
ИЗ
	РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(
			,
			,
			СчетДт = &СчетДт2
				И СчетКт = &СчетКт,
			,
			) КАК ХозрасчетныйДвиженияССубконто

ИНДЕКСИРОВАТЬ ПО
	СубконтоКт3
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СУММА(ЕСТЬNULL(ВТ_Поступления.СуммаОплачено, 0)) КАК СуммаОплачено,
	МАКСИМУМ(ЕСТЬNULL(ВТ_Поступления.ДатаПоступления, ДАТАВРЕМЯ(1, 1, 1))) КАК ДатаПоступления,
	ВТ_Реализация.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ_Послед
ИЗ
	ВТ_Реализация КАК ВТ_Реализация
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Поступления КАК ВТ_Поступления
		ПО ВТ_Реализация.Ссылка = ВТ_Поступления.СубконтоКт3

СГРУППИРОВАТЬ ПО
	ВТ_Реализация.Ссылка

ИНДЕКСИРОВАТЬ ПО
	Ссылка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Реализация.Ссылка КАК Ссылка,
	СУММА(ВложенныйЗапрос.Ссылка.СуммаДокумента) КАК СуммаЭСЧФ
ПОМЕСТИТЬ ВтРеализацииИСчетФактуры
ИЗ
	ВТ_Реализация КАК ВТ_Реализация
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			ВЫРАЗИТЬ(СчетФактураВыданныйДокументыОснования.ДокументОснование КАК Документ.РеализацияТоваровУслуг) КАК ДокументОснование,
			СчетФактураВыданныйДокументыОснования.Ссылка КАК Ссылка
		ИЗ
			Документ.СчетФактураВыданный.ДокументыОснования КАК СчетФактураВыданныйДокументыОснования
				ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияЭД КАК СостоянияЭД
				ПО СчетФактураВыданныйДокументыОснования.Ссылка = СостоянияЭД.СсылкаНаОбъект
		ГДЕ
			СостоянияЭД.СостояниеВерсииЭД = &СостояниеВерсииЭД
			И СостоянияЭД.ДействияСоСтороныДругогоУчастника <> "Аннулирован") КАК ВложенныйЗапрос
		ПО ВТ_Реализация.Ссылка = ВложенныйЗапрос.ДокументОснование

СГРУППИРОВАТЬ ПО
	ВТ_Реализация.Ссылка

ИНДЕКСИРОВАТЬ ПО
	Ссылка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВтРеализацииИСчетФактуры.Ссылка.СуммаДокумента - ЕСТЬNULL(ВтРеализацииИСчетФактуры.СуммаЭСЧФ, 0) КАК СуммаДляЭСЧФ,
	ВтРеализацииИСчетФактуры.Ссылка КАК Реализация,
	ЕСТЬNULL(ВтРеализацииИСчетФактуры.СуммаЭСЧФ, 0) КАК СуммаВыставлено,
	ЕСТЬNULL(ВТ_Послед.СуммаОплачено, 0) КАК Оплачено,
	РАЗНОСТЬДАТ(ВтРеализацииИСчетФактуры.Ссылка.Дата, &ДатаКон, ДЕНЬ) КАК Срок60Дней,
	ВтРеализацииИСчетФактуры.Ссылка.Контрагент КАК Контрагент,
	ВтРеализацииИСчетФактуры.Ссылка.СуммаДокумента КАК СуммаДокумента,
	0 КАК СрокВыставления,
	ДАТАВРЕМЯ(1, 1, 1) КАК Дата60Дней,
	ДАТАВРЕМЯ(1, 1, 1) КАК ВыставитьДо,
	ВЫБОР
		КОГДА ВТ_Послед.ДатаПоступления < ВтРеализацииИСчетФактуры.Ссылка.Дата
				И ВТ_Послед.ДатаПоступления <> NULL
			ТОГДА ВтРеализацииИСчетФактуры.Ссылка.Дата
		ИНАЧЕ ЕСТЬNULL(ВТ_Послед.ДатаПоступления, ДАТАВРЕМЯ(1, 1, 1))
	КОНЕЦ КАК ДатаОплаты,
	ВтРеализацииИСчетФактуры.Ссылка.СуммаДокумента - ЕСТЬNULL(ВтРеализацииИСчетФактуры.СуммаЭСЧФ, 0) КАК ОстатокОплатыОстаток,
	ВтРеализацииИСчетФактуры.Ссылка.Дата КАК Дата
ИЗ
	ВтРеализацииИСчетФактуры КАК ВтРеализацииИСчетФактуры
		ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Послед КАК ВТ_Послед
		ПО ВтРеализацииИСчетФактуры.Ссылка = ВТ_Послед.Ссылка
ГДЕ
	ВтРеализацииИСчетФактуры.Ссылка.СуммаДокумента - ЕСТЬNULL(ВтРеализацииИСчетФактуры.СуммаЭСЧФ, 0) > 0
Показать
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот