Имя: Пароль:
1C
1С v8
пример из "1С: Предприятие 8.2. Практическое пособие разработчика"
0 evilmox
 
29.08.11
17:58
Объясните, пожалуйста, следующий момент в одном из примеров книги "1С: Предприятие 8.2. Практическое пособие разработчика" (Занятие 21. Редактирование движений в форме документа, Листинг 21.2, стр. 634):

Если Не Движения.ОстаткиМатериалов.Выбран() И Не Движения.ОстаткиМатериалов.Модифицированность() Тогда
   Движения.ОстаткиМатериалов.Прочитать();
КонецЕсли;    


В книге дается следующее пояснение:
"... перед установкой даты мы проверяем, был ли прочитан набор записей в свойстве Движения объекта и изменялся ли он. Если оба этих условия ложны, значит набор записей в свойстве Движения объекта пуст, и это состояние не связано с его изменением. В этом случае, чтобы предотвратить ошибочное удаление записей с регистре (перезапись пустым набором значений), мы предварительно читаем движения из регистра в набор записей в свойстве Движения."

Вопрос: если набор записей в свойстве Движения объекта пуст, и это состояние не связано с его изменением - это значит, что в документе не создавалось никаких движений или записывается документ, из которого ранее были удалены все движения и он был записан? Если так, то зачем читать движения (которых вроде бы и нет) и как может случиться это самое "ошибочное удаление записей с регистре (перезапись пустым набором значений)"?

Также замечена на мой дилетантский взгляд странная вещь: предположим следующий сценарий - открывается существующий документ (такой, как описано в книге) и записывается (никаких изменений реквизитов не делается). Метод Движения.ОстаткиМатериалов.Модифицированность() в обработчике события формы документа
1 evilmox
 
29.08.11
17:59
ПередЗаписьюНаСервере возвращает Ложь (как и должно быть), а в обработчике события документа ПередЗаписью возвращает Истина. Почему?
2 Asmody
 
29.08.11
18:05
(1) ответ на этот вопрос на стр. 831
3 Asmody
 
29.08.11
18:12
а условие (0) связано с тем, что может случится, например, программное изменение номера или даты документа (какой-нибудь обработкой), в этом случае свойство Движения у объекта может быть не заполнено. И если это действительно так, то происходит принудительное заполнение, т.е. чтение движений из регистра
4 evilmox
 
29.08.11
18:19
(3) - с этим разобрался, спасибо
(2) - ок, сразу после события формы ПередЗаписьюНаСервере наступает событие документа ПередЗаписью. Почему метод возвращает разные значения?
5 evilmox
 
31.08.11
00:11
Может все-таки кто-нибудь внесет ясность?
6 hhhh
 
31.08.11
00:22
ПередЗаписьюНаСервере набор был пустой, потом вы дали команду

Движения.ОстаткиМатериалов.Прочитать();

теперь он заполнился данными. То есть изменился набор, модифицировался. Чего тут неясного?
7 evilmox
 
31.08.11
20:24
(6) На всякий случай полный текст процедуры:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
   
   // Определить, нужно ли обновлять дату в движениях        
   ОбновитьДатуДвижений = ЭтоНовый() Или Движения.ОстаткиМатериалов.Модифицированность();
   Если Не ОбновитьДатуДвижений Тогда
       // Проверить, что дата документа изменилась
       Запрос = Новый Запрос;
       Запрос.УстановитьПараметр("ТекущийДокумент", Ссылка);
       Запрос.Текст =
       "ВЫБРАТЬ
       | Дата
       |ИЗ
       | Документ.ВводНачальныхОстатковНоменклатуры
       |ГДЕ Ссылка = &ТекущийДокумент";

       Выборка = Запрос.Выполнить().Выбрать();
       Выборка.Следующий();
       ОбновитьДатуДвижений = Выборка.Дата <> Дата;
   КонецЕсли;    
   
   // Установить всем новую дату, если нужно
   Если ОбновитьДатуДвижений Тогда
       Если Не Движения.ОстаткиМатериалов.Выбран() И
       Не Движения.ОстаткиМатериалов.Модифицированность() Тогда
           Движения.ОстаткиМатериалов.Прочитать();
       КонецЕсли;    
       Для Каждого ЗаписьРегистра Из Движения.ОстаткиМатериалов Цикл
           ЗаписьРегистра.Период = Дата;
       КонецЦикла;    
   КонецЕсли;    

КонецПроцедуры


Если перед самой первой операцией написать что-то в духе
ЧтоТо = Движения.ОстаткиМатериалов.Модифицированность();
и на следующей строчке поставить точку останова, открыть уже имеющийся документ и, ничего не меняя, нажать "Записать", то значение переменной ЧтоТо будет равно Истина. И все это задолго до вызова Движения.ОстаткиМатериалов.Прочитать();

http://s2.ipicture.ru/uploads/20110831/VS7mHUUq.jpg
8 d_koz
 
31.08.11
21:45
(0) замечательная книжка, но есть еще ценнее http://v8.1c.ru/metod/books/book.jsp?id=63 , жалко только одно, что господа книгоиздатели из 1с ее не доработали и не выпустили под 8.2 платформу, хотя за нее и 1,2к рублей не пожалел бы из личных средств.
Действительно настольная вещь!
9 Bober
 
01.09.11
02:25
(8) эта книга мутировала в серию книг. и одна из них
10 Bober
 
01.09.11
02:25