Подписка на событие

1. Devilion 19.11.20 12:12 Сейчас в теме
Добрый день, узнала о такой интересной штуке, как подписка на событие и задалась вопросом, как можно перед записью обрабатывать все документы, но что-то мало информации про этот объект конфигурации, вопрос заключается в том, что я создала РС, который должен хранить информацию (Товар, Автор, Дата, Категория товара и Ставка ндс на этот товар), то-есть подписка должна сохранять и записывать информацию о значениях реквизитов документов, только для уже существующих объектов, но вот тут проблема, не совсем понимаю, как это будет осуществляться, в условие я произвожу поиск по номеру, если такой документ есть, то подписка срабатывает и сохраняет все значения реквизитов(как должен выглядеть код для сохранения, этого я не понимаю) или просто записывает данные сразу в РС
По теме из базы знаний
Найденные решения
26. comptr 31 20.11.20 08:47 Сейчас в теме
(17) В подписку приходит Источник - это документ, вызвавший событие подписки с типом ДокументОбъект, например, ДокументОбъект.ПоступлениеТоваров.
Так как это объект, все его данные уже считаны из БД и содержатся в самом объекте, не нужно делать запросы к нему для получения, например, табличной части.
Нужна табличная часть "Товары"?
Источник.Товары

Нужны сами товары?
Для каждого СтрокаТовара Из Источник.Товары Цикл
    ТекущийТовар = СтрокаТовара.Товар;
КонецЦиккла;


Вообще, мне кажется неправильной идея с проверкой наличия нужного реквизита. Это говорит о непродуманности архитектуры.
Вы же сами создаёте эту подписку - либо делайте её только для тех объектов, у которых есть все нужные реквизиты, либо сделайте так, чтобы у всех нужных объектов были эти реквизиты.
Devilion; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 72 19.11.20 12:15 Сейчас в теме
(1)почему вы решили, что именно подписка на событие подойдет для решения вашей задачи?
Исходя из ваших слов
в условие я произвожу поиск по номеру, если такой документ есть, то подписка срабатывает и сохраняет все значения реквизитов(как должен выглядеть код для сохранения, этого я не понимаю) или просто записывает данные сразу в РС

больше подходит обычное регламентное задание.
vadim.semyonov.rzn; alex-l19041; user5300; oleg-x; vppunctum; +5 Ответить
3. Devilion 19.11.20 12:21 Сейчас в теме
(2)чтобы не засорять грубо говоря документы, я же могу это сделать просто подпиской на событие + хочется узнать побольше о этом объекте, а толковых задач с примерами я найти так и не смогла
4. nomad_irk 72 19.11.20 12:26 Сейчас в теме
(3)Засорять документы каким образом? Можете, если изменится условие задачи и другого способа, кроме как синхронного действия, для решения задачи нет.

Еще раз: в озвученных вами условиях больше подойдет регламентное задание.

Подписка на событие будет отрабатывать при/перед записи/-ью каждого документа - это, грубо говоря, дополнительные действия, при возникновении определенного события с объектом, на который "навешана" подписка.
6. Devilion 19.11.20 12:33 Сейчас в теме
(4)хм, я поняла, ну вообще на самом деле, т.к. это тестовая база и я хотела бы сделать подписку на событие именно, да я знаю, что подписки отрабатывают только при/перед записью./

А вообще хотелось бы реализовать, чтобы перед записью подписка проверяла новый или не новый документ, если это уже существующий, то она сохраняет информацию о значениях реквизитов документа после изменения, и записывает всё уже в РС, и сделать возможность открыть этот РС в отчете за нужный период, с отчетом проблем нет, проблема заключается в непонимании как именно будет выглядеть общий модуль данной подписки
7. FatPanzer 19.11.20 12:35 Сейчас в теме
(6)
проблема заключается в непонимании как именно будет выглядеть общий модуль данной подписки
А вы попробуйте... И сразу поймете. Все необходимые параметры для обработчика сформируются сами.
9. Devilion 19.11.20 12:36 Сейчас в теме
(7)Да, сейчас буду пробовать, потому что как я поняла все нужные данные будут в Источнике храниться :)
12. FatPanzer 19.11.20 12:45 Сейчас в теме
(9) Не совсем так. Просто под источник - это и есть сам объект, с которым вы работаете в модуле объекта (если мы говорим про справочник или документ).
Devilion; alex-l19041; oleg-x; +3 Ответить
5. Kovekh 19.11.20 12:33 Сейчас в теме
(3)Как это вдруг мало информации о подписке на события?) Первая же ссылка гугла

