Автор Тема: Очистка движений при оперативном и неоперативном проведении  (Прочитано 17882 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Random4Fun

  • Пользователь
  • **
  • Сообщений: 22
У меня нет четкого представления, как делать правильно. Посмотрите и поправьте.
Старая методика:
Удаление движений - Удалять автоматически при отмене проведения;
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.ОстаткиНоменклатуры.Очистить();

Если Режим = РежимПроведенияДокумента.Оперативный Тогда
Движения.ОстаткиНоменклатуры.Записать();
КонецЕсли;

Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
1. Правильно ли?

Новая методика:
Удаление движений - Удалять автоматически при отмене проведения;
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.ОстаткиНоменклатуры.Очистить();

Если РежимПроведения = Режим.Оперативный Тогда
МоментВремени= '00010101';
Иначе
МоментВремени= Новый Граница(МоментВремени(), ВидГраницы.Включая);
КонецЕсли;
Запрос.УстановитьПараметр("МоментВремени", МоментВремени);
1. Правильно ли?


На экзамене я слышал, что Аксенов спрашивает: "Зачем вы очищаете движения?". У кого был опыт, про что он?

q10n1k

  • Новичок
  • *
  • Сообщений: 4
Четкого представления о том как правильно возможно нет даже у эказменаторов).

Про Очистить()
Как я понимаю платформа при режиме "Удалять автоматически при отмене проведения" удаляет движения либо если мы явно ей говорим Движения.Записать(), либо после процедуры ОбработкаПроведения(тогда она сама вызывает этот метод)
При старой методике мы выполняем запрос до того как записываем движения и документ.  Соответственно могут попасть неочищенные записи нашего документа. При новой методике мы записываем движения в базу (при этом платформа очищает старые) и затем формируем запрос, на результат которого будут влиять только "правильные записи". Поэтому видимо очищать предварительно движения не нужно (иначе получается двойная очистка).
После Очистить() можно еще вызвать Записать() чтоб наверняка удалить ненужное(при старой методике)

Про МоментВремени
Используйте конструкцию ?(РежимПроведения = Режим.Оперативный, Неопределено, МоментВремени(либо Граница)). По крайней мере она занимает меньше времени на ее создание чем конструкции с Если (А время на экзамене очень ценно). Ну и вместо '00010101' лучше использовать Неопределено.
« Последнее редактирование: Февраль 15, 2016, 02:15:29 pm от q10n1k »


CeHbKA

  • Пользователь
  • **
  • Сообщений: 88
Очищать движения стоит для того, чтобы избежать казусов при перепроведении документа с изменением даты.
Свойство в документе стоит оставлять штатное "Удалять автоматически при отмене проведения".

В коде всё очень просто:

//1 - Очистим предыдущие движения
//Это нужно для того, чтобы при перепроведении если у документа сменили дату, предыдущие движения не подцепились

Движения.ОстаткиНоменклатуры.Очистить(); // эта строка не нужна, т.к. Записать() записывает пустые движения
Движения.ОстаткиНоменклатуры.Записать();

//5 - Оперативное или неоперативное проведение
//Здесь определяется параметр даты в запросах
//Использовать дату документа категорически ЗАПРЕЩЕНО
Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
МоментИтогов = '00010101';
Иначе
МоментИтогов = Новый Граница(МоментВремени(),ВидГраницы.Включая);
КонецЕсли;


ddwarf

  • Новичок
  • *
  • Сообщений: 3
В рамках экзамена достаточно
Для старой методики:

Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.ОстаткиНоменклатуры.Записать(); // Очищаем движения записью пустого набора, чтобы получить остатки без учета движения этого документа при его же перепроведении.

Запрос.УстановитьПараметр("МоментВремени", МоментВремени());

Для новой методики:

Движения.ОстаткиНоменклатуры.Записывать = Истина;

// Формируем движения

Движения.ОстаткиНоменклатуры.БлокироватьДляИзмененния = Истина;
Движения.ОстаткиНоменклатуры.Записать();

// Проверка остатков на МоментВремени= Новый Граница(МоментВремени(), ВидГраницы.Включая);

CeHbKA

  • Пользователь
  • **
  • Сообщений: 88
ddwarf , не нужно мешать всё в кучу.
Старая и новая методики проведения - это отдельная песня.

Принципы оперативного и неоперативного проведения едины. А именно:
1 - очищаем движения
2 - работаем с моментом времени

Random4Fun

  • Пользователь
  • **
  • Сообщений: 22
Есть еще пара вопросов:
1. В старой методике и в БУ нужно использовать
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());или
Запрос.УстановитьПараметр("МоментВремени", ?(Режим = РежимПроведенияДокумента.Оперативный, Неопределено, МоментВремени()));?

2. Нужно ли Записывать пустые движения в БУ
Движения.Управленческий.Записывать = Истина;
Движения.Управленческий.Записать();
?
Думаю, что нужно только при оперативном проведении.
« Последнее редактирование: Февраль 16, 2016, 12:32:26 pm от Random4Fun »

CeHbKA

  • Пользователь
  • **
  • Сообщений: 88
