Задание условий для движений документа по регистрам

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

Neft

#1
Друзья, помогите плиз!

Имеется документ с двумя реквизитами, пусть будет РЕК1 и РЕК2 оба реквизита со значением БУЛЕВО, документ имеет движения в двух регистрах (РЕГ1 и РЕГ2). Что необходимо прописать в модуле (не считая стандартной записи формирования движений по регистрам) для того чтобы приналичии значения ИСТИНА по РЕК1 документ попадал в первый регистр (РЕГ1), если по двум реквизитам значение ИСТИНА документ попадал только во второй регистр (РЕГ2). Помогите, пожалуйста.
 

unknown181538

НеГуру
28.12.2008
1 417
0
#2
Код:
Синтаксис:
Если <Логическое выражение> Тогда
// Операторы
[ИначеЕсли <Логическое выражение> Тогда]
// Операторы
[Иначе]
// Операторы
КонецЕсли;

Англоязычный синтаксис:
If <Логическое выражение> Then
// Операторы
[ElsIf <Логическое выражение> Then]
// Операторы
[Else ]
// Операторы
EndIf;

Параметры:
<Логическое выражение>
Логическое выражение.

Тогда
Операторы, следующие за Тогда выполняются, если результатом логического выражения является значение Истина.

// Операторы
Исполняемый оператор или последовательность таких операторов.

ИначеЕсли
Логическое выражение, следующее за ключевым словом ИначеЕсли, вычисляется только тогда, когда условия в Если и всех предшествующих ИначеЕсли оказались равны Ложь. 
Операторы, следующие за конструкцией ИначеЕсли — Тогда, выполняются, если результат логического выражения в данном ИначеЕсли равен Истина.

Иначе
Операторы, следующие за ключевым словом Иначе, выполняются, если результаты логических выражений в конструкции Если и всех предшествующих конструкцях ИначеЕсли оказались равны Ложь.

КонецЕсли
Ключевое слово, которое завершает структуру оператора условного выполнения.

Описание:
Оператор Если управляет выполнением программы, основываясь на результате одного или более логических выражений. Оператор может содержать любое количество групп операторов, возглавляемых конструкциями ИначеЕсли — Тогда.
 
N

Neft

#3
я делаю следующюу процедуру проведения


Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Для Каждого ТекСтрокаСостав Из Состав Цикл
// регистр ЗаявкаСогласовано Приход
Движение = Движения.ЗаявкаСогласовано.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Согласовано = Согласовано;
Движение.Сумма = ТекСтрокаСостав.Сумма;
КонецЦикла;
Если Документы.Заявка.Согласовано = Истина Тогда
Для Каждого ТекСтрокаСостав Из Состав Цикл
// регистр ЗаявкаУтверждено Приход
Движение = Движения.ЗаявкаУтверждено.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Утверждено = Утверждено;
Движение.Сумма = ТекСтрокаСостав.Сумма;
КонецЦикла;
КонецЕсли
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры


Понимаю что это не правильно но как задать условие для реквизита документа я не знаю. Можно было бы поля "Согласовано" и "утверждено" перенести в табличную часть документа- при таком повороте расписать отдельное движение по регистрам вроде бы не проблема. но как сделать условие именно на реквизит документа с типом БУЛЕВО, помогите плиз?
 
N

Neft

#5
получается следлующая процедура

Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Для Каждого ТекСтрокаСостав Из Состав Цикл
// регистр ЗаявкаСогласовано Приход
Движение = Движения.ЗаявкаСогласовано.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Согласовано = Согласовано;
Движение.Сумма = ТекСтрокаСостав.Сумма;
КонецЦикла;
Если Согласовано = Истина Тогда
Для Каждого ТекСтрокаСостав Из Состав Цикл
// регистр ЗаявкаУтверждено Приход
Движение = Движения.ЗаявкаУтверждено.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Утверждено = Утверждено;
Движение.Сумма = ТекСтрокаСостав.Сумма;
КонецЦикла;
КонецЕсли
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры


