Добрый день.
Есть постоянный Excel файл в котором есть формулы, данные передаются в него рассчитываются и обратно загружаются в 1с в таб часть документа. Вопрос. Почему может исполняться сервера процедура в цикле?

Факт №1. В файловом варианте отрабатывает все хорошо. Проблема проявляется в клиент-сервере.
Факт №2. С миллионными суммами считает и на клиент-сервере и файловой базе, увеличиваешь до миллиардных и проблема проявляется на клиент-серверном варианте.
Факт №3. Сменил 3 версии платформы не помогает. (8.3.11.3133, 8.3.12.1924, 8.3.13.1513)
Факт №4. Создал константу, в начале процедуры Ложь и пошла исполняться процедура + проверка на истину в начале и возврат, в конце присвоение истины в константу. При возвращении в начало выдает ошибку Post. Проявляется во всех платформах
Факт №5. Процедура не выходит на сторону клиента, но стек вызовов отображает как будто она вызвана с кнопки.

```1c
    &НаСервере
    Процедура КомандаРасчетЭкселНаСервере1()

    Сообщить("Начало "+ТекущаяДата());

    ИмяФайла = "C:\Базы\Амортизация.xlsx";

    Попытка
    XLSОбъектОсновной = Новый COMОбъект("Excel.Application");
    Исключение
    //ПоказатьПредупреждение("Невозможно загрузить MS EXCEL !!!" + Символы.ПС + ОписаниеОшибки(), 10, "Ошибка");
    Возврат ;
    КонецПопытки;
    XLSОбъектКниги = XLSОбъектОсновной.WorkBooks;

    Попытка

    Книга = XLSОбъектКниги.Open(ИмяФайла); // Открыть файл Excel
    Исключение
    //ПоказатьПредупреждение("Невозможно открыть файл " + ИмяФайла + " !!!" + Символы.ПС + ОписаниеОшибки(), 10, "Ошибка");
    Возврат ;
    КонецПопытки;

    Таб = Книга.ActiveSheet;

    Таб.Cells(8,2).Value = Объект.СуммаРазмещения;
    Таб.Cells(9,2).Value = Объект.ЦенаСделки;
    Таб.Cells(13,2).Value = Объект.ЭффективнаяСтавка/100;

    Стр = 16;
    ПропСтр = "16";
    Для Каждого СтрДанные Из Объект.ТабличнаяЧасть Цикл

    Таб.Cells(Стр,1).Value = СтрДанные.ДатаРасчета;
    Таб.Cells(Стр,2).Value = СтрДанные.ДнейВКупонномПериоде;
    Таб.Cells(Стр,3).Value = СтрДанные.ФакторВремени;
    Таб.Cells(Стр,4).Value = СтрДанные.Ставка;
    Таб.Cells(Стр,5).Value = СтрДанные.ДенежныеПотоки;
    Таб.Cells(Стр,7).Value = СтрДанные.НачисленныйКупон;

    ПропСтр= СтрЗаменить(СокрЛП(Стр),Символ(160),") ;
    МинусСтрока = СтрЗаменить(СокрЛП(Стр-1),Символ(160),") ;

    Если Стр=16 Тогда
    Таб.Cells(Стр,9).Value = Объект.Дисконт;
    Таб.Cells(Стр,11).formula = "=K"+МинусСтрока+"-J"+ПропСтр;
    Иначе
    Попытка
    Таб.Cells(Стр,6).formula = "=I"+МинусСтрока;
    Исключение
    //Сообщить(ОписаниеОшибки());
    КонецПопытки;

    Попытка
    Таб.Cells(Стр,8).formula = "=F"+ПропСтр+"*((1+$B$13*C"+ПропСтр+")^(DAYS360(A"+МинусСтрока+",A"+ПропСтр+",1)/B"+ПропСтр+")-1)";
    Исключение
    //Сообщить(ОписаниеОшибки());
    КонецПопытки;

    Попытка
    Таб.Cells(Стр,9).formula = "=F"+ПропСтр+"*(1+$B$13*C"+ПропСтр+")^ (DAYS360(A"+МинусСтрока+",A"+ПропСтр+",1)/B"+ПропСтр+")-E"+ПропСтр;
    Исключение
    // Сообщить(ОписаниеОшибки());
    КонецПопытки;

    КонецЕсли;

    Стр = Стр+1;
    КонецЦикла;

    //Подбор параметров
    Если Объект.Дисконт = 0 Тогда
    Таб.Range("I"+ПропСтр).GoalSeek(0,Таб.Range("I16"));
    КонецЕсли;

    Стр = 16;
    ПредОстатокПремииДисконта = 0;

    Для Каждого СтрДанные Из Объект.ТабличнаяЧасть Цикл
    ПропСтр= СтрЗаменить(СокрЛП(Стр),Символ(160),") ;
    СтрДанные.АмортизированнаяСтоимсотьНаНачалоПериода = Таб.Cells(Стр,6).Value;
    СтрДанные.ПроцентныйДоход = Таб.Cells(Стр,8).Value;
    СтрДанные.АмортизированнаяСтоимсотьНаКонецПериода = Таб.Cells(Стр,9).Value;
    СтрДанные.Амортизация = СтрДанные.ПроцентныйДоход-СтрДанные.НачисленныйКупон;
    Если Стр = 16 Тогда
    СтрДанные.ОстатокПремииДисконта = Объект.СуммаРазмещения-СтрДанные.АмортизированнаяСтоимсотьНаКонецПериода;
    Иначе
    СтрДанные.ОстатокПремииДисконта = ПредОстатокПремииДисконта-СтрДанные.Амортизация;
    КонецЕсли;

    ПредОстатокПремииДисконта = СтрДанные.ОстатокПремииДисконта;
    Стр = Стр+1;
    КонецЦикла;

    XLSОбъектОсновной.DisplayAlerts = 0;
    XLSОбъектОсновной.ActiveWorkbook.Close();
    XLSОбъектОсновной.DisplayAlerts = 1;
    XLSОбъектОсновной.Quit();
    XLSОбъектОсновной = Неопределено;

    Если Объект.ТабличнаяЧасть.Количество()>0 Тогда
    Объект.Дисконт = Объект.ТабличнаяЧасть[0].АмортизированнаяСтоимсотьНаКонецПериода;
    Объект.ОтложенныйНалог = Объект.Дисконт*0.2;
    КонецЕсли;

    Сообщить("Конец "+ТекущаяДата());

    КонецПроцедуры

    &НаКлиенте
    Процедура КомандаРасчетЭксел(Команда)

    КомандаРасчетЭкселНаСервере1();

    КонецПроцедуры
```
---
Тема закрыта, переделал все &НаКлиенте, все заработало.
---
а 1С - не умеет так считать или почему выбран такой способ?
---
в файлой версии бд все прекрасно считается
---
может исполняться сервера процедура в цикле? - уточните как это проявляется
---
1. как вы пришли к выводу, что процедура выполняется циклически?
2.какое время выполнения функции между итерациями?
3. В файловом варианте каково общее время выполнения функции до корректного завершения?
---
1) Отладка;
2) Если в клиент сервере зависает на час потом ошибка Post
3) Если в файловом варианте мин 2.
---
похоже, что у вас через час происходит перезапуск процессов 1С.
Для сохранения результатов используется какой-то созданный с нужными колонками файл?
Что будет, если создать пустой файл и использовать его в качестве "приемника" данных: функция выполнится быстро и до конца или так же "подвиснет" до перезапуска процесса 1С(на час)?
---
уберите в коде Попытки и проверьте.
---
Почему может исполняться сервера процедура в цикле?
---
вот именно никакого цикла нет в помине, но это так
---
Какая процедура у вас в цикле вызывается?
---
та что на сервере КомандаРасчетЭкселНаСервере1
---
На файловом варианте работает потому что на клиенте ИмяФайла = "C:\Базы\Амортизация.xlsx";
- актуально, а на сервере такого файла нет. Надо передавать через хранилище значения или, как самый новый рекомендуемый разработчиками платформы немодальный способ, через НачатьПомещениеФайлаНаСервер().
---
это код, с файловой версии бд, когда проявляется ошибка, там указан сетевой пусть "расшаренной" папки, и да права есть у всех на чтение и запись.
---
А этот Ваш ПропСтр надо заменить на Формат(Стр,""ЧГ="); может миллиарды с этим связаны
---
И вообще избавьтесь от COM объекта, передавайте файл на сервер и читайте с помощью ТабличныйДокумент.Прочитать(). Меньше глюков, больше производительности. И есть возможность скормить таб док построителю запросов и получить таблицу значений.
---
Тз с миллиардами строк это будет веселуха
---
COM просто помрет. реальные примеры были только на 30 тыс. строк. COM помер, ТЗ потупила меньше минуты, но загрузила.
---
У Вас MS Excel одинаковые в файловом варианте и в серверном? Может на сервере Excel староват, миллиарды не тянет?
---
Excel 2016, а вот с миллиардами мб.
---
Тема закрыта, переделал все &НаКлиенте, все заработало.