1. Чем отличается старая методика списания от новой?
В старой - сначала читаем, потом пишем
В новой - сначала пишем, потом читаем.
Теперь подумайте, причем тут оперативное\неоперативное проведение и МоментВремени()

2. Очищать движения нужно ВСЕГДА. В ОУ, БУ и СПР.

zorky

  • Проверенный
  • ***
  • Сообщений: 222
  • ФИО: ЗЖВ
1. Чем отличается старая методика списания от новой?
В старой - сначала читаем, потом пишем
В новой - сначала пишем, потом читаем.
Теперь подумайте, причем тут оперативное\неоперативное проведение и МоментВремени()

2. Очищать движения нужно ВСЕГДА. В ОУ, БУ и СПР.

на случай если стоит галочка в УФ "Использовать всегда", нужно очищать везде да.
если галочки нету, по умолчанию в УФ  - то очищать вообще нигде не нужно(только для УФ).
Поэтому, для подстраховки от галочки, или при использовании этой же конфигурации но в обычных формах, пишем "очистить"...

думаю на экзамене нужно продемонстрировать понимание этого, или кто-то сдавал без "очистить"? С оговоркой что без Галочки, и строго на УФ?

EMelihoff

  • Пользователь
  • **
  • Сообщений: 29
  • ФИО: Sanya
НЕ ПИШИ ТАК НА ЭКЗАМЕНЕ!
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
   Движения.ОстаткиНоменклатуры.Записать();
пиши так:
     Движения.ОстаткиНоменклатуры.Записать();
Я уточнял!!!!Не делай мои ошибки )

CeHbKA

  • Пользователь
  • **
  • Сообщений: 88
НЕ ПИШИ ТАК НА ЭКЗАМЕНЕ!
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
   Движения.ОстаткиНоменклатуры.Записать();
пиши так:
     Движения.ОстаткиНоменклатуры.Записать();
Я уточнял!!!!Не делай мои ошибки )
Все верно, движения очищать нужно всегда. Вне зависимости от оперативного или неоперативного проведения.

Andres

  • Гость
Движения.Записывать = истина;
Движения.Очистить;  если не стоит удалять движ автоматом
Движения.Записать.


смотрите типовой пример .в задачнике там явно все показано.что и как.

Bennington

  • Пользователь
  • **
  • Сообщений: 11
Подниму. Объясните пожалуйста.
Какой смысл проверять на режим проведения,если мы перед выполнением запроса чистим наборы записей?

Движения.ИмяРегистра.Записывать = истина;
Движения.ИмяРегистра.Записать(); // Очистили набор записей

//В данном случае для нас уже не имеет смысла, оперативное или неоперативное проведение. Если это старая методика, то даже если это оперативное проведение и момент времени смещается, то мы не получим текущие записи регистра(т.к уже очистили их). Пишем просто МоментВремени();

А если новая метода, то включаем границу времени.

Другое дело, если мы не хотим чистить набор записи, тогда имеет смысл проверить на режим проведения:
//использую старую методику
Движения.ИмяРегистра.Записывать = Истина;
//Движения.ИмяРегистра.записать();В данной ситтуации я не вижу смысла очищать набор(нет необходимости для блокировки, т.к. в наборе есть старые записи).
//И только если режим проведения оперативный, тогда я вынужен почистить набор.

Если РежимПроведения = РежимПроведенияДокумента.Оперативный тогда
//Устанавливаю блокировку на старые записи
Движения.БлокироватьДляИзменения = истина;
Движения.ИмяРегистра.записать();

Запрос.УстановитьПараметр("МоментВремени",МоментВремени());



Bennington

  • Пользователь
  • **
  • Сообщений: 11
Очищать движения стоит для того, чтобы избежать казусов при перепроведении документа с изменением даты.
Свойство в документе стоит оставлять штатное "Удалять автоматически при отмене проведения".

В коде всё очень просто:

//1 - Очистим предыдущие движения
//Это нужно для того, чтобы при перепроведении если у документа сменили дату, предыдущие движения не подцепились

Движения.ОстаткиНоменклатуры.Очистить(); // эта строка не нужна, т.к. Записать() записывает пустые движения
Движения.ОстаткиНоменклатуры.Записать();

//5 - Оперативное или неоперативное проведение
//Здесь определяется параметр даты в запросах
//Использовать дату документа категорически ЗАПРЕЩЕНО
Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
МоментИтогов = '00010101';
Иначе
МоментИтогов = Новый Граница(МоментВремени(),ВидГраницы.Включая);
КонецЕсли;

Вот и зачем проверять на режим проведения, если записали пустой набор? старые записи не подцепятся

kvt500

  • Проверенный
  • ***
  • Сообщений: 159
  • ФИО: kvt500
А если я, вместо всей этой лабуды, на вкладке движения установлю способ удаления движений "Удалять автоматически". Это будет неправильно?

Bennington

  • Пользователь
  • **
  • Сообщений: 11
А если я, вместо всей этой лабуды, на вкладке движения установлю способ удаления движений "Удалять автоматически". Это будет неправильно?
http://1c.chistov.pro/2013/07/blog-post_25.html
пункт 2