Вкратце - просто добавляете этот объект. Затем выбираете источник - по сути, регистратор, на который будет смотреть подписка. Выбираете вид события - событие, на которое подписка будет реагировать по выбранному источнику. И ставите обработчик - код в общем модуле, который будет исполняться, когда наступит выбранное событие по выбранному источнику.

Как пример:
Источник: ДокументОбъект.ПриходныйКассовыйОрдер;
Событие: ПередЗаписью;
Обработчик: некоторый ваш код (нажатие на лупу позволит выбрать модуль, в котором будет размещена процедура - после выбора процедура сама создастся с необходимыми параметрами).
В итоге ваш указанный код будет исполняться каждый раз перед записью приходного кассового ордера.
8. Devilion 19.11.20 12:35 Сейчас в теме
(5)Мало информации как именно в общем модуле отрабатывает код и как он эту всю информацию записывает допустим в РС, но все равно спасибо, сейчас буду пробовать
10. Kovekh 19.11.20 12:37 Сейчас в теме
(8)В РС всё запишется тем кодом, который вы напишете) Это уже не относится к подписке на событие) Если не знаете как написать этот код, то уже другой вопрос. Собсна, азы программирования
11. Devilion 19.11.20 12:40 Сейчас в теме
(10)Не настолько всё плохо, к счатью я знаю, как записать данные в РС кодом)
13. Devilion 19.11.20 13:54 Сейчас в теме
(10)Возникла небольшая проблема, не совсем понимаю, как мне с Документа вытащить данные о товаре(которые есть только в справочнике, это Категория товара и Ставка НДС его) + когда я проверяю (если документ не новый), то у меня запись не происходит, если не проверять, запись происходит, но автор указывается просто "Автор", а не значения реквизита, подскажите по какой причине?


Если НЕ Источник.ЭтоНовый() Тогда
		МенеджерЗаписи = РегистрыСведений.ТестовыйПодп.СоздатьМенеджерЗаписи();
		МенеджерЗаписи.Дата = ТекущаяДата();
		МенеджерЗаписи.Автор = Источник.Метаданные().Реквизиты.Найти("Автор");
		МенеджерЗаписи.Записать();
КонецЕсли;
Прикрепленные файлы:
14. FatPanzer 19.11.20 14:09 Сейчас в теме
(13)
МенеджерЗаписи.Автор = Источник.Метаданные().Реквизиты.Найти("Автор");
Никогда так не делайте!

Если Источник.Метаданные().Реквизиты.Найти("Автор") = Неопределено Тогда
    МенеджерЗаписи.Автор = ПараметрыСеанса.ТекущийПользователь;
Иначе
    МенеджерЗаписи.Автор = Источник.Автор;
КонецЕсли;.
15. Devilion 19.11.20 14:27 Сейчас в теме
(14)Учту, спасибо, но у меня почему-то запись происходит только 1 раз, и подскажите пожалуйста насчет
как мне с Документа вытащить данные о товаре(которые есть только в справочнике, это Категория товара и Ставка НДС его)
, не совсем понимаю, у меня же в документах нет такой информации, она только в справочнике Номенклатуры
16. FatPanzer 19.11.20 14:30 Сейчас в теме
(15) Но в документе же есть ссылка на номенклатуру? Вот по ней и вытаскивайте.
17. Devilion 19.11.20 14:34 Сейчас в теме
(16)Просто использовать в МенеджерЗаписи.Категория/МенеджерЗаписи.Ставка = Источник.Ссылка? просто не совсем понимаю как мне именно обратиться через источник
26. comptr 31 20.11.20 08:47 Сейчас в теме
(17) В подписку приходит Источник - это документ, вызвавший событие подписки с типом ДокументОбъект, например, ДокументОбъект.ПоступлениеТоваров.
Так как это объект, все его данные уже считаны из БД и содержатся в самом объекте, не нужно делать запросы к нему для получения, например, табличной части.
Нужна табличная часть "Товары"?
Источник.Товары

