Виснет 1с. Загружена память SQL

1. SantiouS 19.03.20 11:44 Сейчас в теме
Есть много заказов за период 01.01.2020 по 31.01.2020, которые загружались с файлов от поставщика в 1с.
Потом некоторые из загруженных заказов в 1с изменили пользователи.
Сейчас необходимо обновить имеющиеся заказы за данный период из файлов, то есть вернуть им первозданный вид.
Для этого нахожу заказы за период и вывожу ссылки в таблицу. После выбираю папку с файлами и нажимаю кнопку "Обновить", на которую написал такой логичный код:
1. беру первый файл и нахожу по его данным заказ из таблицы - если в заказе что то не сходится - меняю и перезаписываю.
2. и так дальше с каждым файлом.
За день все относительно быстро, но когда взял период месяц, то 1с запустилась и долго стоит упершись в ограничение 8 Гб по памяти SQL. Долго ждал - ошибок нет, но и результата нет. Думаю зависло. Подскажите почему может виснуть?
По теме из базы знаний
Найденные решения
17. Fox-trot 158 19.03.20 18:03 Сейчас в теме
(16) на деле все просто
надо лишь скормить функции НайтиФайлы кучу и замерить выполнение
работа с файловой системой не самый крутой конек 1це
SantiouS; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. Fox-trot 158 19.03.20 15:37 Сейчас в теме
(1) первое что приходит это разделить список файлов на пачки, например по маске 202003??.* или как оно там у тебя
6. SantiouS 19.03.20 17:00 Сейчас в теме
(5) В сообщении (3) я указал что пытался по очереди выбирать папку со днем и восстанавливать каждый день - все быстро и не виснет. Но дошел до 21 го числа и зависло. Пришлось перезапустить службу 1с8 и перезайти в 1с8, после чего заново нажать на кнопку обновить и все отработало.
Такое чувство что где то ограничения по ресурсам что ли. В диспетчере загрузки в принцыпе нет, а почему то зависло. Мог бы грешить на зацикливание в 1с, но ведь после перезапуска 1с и повторного выполнения аналогичных действий - загрузилось. Важно заметить что базой кроме меня никто не пользуется в момент выполнения действий.
Сейчас выложу код. 5 минут
7. Fox-trot 158 19.03.20 17:01 Сейчас в теме
(6) один день = один файл?
8. SantiouS 19.03.20 17:14 Сейчас в теме
(7) Нет, есть площадка документооборота.
1 заказ = 1 заказ с площадки = 1 файл.
Общий алгоритм:
1. выбираю папку;
2. выбираю период заказов, которые нужно обновить (например, 01.01.2020-31.01.2020).
3. в ТЧ формы заполняются все ссылки на заказы.
4. Нажимаю кнопку обновить, после чего в цикле перебираю каждый файл и ищу соотвецтвующий ему заказ из таблицы, которая сформировалась заранее), если нахожу, то проверяю данные: 1- сошлось = оставляю; 2 - не сошлись - получаю по ссылке объект и изменяю данные, после чего перезаписываю(перепровожу) документ заказа.
Код:
&НаКлиенте
Процедура Загрузить(Команда)
ЗагруженыеЗаказы.Очистить();
	МассивФайлов=НайтиФайлы(Папка,"*.xml",Ложь);
	Если МассивФайлов.Количество()=0 Тогда
		Сообщить("Не найдены файлы заказов!");
		Возврат;	
	КонецЕсли; 
	СообщениИнфо.Очистить();
	Для каждого ФайлПуть Из МассивФайлов Цикл
		ДвоичныеДанныеЗаказХХХ=Новый ДвоичныеДанные(ФайлПуть.ПолноеИмя);
		УникальныйИдентификаторХранилища = Новый УникальныйИдентификатор;
		Адрес=ПоместитьВоВременноеХранилище(ДвоичныеДанныеЗаказХХХ,УникальныйИдентификатор);
		Результат=ЗагрузитьНаСервере(Адрес);
-------код оповещений в зависимости от результата--
КонецПроцедуры;

&НаСервере
Функция ЗагрузитьНаСервере(Адрес)
	ДвоичныеДанныеЗаказХХХ=ПолучитьИзВременногоХранилища(Адрес);
	НовыйПоток=Новый ПотокВПамяти;
	
	ЗаписьДанных=Новый ЗаписьДанных(НовыйПоток);
	ЗаписьДанных.Записать(ДвоичныеДанныеЗаказХХХ);
	ЗаписьДанных.Закрыть();
	
	НовыйПоток.Перейти(0, ПозицияВПотоке.Начало);
	
	ПрочитатьXML=Новый ЧтениеXML;
	ПрочитатьXML.ОткрытьПоток(НовыйПоток);
	
	СтруктураЗаказа=Новый Структура;
	
	ПрочитатьXML.Прочитать();
