МГ: сессия от 2010-09-08. 3 части.
Сегодня у нас необычная сессия.
Вопросы будем задавать мы :)
Многие сейчас заняты выполнение финального домашнего задания, не будем их отвлекать.
А для тех, кто уже выполнил финальное ДЗ, у нас есть еще одна разминка для ума. В приведенном видео-файле мы демонстрируем очень интересное поведение платформы “1С:Предприятие 8.2” (кстати, при некоторых условиях такое же поведение можно смоделировать в платформе “1С:Предприятие 8.1”).
Ваша задача – понять что происходит, и написать свою версию в комментариях. А чуть позже я выложу свой видео-ответ.
Спасибо.
Этот курс – это огромный труд.
Спасибо Вам за него.
а как программно определить в каком режиме выполняется проведение? Тогда мы сможем для обычного режима по условию вставить очистку движений
Хороший вопрос.
Есть такой метод глобального контекста – ТекущийРежимЗапуска().
Но, расстрою вас, этот метод не выход.
Так как в обычном приложении могут вызываться управляемые форма, а в управляемом (толстом клиенте) – обычные формы.
Единственный выход – из обычной формы посылать семафор в обработку проведения..
В общем, все понятно.
Ключ к разгадке есть в самом видеовопросе. Там показано, что если проводить документ, не закрывая форму – движения дублируются. Если проводить из списка – то все в порядке.
Для отладки в модуль объекта документа добавил 1 строку кода, чтобы было где поставить точку останова для перехвата момента создания объекта. И вот что выяснил в отладчике:
1. Пока открыта обычная форма объект документа существует в памяти и не инициализируется вновь. Поэтому повторное проведение в обычной форме добавляет строку движений УЖЕ СУЩЕСТВУЮЩЕМУ ОБЪЕКТУ, у которого уже есть движение в свойстве Движения
2. Если обычная форма не открывается, тогда при запуске проведения из контекстного меню объект документа создается каждый раз заново (а вместе с ним и свойство Движения). Поэтому повторное проведение все так же добавляет в Движения 1 запись, но само Движения создается вместе с объектом каждый раз вновь.
3. При работе с управляемой формой объект документа каждый раз инициализируется при обращении к нему, в т.ч. и при нажатии кнопки “Провести” т.е. форма живет отдельно от объекта. И для этого случая справедливы все те же утверждения, что и в п.2. Т.е. движения не дублируются.
Отличный анализ!
В качестве исходной конфигурации загрузил выгрузку базы с сайта после решения ДЗ №15. И в результате форма документа Поступление товаров открывается в режиме “только просмотр” – нельзя изменить никакие реквизиты. Причем ведь форма эта обычная, генерируемая платформой динамически… В чем может быть проблема?
Более того, все формы всех объектов ткрываются в режиме “только чтение”. Никак не могу понять, что происходит с толстым клиентом обычного приложения?
Это нормальное поведение толстого клиента.
Дело здесь в том, что основной режим запуска – управляемое приложение.
Поэтому платформа “предохраняется”, чтобы пользователю не были показаны недоступные данные (которые в упр. формах недоступны, например, из-за значений функциональных опций).
Т.о. чтобы обычная форма имела полный функционал, ее нужно создать, например, как дополнительную форму объекта.
Уже ответил вам :)
Удаление проведения : Удалять автоматически при отмене проведения
Поэтому у обоих регистров должны добавляться записи при каждом проведении, но для регистра остатков используется команда
Движения.ОстаткиНоменклатуры.Загрузить(Таблица)
Которая удаляет все прежние движения регистра
Дополнениие: Чтобы избавиться от дублирования записей в режиме обычного приложения достаточно в начале процедуры СформироватьДвиженияУУ(Взаиморасчеты) добавить строку:
Взаиморасчеты.Очистить();
Проблема распадается на три части:
1. Почему записи добавляются только в РН Взаиморасчеты? Потому что только для набора записей Взаиморасчеты идёт “поштучное” добавление, остальные наборы перезаписываются полностью.
2. Почему такое возникает в платформе 8.2 и можно ли добиться такого же в платформе 8.1? Потому что только в 8.2 появился режим удаления движений “Удалять автоматически при отмене проведения”. Аналогичного эффекта в 8.1 можно добиться при установке режима “Не удалять автоматически”.
3. Почему такой эффект возникает только в режиме обычного приложения (в толстом клиенте управляемого приложения эффект не проявляется). Моё предположение – это особенность кэширования движений в обычном приложении. При повторном проведении в открытой форме Движения.Взаиморасчеты (и другие тоже) уже (или ещё) заполнены. Имеется в виду начало обработки проведения. В управляемом приложении такого эффекта нет. Вывод: при проведении документа все наборы записей регистров лучше перезаполнять полностью.
>Почему такой эффект возникает только в режиме обычного приложения
Такой же эффект будет и в толстом клиенте управляемом приложении!!
Если будет открываться обычная форма, попробуйте.
Да Вы правы. Если назначить основной обычную форму, то открывается именно она и происходит дублирование. Я проверял на управляемой форме в режиме “толстый клиент – управляемое приложение”, дублирования не было. Т.е. эффект зависит от режима формы, а не от режима приложения.
Именно, “эффект бабочки” существует только для обычных форм.
При первом проведении после открытия формы набор записей регистров (например Движения.Продажи) является пустым.
При повторном нажатии на “провести” набор записей уже содержит все ранее сделанные движения.
Если открыть и закрыть форму, то при первом проведении набор опять пустой и движения формируются правильно.
Исходя из этого мне кажется что есть баг с кешированием обычной формы в случае когда движения не удаляются автоматически. В управляемой форме такого не происходит, потому что движения не кешируются на клиенте.
Мне кажется дела обстоят так:
Режим обычный:
1. В форме видимо при получении объекта в объект копирует инфа про движения.
2. Для всех регистров кроме взаиморасчеты данные грузятся с помощью функции загрузить(), тоесть наборы перезаписывает постоянно, а набор для взаиморасчеты постоянно добавляется.
(удаление движений нет, стоит удаление только при отмене проведения)
Режим управляемый.
1. Форма не в курсе что там с объектом. и ничего лишнего не читает и при проведении наборы не заполняет.
2. при проведении данные перезаписываются в не зависимости что там в базе, причем только изменения.
как то так…думаю
в дополнение. п.3.
Когда проводим из списка в обычным режиме так же движения не читаются.
А музыка зачем? Мешает воспринимать текст. Или это “условия, приближенные к боевым”?
Вначале хотел без комментариев показывать, потом не удержался и стал рассказывать ))
1. Когда мы проводим документ из открытой управляемой формы, мы каждый раз идем на сервер. И очередное обращение на сервер не помнит о предыдущем, т.е. контекст модуля объекта документа каждый раз новый. Поэтому свойство Движения.Взаиморасчеты не имеет строк, пока их явно не прочтем.
2. При перепроведении из обычной формы в обычном приложении модуль объекта исполняется на локальном компьютере. Пока форма открыта контекст модуля объекта не “обнуляется” и все его свойства и переменные актуальны. Поэтому свойство Движения.Взаиморасчеты содержит все созданные ранее строки, пока мы их явно не очистим или не применим метод Загрузить.
Мое мнение
1. у документа ПТУ
регистры :
-Закупки
-Остатки
-Хозрасчетный
заполняются через метод загрузить, тем самы набор записей очищается!
в Регистр же Взаиморасчеты, записи просто добавляются, это объясняет почему в других регистрах, дублей не происходит
2. По самим дублям
В документе ПТУ удаление движений стоит в
“Удалять автоматически при отмене проведения”
меняем на станд. для 8.1 “Удалять автоматически” дублей не возникает
ТАКОЕ ощущение, что когда вы нажимали провести (снова и снова) отмены ПРОВЕДЕНИЯ документа не проводилось ИМЕННО в толстом клиенте, и там самым событие указанное в параметре “Удалять движения” не возникало и записи в регистр добавлялись!
PS
доп. ещё выяснилось, то что если открыть форму напроводить раз 10 в итоге 10 записей в регистр, затем закрыть форму, открыть заново и провести то записи удаляются, а затем снова описанный вами эффект.
ИЗ всего делаю предположение:
1. Зависимость вида удаления движений в частности “Удалять автоматически при отмене проведения” от режима работы.
для толстого клиента не работает, либо событие из толстой формы при повторном проведении не возникает отмены проведения
>доп. ещё выяснилось, то что если открыть форму напроводить раз 10 в итоге 10 записей в регистр, затем закрыть форму, открыть заново и провести то записи удаляются, а затем снова описанный вами эффект.
Это верное наблюдение.
Насколько я понимаю физику процесса проблема в следующем – у документа “Поступление товаров” стоит признак “Удалять движения при отмене проведения”. Это означает, что при перепроведении набор записей автоматически не очищается.
Особенность платформы заключается в том, что если есть открытая форма документа, то объект документа является считанным и находится в оперативной памяти, включая его движения, поэтому и получается дублирование записей (по регистру взаиморасчеты идет добавление записей, а не загрузка как по регистру остатки). Если же мы проводим документ из списка, то в форме просмотра движений платформа считывает только набор записей, не связывая его с документом-объектом и поэтому в модуле объекта в начале проведения движения остаются пустыми.
В платформе 8.1 подобного поведения можно добиться если автоматическое удаление движений отключено, а обработка удаления проведения не написана.