8.х Вызов процедуры модуля формы документа из "Подписки на события"

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем shurikvz, 5 май 2010.

  1. TopicStarter Overlay
    shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Доброго дня.

    Вопрос, в следующем:
    Создаю "Подписку на события", на событие перед записью документа. Суть процедуры в подписке в том, чтобы перед записью документа проверить номенклатуру в этом док-те и при необходимости по определенным условиям заменить один договор контрагента в док-те на другой. Поскольку в процедуру вызываемую по подписке передается док-т объект, то договор поменять не проблема, но встал такой вопрос: ведь при изменении договора (я имею ввиду если мы меняем его при эмм.. интерактивном вводе документа), вызывается процедура "ПриИзмененииДоговора()", а как вызвать эту процедуру при изменении договора из подписки? И второе - насколько скажем так методологически верно это будет выглядеть?
  2. gosn1ck
    Offline

    gosn1ck Опытный в 1С

    Регистрация:
    13 авг 2009
    Сообщения:
    1.329
    Симпатии:
    1
    Баллы:
    26
    определите условие при котором надо менять договор и вызывайте свою процедуру в подписке (в процедуре перед записью документа).
  3. TopicStarter Overlay
    shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Это понятно. Поясню: на данный момент сама процедура изменения договора находится в модуле формы документа в процедуре "ПередЗаписью()", оттуда вызвать процедуру "ПриИзмененииДоговора()" этого же самого документа - не составляет естественно никаких проблем. Цель - вынести эту процедуру в "Подписку на событие" (поскольку таких документов несколько - для облегчения обновления конфигурации, кроме того удобнее когда все в одном месте). Возможно ли из "Подписки на событие" вызвать процедуру формы документа (она идет без слова ЭКСПОРТ).
  4. gosn1ck
    Offline

    gosn1ck Опытный в 1С

    Регистрация:
    13 авг 2009
    Сообщения:
    1.329
    Симпатии:
    1
    Баллы:
    26
    разберитесь с подписками на событие
    при создании новой вы выбираете объекты для подписки и событие при котором вызывается обработчик. обработчик - вызываемая функция. откройте любую типовую конфу и поглядите.
  5. TopicStarter Overlay
    shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Я понимаю это.. :) Как в этой процедуре вызвать процедуру формы объекта?
  6. gosn1ck
    Offline

    gosn1ck Опытный в 1С

    Регистрация:
    13 авг 2009
    Сообщения:
    1.329
    Симпатии:
    1
    Баллы:
    26
    забудьте про модуль формы. сделайте процедуру в подписке
  7. TopicStarter Overlay
    shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Стандартная процедура модуля формы документа:
    Код:
    // Процедура выполняет необходимые действия при изменении договора взаиморасчетов
    // с контрагентом.
    //
    Процедура ПриИзмененииДоговора()
    
    СпособЗаполненияЦен = Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатуры;
    
    // Зададим, какие реквизиты надо редактировать.
    СтруктураРеквизитовДокумента = Ценообразование.ПолучитьСтруктуруРеквизитовДокументаДляЦенообразования(ЭтотОбъект);
    
    ЗаполнениеДокументов.ПриИзмененииЗначенияДоговора(ЭтотОбъект, мТекущаяВалютаВзаиморасчетов, мВалютаРегламентированногоУчета, СпособЗаполненияЦен, СтруктураРеквизитовДокумента, "Продажа", "Товары", мТекущийДоговорКонтрагента);
    
    ЕстьКолонкаЗаказ = УправлениеЗаказами.ЕстьЗаказВТабличнойЧасти(ВидОперации, ДоговорКонтрагента, "Реализация");
    Если ЕстьКолонкаЗаказ Тогда
    УправлениеЗаказами.ПроверитьИОчиститьЗаказВТабличнойЧастиПриИзмененииДоговора(ДоговорКонтрагента, Товары, "ЗаказПокупателя");
    УправлениеЗаказами.ПроверитьИОчиститьЗаказВТабличнойЧастиПриИзмененииДоговора(ДоговорКонтрагента, ВозвратнаяТара, "ЗаказПокупателя");
    УправлениеЗаказами.ПроверитьИОчиститьЗаказВТабличнойЧастиПриИзмененииДоговора(ДоговорКонтрагента, Услуги, "ЗаказПокупателя");
    КонецЕсли;
    
    мТекущаяВалютаВзаиморасчетов = ДоговорКонтрагента.ВалютаВзаиморасчетов;
    РаботаСДиалогами.СформироватьНадписьДолга(ДоговорКонтрагента, Сделка, ЭлементыФормы.ИнфНадписьДолга, Ссылка, Истина);
    УстановитьЗаголовкиПоДоговору();
    ЗаполнениеДокументов.УстановитьТипСделки(ЭтотОбъект, Истина);
    
    СчетаУчетаВДокументах.ИнтерактивноПерезаполнитьСчетаУчета(ЭтотОбъект, Истина, Новый Структура("Товары,ВозвратнаяТара,СоставНабора"), ОтражатьВБухгалтерскомУчете, ОтражатьВНалоговомУчете);
    
    ПересчитатьАвтоматическиеСкидки();
    
    мВидДоговора          = ДоговорКонтрагента.ВидДоговора;
    мПоДокументамРасчетов = ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентом;
    мРасчетыВУЕ           = ДоговорКонтрагента.РасчетыВУсловныхЕдиницах;
    мВедениеВзаиморасчетов = ДоговорКонтрагента.ВедениеВзаиморасчетов;
    Если ЗначениеЗаполнено(ДоговорКонтрагента.ОсновнойПроект) Тогда
    Проект=ДоговорКонтрагента.ОсновнойПроект;
    КонецЕсли;
    
    РаботаСДиалогами.УстановитьВидимостьКолонкиЗаказ(ЭлементыФормы, ВидОперации, ДоговорКонтрагента, мКолонкиТовары, мКолонкиВозвратнаяТара, мКолонкиУслуги, Неопределено, мКолонкиДокументы, ЭлементыФормы.Сделка);
    УстановитьВидимость();
    
    КонецПроцедуры // ПриИзмененииДоговора()
    
    
    Т.е. вы предлагаете переписать это в процедуру подписки?
  8. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    В 8.1 на сервере не существует формы объекта и вызвать ее из подписки невозможно.
    Поэтому надо писать самому.
  9. TopicStarter Overlay
    shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Т.е. насколько я понимаю, допустим вот это из вышеприведенной процедуры:
    Код:
    РаботаСДиалогами.СформироватьНадписьДолга(ДоговорКонтрагента, Сделка, ЭлементыФормы.ИнфНадписьДолга, Ссылка, Истина);
    
    придется выкинуть.
    Надо подумать, некрасиво может выйти.
  10. eviloid
    Offline

    eviloid Опытный в 1С

    Регистрация:
    15 май 2008
    Сообщения:
    103
    Симпатии:
    0
    Баллы:
    26
    А почему бы не сделать проверку и смену договора в обработчике формы документа?

    Заполнение документа может зависеть от типа договора, т.е., как пример, если договор с поставщиком - надо заполнить на форме дату поставки, если с покупателем - дату оплаты (а в объекте это могут быть разные ревизиты). Проще ведь, если пользователь это сделает..

    Проверяем, выдаем сообщение пользователю типа "по таким-то критериям договор контрагента должен быть вот такой", меняем договор на нужный и всё...

    :unsure:
  11. TopicStarter Overlay
    shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Так она сейчас и есть в форме документа. Хотелось бы все это вытащить из документов и перенести в подписку. Скажем так для красоты и простоты обновлений.

    Эх.. Везет вам наверно с операторами.. Я правда своих в последнее время уже приучил смотреть, что программа пишет, они даже читать начали, только вот после того как прочли все равно не понимают чего от них программа хочет.. :(
  12. gosn1ck
    Offline

    gosn1ck Опытный в 1С

    Регистрация:
    13 авг 2009
    Сообщения:
    1.329
    Симпатии:
    1
    Баллы:
    26
    объясните ситуацию(задачу) подробнее и то как вы пытаетесь ее решить, поможем
  13. TODD22
    Offline

    TODD22 Профессионал в 1С Команда форума

    Регистрация:
    23 фев 2009
    Сообщения:
    4.755
    Симпатии:
    146
    Баллы:
    104
    может чего не понимаю... а чем вас не устраивает "общий модуль"..?
    а в документе только вызовы оставьте и всё.
  14. TopicStarter Overlay
    shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Задача, та же самая, как формулировал. Есть документ, скажем "Реализация товаров и услуг", в этом документе при определенных условиях програмно надо заменить один договор контрагента на другой. На данный момент это реализовано добавлением кода в процедуру "ПередЗаписью()" формы документа. Как можно видеть в любом документе при интерактивном изменении поля "Договор контрагента" вызывается процедура формы "ПриИзмененииДоговора()". Когда я меняю договор програмно, следовательно тоже вызываю эту процедуру.
    Далее, все это, что у меня есть на данный момент я хотел убрать из модуля формы документа и перенести в "Подписку на событие". В "Подписке" поменять договор я могу, но после этого, не могу вызвать функцию "ПриИзмененииДоговора()". Как сказал BabySG "В 8.1 на сервере не существует формы объекта и вызвать ее из подписки невозможно.". Переносить же копию кода процедуры "ПриИзмененииДоговора()" в Подписку считаю нецелесообразным.

    TODD22
    Да, я уже думал об этом. Это конечно будет выглядеть лучше на мой взгляд, чем есть сейчас. Думаю на этом и придется остановиться. Просто если бы была возможность все полностью вынести в подписку, была бы вообще красота.
  15. gosn1ck
    Offline

    gosn1ck Опытный в 1С

    Регистрация:
    13 авг 2009
    Сообщения:
    1.329
    Симпатии:
    1
    Баллы:
    26
    именно поэтому говорил сдублировать процедуру.

    полностью поддерживаю

Поделиться этой страницей