МГ: сессия от 2010-09-08. 3 части.

Сегодня у нас необычная сессия.

Вопросы будем задавать мы :)

Многие сейчас заняты выполнение финального домашнего задания, не будем их отвлекать.

А для тех, кто уже выполнил финальное ДЗ, у нас есть еще одна разминка для ума. В приведенном видео-файле мы демонстрируем очень интересное поведение платформы “1С:Предприятие 8.2” (кстати, при некоторых условиях такое же поведение можно смоделировать в платформе “1С:Предприятие 8.1”).

Ваша задача – понять что происходит, и написать свою версию в комментариях. А чуть позже я выложу свой видео-ответ.

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.

комментария 24 на “МГ: сессия от 2010-09-08. 3 части.”

  1. Спасибо.
    Этот курс – это огромный труд.
    Спасибо Вам за него.

  2. а как программно определить в каком режиме выполняется проведение? Тогда мы сможем для обычного режима по условию вставить очистку движений

    • Хороший вопрос.
      Есть такой метод глобального контекста – ТекущийРежимЗапуска().
      Но, расстрою вас, этот метод не выход.
      Так как в обычном приложении могут вызываться управляемые форма, а в управляемом (толстом клиенте) – обычные формы.
      Единственный выход – из обычной формы посылать семафор в обработку проведения..

  3. Александр Горлов 09.09.2010 в 17:36

    В общем, все понятно.
    Ключ к разгадке есть в самом видеовопросе. Там показано, что если проводить документ, не закрывая форму – движения дублируются. Если проводить из списка – то все в порядке.
    Для отладки в модуль объекта документа добавил 1 строку кода, чтобы было где поставить точку останова для перехвата момента создания объекта. И вот что выяснил в отладчике:
    1. Пока открыта обычная форма объект документа существует в памяти и не инициализируется вновь. Поэтому повторное проведение в обычной форме добавляет строку движений УЖЕ СУЩЕСТВУЮЩЕМУ ОБЪЕКТУ, у которого уже есть движение в свойстве Движения
    2. Если обычная форма не открывается, тогда при запуске проведения из контекстного меню объект документа создается каждый раз заново (а вместе с ним и свойство Движения). Поэтому повторное проведение все так же добавляет в Движения 1 запись, но само Движения создается вместе с объектом каждый раз вновь.
    3. При работе с управляемой формой объект документа каждый раз инициализируется при обращении к нему, в т.ч. и при нажатии кнопки “Провести” т.е. форма живет отдельно от объекта. И для этого случая справедливы все те же утверждения, что и в п.2. Т.е. движения не дублируются.

  4. Александр Горлов 09.09.2010 в 13:17

    В качестве исходной конфигурации загрузил выгрузку базы с сайта после решения ДЗ №15. И в результате форма документа Поступление товаров открывается в режиме “только просмотр” – нельзя изменить никакие реквизиты. Причем ведь форма эта обычная, генерируемая платформой динамически… В чем может быть проблема?

    • Александр Горлов 09.09.2010 в 16:37

      Более того, все формы всех объектов ткрываются в режиме “только чтение”. Никак не могу понять, что происходит с толстым клиентом обычного приложения?

      • Это нормальное поведение толстого клиента.
        Дело здесь в том, что основной режим запуска – управляемое приложение.
        Поэтому платформа “предохраняется”, чтобы пользователю не были показаны недоступные данные (которые в упр. формах недоступны, например, из-за значений функциональных опций).
        Т.о. чтобы обычная форма имела полный функционал, ее нужно создать, например, как дополнительную форму объекта.

    • Уже ответил вам :)

  5. Константин 08.09.2010 в 20:44

    Удаление проведения : Удалять автоматически при отмене проведения
    Поэтому у обоих регистров должны добавляться записи при каждом проведении, но для регистра остатков используется команда
    Движения.ОстаткиНоменклатуры.Загрузить(Таблица)
    Которая удаляет все прежние движения регистра

  6. Константин Павленко 08.09.2010 в 19:51

    Дополнениие: Чтобы избавиться от дублирования записей в режиме обычного приложения достаточно в начале процедуры СформироватьДвиженияУУ(Взаиморасчеты) добавить строку:
    Взаиморасчеты.Очистить();

  7. Константин Павленко 08.09.2010 в 19:44

    Проблема распадается на три части:
    1. Почему записи добавляются только в РН Взаиморасчеты? Потому что только для набора записей Взаиморасчеты идёт “поштучное” добавление, остальные наборы перезаписываются полностью.
    2. Почему такое возникает в платформе 8.2 и можно ли добиться такого же в платформе 8.1? Потому что только в 8.2 появился режим удаления движений “Удалять автоматически при отмене проведения”. Аналогичного эффекта в 8.1 можно добиться при установке режима “Не удалять автоматически”.
    3. Почему такой эффект возникает только в режиме обычного приложения (в толстом клиенте управляемого приложения эффект не проявляется). Моё предположение – это особенность кэширования движений в обычном приложении. При повторном проведении в открытой форме Движения.Взаиморасчеты (и другие тоже) уже (или ещё) заполнены. Имеется в виду начало обработки проведения. В управляемом приложении такого эффекта нет. Вывод: при проведении документа все наборы записей регистров лучше перезаполнять полностью.

    • >Почему такой эффект возникает только в режиме обычного приложения
      Такой же эффект будет и в толстом клиенте управляемом приложении!!
      Если будет открываться обычная форма, попробуйте.

      • Константин Павленко 08.09.2010 в 20:41

        Да Вы правы. Если назначить основной обычную форму, то открывается именно она и происходит дублирование. Я проверял на управляемой форме в режиме “толстый клиент – управляемое приложение”, дублирования не было. Т.е. эффект зависит от режима формы, а не от режима приложения.

        • Именно, “эффект бабочки” существует только для обычных форм.

  8. Леонид 08.09.2010 в 19:17

    При первом проведении после открытия формы набор записей регистров (например Движения.Продажи) является пустым.
    При повторном нажатии на “провести” набор записей уже содержит все ранее сделанные движения.
    Если открыть и закрыть форму, то при первом проведении набор опять пустой и движения формируются правильно.
    Исходя из этого мне кажется что есть баг с кешированием обычной формы в случае когда движения не удаляются автоматически. В управляемой форме такого не происходит, потому что движения не кешируются на клиенте.

  9. Илья Чернов 08.09.2010 в 18:47

    Мне кажется дела обстоят так:

    Режим обычный:
    1. В форме видимо при получении объекта в объект копирует инфа про движения.

    2. Для всех регистров кроме взаиморасчеты данные грузятся с помощью функции загрузить(), тоесть наборы перезаписывает постоянно, а набор для взаиморасчеты постоянно добавляется.

    (удаление движений нет, стоит удаление только при отмене проведения)

    Режим управляемый.
    1. Форма не в курсе что там с объектом. и ничего лишнего не читает и при проведении наборы не заполняет.

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

    как то так…думаю

    • Илья Чернов 08.09.2010 в 18:59

      в дополнение. п.3.
      Когда проводим из списка в обычным режиме так же движения не читаются.

  10. Константин Павленко 08.09.2010 в 18:19

    А музыка зачем? Мешает воспринимать текст. Или это “условия, приближенные к боевым”?

    • Вначале хотел без комментариев показывать, потом не удержался и стал рассказывать ))

  11. 1. Когда мы проводим документ из открытой управляемой формы, мы каждый раз идем на сервер. И очередное обращение на сервер не помнит о предыдущем, т.е. контекст модуля объекта документа каждый раз новый. Поэтому свойство Движения.Взаиморасчеты не имеет строк, пока их явно не прочтем.
    2. При перепроведении из обычной формы в обычном приложении модуль объекта исполняется на локальном компьютере. Пока форма открыта контекст модуля объекта не “обнуляется” и все его свойства и переменные актуальны. Поэтому свойство Движения.Взаиморасчеты содержит все созданные ранее строки, пока мы их явно не очистим или не применим метод Загрузить.

  12. Мое мнение
    1. у документа ПТУ
    регистры :
    -Закупки
    -Остатки
    -Хозрасчетный
    заполняются через метод загрузить, тем самы набор записей очищается!
    в Регистр же Взаиморасчеты, записи просто добавляются, это объясняет почему в других регистрах, дублей не происходит

    2. По самим дублям
    В документе ПТУ удаление движений стоит в
    “Удалять автоматически при отмене проведения”
    меняем на станд. для 8.1 “Удалять автоматически” дублей не возникает

    ТАКОЕ ощущение, что когда вы нажимали провести (снова и снова) отмены ПРОВЕДЕНИЯ документа не проводилось ИМЕННО в толстом клиенте, и там самым событие указанное в параметре “Удалять движения” не возникало и записи в регистр добавлялись!

    PS
    доп. ещё выяснилось, то что если открыть форму напроводить раз 10 в итоге 10 записей в регистр, затем закрыть форму, открыть заново и провести то записи удаляются, а затем снова описанный вами эффект.

    ИЗ всего делаю предположение:

    1. Зависимость вида удаления движений в частности “Удалять автоматически при отмене проведения” от режима работы.
    для толстого клиента не работает, либо событие из толстой формы при повторном проведении не возникает отмены проведения

    • >доп. ещё выяснилось, то что если открыть форму напроводить раз 10 в итоге 10 записей в регистр, затем закрыть форму, открыть заново и провести то записи удаляются, а затем снова описанный вами эффект.
      Это верное наблюдение.

  13. Филимонов Юрий 08.09.2010 в 16:46

    Насколько я понимаю физику процесса проблема в следующем – у документа “Поступление товаров” стоит признак “Удалять движения при отмене проведения”. Это означает, что при перепроведении набор записей автоматически не очищается.
    Особенность платформы заключается в том, что если есть открытая форма документа, то объект документа является считанным и находится в оперативной памяти, включая его движения, поэтому и получается дублирование записей (по регистру взаиморасчеты идет добавление записей, а не загрузка как по регистру остатки). Если же мы проводим документ из списка, то в форме просмотра движений платформа считывает только набор записей, не связывая его с документом-объектом и поэтому в модуле объекта в начале проведения движения остаются пустыми.

    В платформе 8.1 подобного поведения можно добиться если автоматическое удаление движений отключено, а обработка удаления проведения не написана.