Нужны сами товары?
Для каждого СтрокаТовара Из Источник.Товары Цикл
    ТекущийТовар = СтрокаТовара.Товар;
КонецЦиккла;


Вообще, мне кажется неправильной идея с проверкой наличия нужного реквизита. Это говорит о непродуманности архитектуры.
Вы же сами создаёте эту подписку - либо делайте её только для тех объектов, у которых есть все нужные реквизиты, либо сделайте так, чтобы у всех нужных объектов были эти реквизиты.
Devilion; +1 Ответить
18. Devilion 19.11.20 16:46 Сейчас в теме
Все равно не получается вытащить у меня товар, который находится в табличной части самого документа, Источник.Ссылка... Источник.Номенклатура(это табличная часть)... не один метод не передает в РС мне какие-либо товары
19. azali 19.11.20 17:16 Сейчас в теме
(18)
а вы прорабатывали - что вы будете делать с вашими записями в РС
- если в документе изменится состав ТЧ товары
- если документ отменят проведение /поставят пометку на удаление.

ТЧ можно обойти через цикл

получить через запрос

P.S.
Не пробовали читать книжки по 1С. Помогает.
20. Devilion 19.11.20 17:22 Сейчас в теме
(19)Да, все моменты с изменением документа проработаны, в РС будут храниться новые и старые данные документа, думала про запрос, но думала, что можно обратиться как-нибудь и без обхода через цикл, а просто взять данные как и с обычных реквизитов.

Насчет книг, да, пробовала, читала 2 книги по разработке "Начинала" но в книгах книгах было много воды, если можете посоветовать что-то, то буду благодарна
22. azali 19.11.20 17:31 Сейчас в теме
(20)
Я начиснала с Радчено и Хрусталева
на ИТС есть бесплатные книги.

Что за задачу вам поставили ? Зачем что-то дополнительно хранить - дублирую данные из документов с отслеживанием изменений ? Про какую конфигурацию идеи речь?
25. Devilion 19.11.20 17:43 Сейчас в теме
(22)Спасибо за книги, обязательно прочитаю, конфа своя, сама пишу понемногу, я не работаю, для себя, пока учусь только программировать
21. Devilion 19.11.20 17:28 Сейчас в теме
(19)Еще проблема в том, что у меня подписка привязана ко всем Документам, запросом мне придётся перебирать тч у каждого документа
23. azali 19.11.20 17:33 Сейчас в теме
(21)
Когда подлиска срабатывает обрабатывается один конкретный документ. а не сразу все документы к которым вы привязали подписку.
24. Devilion 19.11.20 17:42 Сейчас в теме
(23)Про как работает подписка понятно, я изменила на 1 конкретный документ, у меня должны проверяться все Реквизиты перед записью, остались они такими же или пользователь их поменял, если пользователь поменял, я должна в РС вносить все данные + измененные данные, вот всё работает, но проблема именно с получением Номенклатуры, которая была в табличной части, сейчас пыталась вытащить запросом из Документа Ссылку и Где - Документ.Ссылка = &Номенклатура, установила параметр и у меня выдаёт ошибку (Нельзя сравнивать поля неограниченной длины и поля несовместимого типа) все реквизиты у меня имеют нужные типы
27. comptr 31 20.11.20 08:49 Сейчас в теме
(24)
все реквизиты у меня имеют нужные типы

выдаёт ошибку (Нельзя сравнивать поля неограниченной длины и поля несовместимого типа)

Не находите тут противоречие? Откуда уверенность в том, что "все реквизиты у меня имеют нужные типы"? В отладке смотрели?
Может быть приведёте код подписки, чтобы можно было оценить масштаб бедствия?
29. Devilion 22.11.20 10:03 Сейчас в теме
(28)
(27)
Да была ошибка в одном реквизите, у которого не правильно был указан реквизит + неправильно подошла к методу решения данной задачи.
Насчет
Документ.Ссылка = &Номенклатура
уже тоже поняла в ходе решения
Всем спасибо кто откликнулся)
28. azali 20.11.20 09:23 Сейчас в теме
(24)
Документ.Ссылка = &Номенклатура


Это может быть только тогда когда значение параметра &Номенклатура на самом деле является ссылкой документа.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот