• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

перерасчет реквизита документа (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 объекта одинакового типа - простой механизм для изменения реквизитов
 
Мы в соцсетях:

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