• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

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

Neft

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

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

unknown181538

Код:
Синтаксис:
Если <Логическое выражение> Тогда
// Операторы
[ИначеЕсли <Логическое выражение> Тогда]
// Операторы
[Иначе]
// Операторы
КонецЕсли;

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

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

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

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

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

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

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

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

Neft

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


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


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

unknown181538

Код:
Если Согласовано Тогда
 
N

Neft

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

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


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

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


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

unknown181538

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

Neft


Огромное спасибо! Выручили :ya_lamo:
 
D

Darlock

Маленькое "НО", не надо проверять булевый тип на конкретное значение.

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

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

unknown181538

В условия подставляются выражения возвращающие булево.
Если Реквизит1 Тогда
 
N

Neft

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

Так я понял?
 
D

Darlock

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

Так я понял?

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

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

Neft

unknown181538- спасибо за разъяснение )

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

unknown181538

Darlock , а разве с помощью ЗначениеЗаполнено() строка и дата не проверяются?
Или ;) ?
 
D

Darlock

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

evgenyatam

не в любом. если реквизит формы с присоединенным полем ввода - то ЗначениеЗаполнено() работает правильно. а вот если из базы - тогда всегда истина.
 
D

Darlock

не в любом. если реквизит формы с присоединенным полем ввода - то ЗначениеЗаполнено() работает правильно. а вот если из базы - тогда всегда истина.

Если окончательно вдаваться в подробности, то "ЗначениеЗаполнено" появилась только в 8.1. В 8.0 такой функции не было и каждый разработчик проверял по своему. В типовых была глобальная функция"ЗначениеНеЗаполнено()". С выходом 8.1 было информ. письмо в котором говорилось, что используйте "ЗначениеЗаполнено" т.к. работает быстрее.
 
Мы в соцсетях:

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