---заполнение структуры заказа из файла---
Возврат СозданиеЗаказаКлиента(СтруктураЗаказа); //обновление заказа если нужно сдесь
КонецФункции

&НаСервере
Функция СозданиеЗаказаКлиента(СтруктураЗаказа=Неопределено)
	Если НЕ ЗначениеЗаполнено(СтруктураЗаказа) Тогда
    	Возврат Неопределено;
	КонецЕсли; 
	
	
	
	//поиск заказа из отобранных за период
	
	НовыйЗаказКлиента=Неопределено;
	Для каждого ЗаказСсылка Из ЗаказыКлиентов Цикл 
		Если ЗаказСсылка.Пропустить Тогда
			Продолжить;
		КонецЕсли;
		Если ЗаказСсылка.ЗаказКлиента.НомерЗаказаХХХ=СтруктураЗаказа.НомерЗаказаХХХ Тогда
			НовыйЗаказКлиента=ЗаказСсылка.ЗаказКлиента.ПолучитьОбъект(); 
			Прервать;
		КонецЕсли; 
	КонецЦикла; 
	Если НовыйЗаказКлиента=Неопределено Тогда
		Возврат "Заказ ХХХ"+СтруктураЗаказа.НомерЗаказаХХХ+" не найден в 1с таблице(возможно пропущен)";
	КонецЕсли; 
	
	
	Для каждого ЭлементСтруктуры Из СтруктураЗаказа Цикл //не совсем оптимально, но отредактировал имеющийся свой код для других целей...
		Если ЭлементСтруктуры.Ключ="Таблица" Тогда
			ТаблицаТоваровСтруктура=ЭлементСтруктуры.Значение; //определение структуры товаров для дальнейшей обработки	
	КонецЦикла; 	


	СтруктураПересчетаСуммы = ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруПересчетаСуммыНДСВСтрокеТЧ(НовыйЗаказКлиента);
	СтруктураДействий = Новый Структура;
	СтуктураЗаполнения=ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныВСтрокеТЧ(НовыйЗаказКлиента);
	СтруктураДействий.Вставить("ЗаполнитьЦенуПродажи", СтуктураЗаполнения);
	СтруктураДействий.Вставить("ПересчитатьСумму");
	СтруктураДействий.Вставить("ЗаполнитьСтавкуНДС", Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС);
	СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
	СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);

	НуждаетсяВОбновлении=Ложь;
	Для каждого НоменклатураХХХ Из ТаблицаТоваровСтруктура Цикл	
		НоменклатураИзХХХ=ОпределениеНоменклатуры(НоменклатураХХХ.Значение.ШтрихКод,НоменклатураХХХ.Значение.BuyerItemCode);
		МассивНайденныхСтрок=НовыйЗаказКлиента.Товары.НайтиСтроки(Новый Структура("Номенклатура",НоменклатураИзХХХ));
		Если НЕ МассивНайденныхСтрок.Количество()=0 Тогда
			НеобходимаСтрока=МассивНайденныхСтрок[0];
			Если НеобходимаСтрока.Количество=Число(НоменклатураХХХ.Значение.Количество) Тогда //если совпадает кол-во, то не обновляем
				Продолжить;
			КонецЕсли; 
			НеобходимаСтрока.Количество=Число(НоменклатураХХХ.Значение.Количество);
			НеобходимаСтрока.КоличествоУпаковок=Число(НоменклатураХХХ.Значение.Количество);
			ОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(НеобходимаСтрока, СтруктураДействий, Неопределено);
			НуждаетсяВОбновлении=Истина;
		Иначе
			СтрокаЗаказа=НовыйЗаказКлиента.Товары.Добавить();
			СтрокаЗаказа.Номенклатура=ОпределениеНоменклатуры(НоменклатураХХХ.Значение.ШтрихКод,НоменклатураХХХ.Значение.BuyerItemCode);	
			СтрокаЗаказа.Количество=Число(НоменклатураХХХ.Значение.Количество);
			СтрокаЗаказа.КоличествоУпаковок=Число(НоменклатураХХХ.Значение.Количество);
			СтрокаЗаказа.ВидЦены=НовыйЗаказКлиента.Соглашение.ВидЦен;
			СтрокаЗаказа.Склад=НовыйЗаказКлиента.Соглашение.Склад;
			ОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(СтрокаЗаказа, СтруктураДействий, Неопределено);
			НуждаетсяВОбновлении=Истина;
		КонецЕсли; 
	КонецЦикла; 
	Попытка
		Если НуждаетсяВОбновлении Тогда
			Если ОбновлятьДанные Тогда
				НовыйЗаказКлиента.Записать(РежимЗаписиДокумента.Проведение);
				Результат=НовыйЗаказКлиента.Ссылка;
			Иначе
				Результат="Заказ "+НовыйЗаказКлиента.Ссылка+" нуждается НО НЕ ОБНОВЛЕН";
			КонецЕсли; 		
		Иначе
			Результат="Заказ "+НовыйЗаказКлиента.Ссылка+" не нуждается в обновлении и не обновлен";		
		КонецЕсли; 		
	Исключение
	    Результат="Произошла ошибка при перепроведении документа согласно заказа из площадки документооборота номер "+Строка(СтруктураЗаказа.НомерЗаказаХХХ);
	КонецПопытки;
	Возврат Результат;
