• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

перерасчет реквизита документа (7.7)

  • Автор темы Nastyusha
  • Дата начала
N

Nastyusha

Добрый день.

Как правильно сделать обработку для перерасчета реквизита документа?

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

просто зависает 1с

Заранее огромное спасибо за помощь
 
H

Hryv

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

а в документе
Код:
Процедура ПриОткытии()
Если Форма.Параметр="Пересчет" Тогда
// пересчет
...
Записать();
Провести();
Форма.Закрыть();
КонецЕсли
// дальше то что было раньше в ПриОткрытии()
...
КонецПроцедуры
 
V

vbs

Если я правильно понял проблему, может быть, так лучше :

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

Hryv

vbs, а изменение реквизитов где в твоем варианте?
или расчет на то, что НарядЗ.Записать(); вызовет ПриЗаписи() в модуле формы документа?
 
N

Nastyusha

Hryv, а пересчет- здесь ссылка на процедуру из документа ?

Если Форма.Параметр="Пересчет" Тогда
// пересчет
 
H

Hryv

Да, вместо "..." надо подставить вызов нужной процедуры из документа
 
N

Nastyusha

Спасибо, Hryv
вопрос еще один:
в процедуре рентабельность есть такой код:

Если вопрос ("Открыть для ввода данных или для печати (если да- то вводим данные, нет- печатаем)", "Да+Нет+Отмена") = "Нет" Тогда

При записи- пересчитываем рентабельность
Если (НазваниеНабораПрав() = "ВыпискаМенеджер") Или (НазваниеНабораПрав() = "Администратор")Тогда
Рентабельность();

КонецЕсли;


Как сделать так, чтобы при вызове обработки это сообщения не появлялись, а по умолчанию было бы ДА
 
T

TimeDontWait

Код:
Процедура ВызовОбработки()
конт="Да";
ОткрытьФорму("Обработка.ТвояОбработка",конт);
КонецПроцедуры

Процедура ПриОткрытии()
нужноезнач="Да";
Если форма.параметр<>нужноезнач тогда
Если вопрос ("Открыть для ввода данных или для печати (если да- то вводим данные, нет- печатаем)", "Да+Нет+Отмена") = "Нет" Тогда
....
КонецПроцедуры

Что-то в этом роде
 
H

Hryv

В принципе, TimeDontWait правильное дал направление
Но если учесть, что у тебя уже Форма.Параметр="Пересчет", то просто в том месте где:
Если вопрос ("Открыть для ввода данных или для печати (если да- то вводим данные, нет- печатаем)", "Да+Нет+Отмена") = "Нет" Тогда

переделай условие, чтобы при Форма.Параметр="Пересчет" ничего не спрашивалось, а сразу делалось то что тебе надо
 
N

Nastyusha

спасибо, Вам TimeDontWait и Hryv вроде получилось.. :)

сделала так:
Если Форма.Параметр="Пересчет" Тогда
нужноезнач="Да";
Рентабельность() ;


в процедуре рентабельность
...
Если Форма.Параметр<>"Пересчет" Тогда

Если вопрос ("Открыть для ввода данных или для печати (если да- то вводим данные, нет- печатаем)", "Да+Нет+Отмена", 1) = "Нет" Тогда

Правильно переделала?


Правда еще одно сообщение осталось...
Сохранить документ? (Документ будет перепроведен)
 
V

vbs

vbs, а изменение реквизитов где в твоем варианте?
или расчет на то, что НарядЗ.Записать(); вызовет ПриЗаписи() в модуле формы документа?
Да избави Бог. Я просто не стал расписывать изменение реквизитов. Просто намекнул на то, что
использование двух одинаковых объектов должно помочь решить проблему
 
N

Nastyusha

Записать();
Провести();
Форма.Закрыть(0); !!!!!!!!!!!
Так пересчитанные данные сохраняться?

Добавлено: Благодарю всех за помощь.

Без Вас я реально бы не справилась :)
 
V

vbs

vbs, тут, похоже, намеками не помочь
Просто в большинстве случаев совсем нет необходимости лазать в форму документа,
А 2 объекта одинакового типа - простой механизм для изменения реквизитов
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!