Есть много заказов за период 01.01.2020 по 31.01.2020, которые загружались с файлов от поставщика в 1с.
Потом некоторые из загруженных заказов в 1с изменили пользователи.
Сейчас необходимо обновить имеющиеся заказы за данный период из файлов, то есть вернуть им первозданный вид.
Для этого нахожу заказы за период и вывожу ссылки в таблицу. После выбираю папку с файлами и нажимаю кнопку "Обновить", на которую написал такой логичный код:
1. беру первый файл и нахожу по его данным заказ из таблицы - если в заказе что то не сходится - меняю и перезаписываю.
2. и так дальше с каждым файлом.
За день все относительно быстро, но когда взял период месяц, то 1с запустилась и долго стоит упершись в ограничение 8 Гб по памяти SQL. Долго ждал - ошибок нет, но и результата нет. Думаю зависло. Подскажите почему может виснуть?
---
на деле все просто
надо лишь скормить функции НайтиФайлы кучу и замерить выполнение
работа с файловой системой не самый крутой конек 1це
---
первое что приходит это разделить список файлов на пачки, например по маске 202003??.* или как оно там у тебя
---
В сообщении (3) я указал что пытался по очереди выбирать папку со днем и восстанавливать каждый день - все быстро и не виснет. Но дошел до 21 го числа и зависло. Пришлось перезапустить службу 1с8 и перезайти в 1с8, после чего заново нажать на кнопку обновить и все отработало.
Такое чувство что где то ограничения по ресурсам что ли. В диспетчере загрузки в принцыпе нет, а почему то зависло. Мог бы грешить на зацикливание в 1с, но ведь после перезапуска 1с и повторного выполнения аналогичных действий - загрузилось. Важно заметить что базой кроме меня никто не пользуется в момент выполнения действий.
Сейчас выложу код. 5 минут
---
один день = один файл?
---
Нет, есть площадка документооборота.
1 заказ = 1 заказ с площадки = 1 файл.
Общий алгоритм:
1. выбираю папку;
2. выбираю период заказов, которые нужно обновить (например, 01.01.2020-31.01.2020).
3. в ТЧ формы заполняются все ссылки на заказы.
4. Нажимаю кнопку обновить, после чего в цикле перебираю каждый файл и ищу соотвецтвующий ему заказ из таблицы, которая сформировалась заранее), если нахожу, то проверяю данные: 1- сошлось = оставляю; 2 - не сошлись - получаю по ссылке объект и изменяю данные, после чего перезаписываю(перепровожу) документ заказа.
Код:

```1c
    &НаКлиенте
    Процедура Загрузить(Команда)
    ЗагруженыеЗаказы.Очистить();
    МассивФайлов=НайтиФайлы(Папка,"*.xml",Ложь);
    Если МассивФайлов.Количество()=0 Тогда
    Сообщить("Не найдены файлы заказов!");
    Возврат;
    КонецЕсли;
    СообщениИнфо.Очистить();
    Для каждого ФайлПуть Из МассивФайлов Цикл
    ДвоичныеДанныеЗаказХХХ=Новый ДвоичныеДанные(ФайлПуть.ПолноеИмя);
    УникальныйИдентификаторХранилища = Новый УникальныйИдентификатор;
    Адрес=ПоместитьВоВременноеХранилище(ДвоичныеДанныеЗаказХХХ,УникальныйИдентификатор);
    Результат=ЗагрузитьНаСервере(Адрес);
    -------код оповещений в зависимости от результата--
    КонецПроцедуры;

    &НаСервере
    Функция ЗагрузитьНаСервере(Адрес)
    ДвоичныеДанныеЗаказХХХ=ПолучитьИзВременногоХранилища(Адрес);
    НовыйПоток=Новый ПотокВПамяти;

    ЗаписьДанных=Новый ЗаписьДанных(НовыйПоток);
    ЗаписьДанных.Записать(ДвоичныеДанныеЗаказХХХ);
    ЗаписьДанных.Закрыть();

    НовыйПоток.Перейти(0, ПозицияВПотоке.Начало);

    ПрочитатьXML=Новый ЧтениеXML;
    ПрочитатьXML.ОткрытьПоток(НовыйПоток);

    СтруктураЗаказа=Новый Структура;

    ПрочитатьXML.Прочитать();
    ---заполнение структуры заказа из файла---
    Возврат СозданиеЗаказаКлиента(СтруктураЗаказа); //обновление заказа если нужно сдесь
    КонецФункции

    &НаСервере
    Функция СозданиеЗаказаКлиента(СтруктураЗаказа=Неопределено)
    Если НЕ ЗначениеЗаполнено(СтруктураЗаказа) Тогда
    Возврат Неопределено;
    КонецЕсли;

    //поиск заказа из отобранных за период

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

    Для каждого ЭлементСтруктуры Из СтруктураЗаказа Цикл //не совсем оптимально, но отредактировал имеющийся свой код для других целей...
    Если ЭлементСтруктуры.Ключ="Таблица" Тогда
    ТаблицаТоваровСтруктура=ЭлементСтруктуры.Значение; //определение структуры товаров для дальнейшей обработки
    КонецЦикла;

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

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

Но вот дошел я таким алгоритмом до 21го числа. Выбирал заказы за 21 число - вывелись они в ТЧ обработки. Выбрал папочку с файлами и нажал обновить заказы из тч, если нужно. В итоге повисла 1с...точнее я ждал - ждал и не дождался. Закрыл ее диспетчером задач. Попытался зайти - висит на окне запуска и даже не доходит до логина. Перезапустил службу 1с8 - зашел успешно в 1с8 - выбрал все так же само и загрузил(обновил) нормально заказы и за 21 число. Тут то пачки файлов явно не виноваты...
В диспетчере задач ресурсы в 100 не валятся
---
тогда только отладчиком ловить или логировать выполнение
---
Понял, каждый цикл конечно работы с файлом проклацать это затруднительно. , тем более, как я заметил, логичного зависания нет...
В принципе все перегрузил уже, но интерестно в чём могла бы быть проблема, ведь явно еще когда то столкнусь.
---
на деле все просто
надо лишь скормить функции НайтиФайлы кучу и замерить выполнение
работа с файловой системой не самый крутой конек 1це
---
Понял, спасибо. Если столкнусь в слудующий раз, то замером проихводительности потестирую.
Ну или если желание появиться:)
---
код может и логичный, но вероятно прожорливый

можем говорить о ценах на гречку пока вы не покажете свое творение
---
Я вот по дням клацаю вручную. Прошел 20 дней и на 21м зависло на перезаписи документов уже.
Отключил диспетчером задач 1с8. Передернул службу сервера 1с8 и только тогда вошел в 1с снова.
Зашел - поставил те же параметры что и перед этим, но уже все грузится в этот день...
Код обработки нужен?
---
Закрепил код в сообщении (8)
---
Код в студию
---
Закрепил в сообщении (8)