КонецФункции
Показать
11. Fox-trot 158 19.03.20 17:17 Сейчас в теме
(8)
МассивФайлов=НайтиФайлы(Папка,"*.xml",Ложь);

там случаем файлов не стопицот?
12. SantiouS 19.03.20 17:19 Сейчас в теме
(11) Много файлов: 1200 где то.
13. Fox-trot 158 19.03.20 17:20 Сейчас в теме
(12) ну так я ж предлагаю читать их пачками, а не все сразу
SantiouS; +1 Ответить
14. SantiouS 19.03.20 17:24 Сейчас в теме
(13) Я понял о чём вы. Но вот когда зависло я взял папки по дням (40 штук в день грубо).
И начал выбирать период 1 день заказов - вывелись в ТЧ заказы за день.
Потом начал выбирать папку с 40 файлами и грузить (обновлять, если нужно). Все очень быстро. Разве что немного подождать.

Но вот дошел я таким алгоритмом до 21го числа. Выбирал заказы за 21 число - вывелись они в ТЧ обработки. Выбрал папочку с файлами и нажал обновить заказы из тч, если нужно. В итоге повисла 1с...точнее я ждал - ждал и не дождался. Закрыл ее диспетчером задач. Попытался зайти - висит на окне запуска и даже не доходит до логина. Перезапустил службу 1с8 - зашел успешно в 1с8 - выбрал все так же само и загрузил(обновил) нормально заказы и за 21 число. Тут то пачки файлов явно не виноваты...
В диспетчере задач ресурсы в 100 не валятся
15. Fox-trot 158 19.03.20 17:40 Сейчас в теме
(14) тогда только отладчиком ловить или логировать выполнение
16. SantiouS 19.03.20 17:59 Сейчас в теме
(15) Понял, каждый цикл конечно работы с файлом проклацать это затруднительно. , тем более, как я заметил, логичного зависания нет...
В принципе все перегрузил уже, но интерестно в чём могла бы быть проблема, ведь явно еще когда то столкнусь.
17. Fox-trot 158 19.03.20 18:03 Сейчас в теме
(16) на деле все просто
надо лишь скормить функции НайтиФайлы кучу и замерить выполнение
работа с файловой системой не самый крутой конек 1це
SantiouS; +1 Ответить
18. SantiouS 19.03.20 18:35 Сейчас в теме
(17) Понял, спасибо. Если столкнусь в слудующий раз, то замером проихводительности потестирую.
Ну или если желание появиться:)
2. VmvLer 19.03.20 11:57 Сейчас в теме
код может и логичный, но вероятно прожорливый

можем говорить о ценах на гречку пока вы не покажете свое творение
3. SantiouS 19.03.20 12:03 Сейчас в теме
(2) Я вот по дням клацаю вручную. Прошел 20 дней и на 21м зависло на перезаписи документов уже.
Отключил диспетчером задач 1с8. Передернул службу сервера 1с8 и только тогда вошел в 1с снова.
Зашел - поставил те же параметры что и перед этим, но уже все грузится в этот день...
Код обработки нужен?
10. SantiouS 19.03.20 17:17 Сейчас в теме
(2) Закрепил код в сообщении (8)
4. Bludrayn 19.03.20 15:08 Сейчас в теме
9. SantiouS 19.03.20 17:16 Сейчас в теме
(4) Закрепил в сообщении (8)
Оставьте свое сообщение

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