но опять документы попадают в оба регисра (((

Добавлено: unknown181538
громадное спасибо до перло вот правильная процедура
Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Для Каждого ТекСтрокаСостав Из Состав Цикл
// регистр ЗаявкаСогласовано Приход
Движение = Движения.ЗаявкаСогласовано.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Согласовано = Согласовано;
Движение.Сумма = ТекСтрокаСостав.Сумма;
КонецЦикла;
Если Согласовано = Истина Тогда
Если Утверждено = Истина Тогда
Для Каждого ТекСтрокаСостав Из Состав Цикл
// регистр ЗаявкаУтверждено Приход
Движение = Движения.ЗаявкаУтверждено.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Утверждено = Утверждено;
Движение.Сумма = ТекСтрокаСостав.Сумма;
КонецЦикла;
КонецЕсли
КонецЕсли
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры


Один вопрос только остался: то есть если в процедуре проведения указать наименование реквизита (согласовано, утверждено) прграмма сама чтоль понимает что это реквизит именно этого документа ?
 

unknown181538

НеГуру
28.12.2008
1 417
0
#6
Один вопрос только остался: то есть если в процедуре проведения указать наименование реквизита (согласовано, утверждено) прграмма сама чтоль понимает что это реквизит именно этого документа
Да.
Точно так же и в модуле формы.
 

Darlock

Well-known member
04.01.2008
560
1
#8
Маленькое "НО", не надо проверять булевый тип на конкретное значение.

Если Согласовано = Истина Тогда
1) атавизм из 7.7
2) не красиво читать, закрадываются сомнения о типе переменной

unknown181538 правильно ответил вам, с точки зрения оптимальности производительности платформы.
 

unknown181538

НеГуру
28.12.2008
1 417
0
#11
В условия подставляются выражения возвращающие булево.
Если Реквизит1 Тогда
 
N
#12
То есть для реквизита( поля табличной части) с типом булево не обязательно прописывать его значение (истина или ложь) - программа сама понимает что Если Рек1 Тогда // произойдет призначении истина// Иначе // это произойдет для значения ложь//

Так я понял?
 

Darlock

Well-known member
04.01.2008
560
1
#14
То есть для реквизита( поля табличной части) с типом булево не обязательно прописывать его значение (истина или ложь) - программа сама понимает что Если Рек1 Тогда // произойдет призначении истина// Иначе // это произойдет для значения ложь//

Так я понял?
Все верно. Также можно проверять заполненность полей других типов, с помощью соответствующих функций:

для типа "Строка" -
Код:
ПустаяСтрока(Строка)
для всех остальных, кроме даты и мутабельных типов -
Код:
ЗначениеЗаполнено(Переменная)
дата проверяется, к сожалению, так
Код:
Переменная = Дата('00010101')
 
N
#15
unknown181538- спасибо за разъяснение )

Darlock- спасибо очень простые полезные вещицы- учту
 

unknown181538

НеГуру
28.12.2008
1 417
0
#16
Darlock , а разве с помощью ЗначениеЗаполнено() строка и дата не проверяются?
Или ;) ?
 

Darlock

Well-known member
04.01.2008
560
1
#17
Darlock , а разве с помощью ЗначениеЗаполнено() строка и дата не проверяются?
Или ;) ?
Строку можно проверить, а вот с датой - нихт. Прикол платформы пустая дата (в клиентской части все данные это представление данных) - она же заполненая дата только 01.01.0001 и в любом случае будет истина.
 

evgenyatam

Well-known member
07.09.2007
175
0
#18
не в любом. если реквизит формы с присоединенным полем ввода - то ЗначениеЗаполнено() работает правильно. а вот если из базы - тогда всегда истина.
 

Darlock

Well-known member
04.01.2008
560
1
#19
не в любом. если реквизит формы с присоединенным полем ввода - то ЗначениеЗаполнено() работает правильно. а вот если из базы - тогда всегда истина.
Если окончательно вдаваться в подробности, то "ЗначениеЗаполнено" появилась только в 8.1. В 8.0 такой функции не было и каждый разработчик проверял по своему. В типовых была глобальная функция"ЗначениеНеЗаполнено()". С выходом 8.1 было информ. письмо в котором говорилось, что используйте "ЗначениеЗаполнено" т.к. работает быстрее.