Добрый день, узнала о такой интересной штуке, как подписка на событие и задалась вопросом, как можно перед записью обрабатывать все документы, но что-то мало информации про этот объект конфигурации, вопрос заключается в том, что я создала РС, который должен хранить информацию (Товар, Автор, Дата, Категория товара и Ставка ндс на этот товар), то-есть подписка должна сохранять и записывать информацию о значениях реквизитов документов, только для уже существующих объектов, но вот тут проблема, не совсем понимаю, как это будет осуществляться, в условие я произвожу поиск по номеру, если такой документ есть, то подписка срабатывает и сохраняет все значения реквизитов(как должен выглядеть код для сохранения, этого я не понимаю) или просто записывает данные сразу в РС
(17) В подписку приходит Источник - это документ, вызвавший событие подписки с типом ДокументОбъект, например, ДокументОбъект.ПоступлениеТоваров.
Так как это объект, все его данные уже считаны из БД и содержатся в самом объекте, не нужно делать запросы к нему для получения, например, табличной части.
Нужна табличная часть "Товары"?
Источник.Товары
Нужны сами товары?
Для каждого СтрокаТовара Из Источник.Товары Цикл
ТекущийТовар = СтрокаТовара.Товар;
КонецЦиккла;
Вообще, мне кажется неправильной идея с проверкой наличия нужного реквизита. Это говорит о непродуманности архитектуры.
Вы же сами создаёте эту подписку - либо делайте её только для тех объектов, у которых есть все нужные реквизиты, либо сделайте так, чтобы у всех нужных объектов были эти реквизиты.
(1)почему вы решили, что именно подписка на событие подойдет для решения вашей задачи?
Исходя из ваших слов
в условие я произвожу поиск по номеру, если такой документ есть, то подписка срабатывает и сохраняет все значения реквизитов(как должен выглядеть код для сохранения, этого я не понимаю) или просто записывает данные сразу в РС
(2)чтобы не засорять грубо говоря документы, я же могу это сделать просто подпиской на событие + хочется узнать побольше о этом объекте, а толковых задач с примерами я найти так и не смогла
(3)Засорять документы каким образом? Можете, если изменится условие задачи и другого способа, кроме как синхронного действия, для решения задачи нет.
Еще раз: в озвученных вами условиях больше подойдет регламентное задание.
Подписка на событие будет отрабатывать при/перед записи/-ью каждого документа - это, грубо говоря, дополнительные действия, при возникновении определенного события с объектом, на который "навешана" подписка.
(4)хм, я поняла, ну вообще на самом деле, т.к. это тестовая база и я хотела бы сделать подписку на событие именно, да я знаю, что подписки отрабатывают только при/перед записью./
А вообще хотелось бы реализовать, чтобы перед записью подписка проверяла новый или не новый документ, если это уже существующий, то она сохраняет информацию о значениях реквизитов документа после изменения, и записывает всё уже в РС, и сделать возможность открыть этот РС в отчете за нужный период, с отчетом проблем нет, проблема заключается в непонимании как именно будет выглядеть общий модуль данной подписки
Вкратце - просто добавляете этот объект. Затем выбираете источник - по сути, регистратор, на который будет смотреть подписка. Выбираете вид события - событие, на которое подписка будет реагировать по выбранному источнику. И ставите обработчик - код в общем модуле, который будет исполняться, когда наступит выбранное событие по выбранному источнику.
Как пример:
Источник: ДокументОбъект.ПриходныйКассовыйОрдер;
Событие: ПередЗаписью;
Обработчик: некоторый ваш код (нажатие на лупу позволит выбрать модуль, в котором будет размещена процедура - после выбора процедура сама создастся с необходимыми параметрами).
В итоге ваш указанный код будет исполняться каждый раз перед записью приходного кассового ордера.
(5)Мало информации как именно в общем модуле отрабатывает код и как он эту всю информацию записывает допустим в РС, но все равно спасибо, сейчас буду пробовать
(8)В РС всё запишется тем кодом, который вы напишете) Это уже не относится к подписке на событие) Если не знаете как написать этот код, то уже другой вопрос. Собсна, азы программирования
(10)Возникла небольшая проблема, не совсем понимаю, как мне с Документа вытащить данные о товаре(которые есть только в справочнике, это Категория товара и Ставка НДС его) + когда я проверяю (если документ не новый), то у меня запись не происходит, если не проверять, запись происходит, но автор указывается просто "Автор", а не значения реквизита, подскажите по какой причине?
Если НЕ Источник.ЭтоНовый() Тогда
МенеджерЗаписи = РегистрыСведений.ТестовыйПодп.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Дата = ТекущаяДата();
МенеджерЗаписи.Автор = Источник.Метаданные().Реквизиты.Найти("Автор");
МенеджерЗаписи.Записать();
Если Источник.Метаданные().Реквизиты.Найти("Автор") = Неопределено Тогда
МенеджерЗаписи.Автор = ПараметрыСеанса.ТекущийПользователь;
Иначе
МенеджерЗаписи.Автор = Источник.Автор;
КонецЕсли;.
(16)Просто использовать в МенеджерЗаписи.Категория/МенеджерЗаписи.Ставка = Источник.Ссылка? просто не совсем понимаю как мне именно обратиться через источник
(17) В подписку приходит Источник - это документ, вызвавший событие подписки с типом ДокументОбъект, например, ДокументОбъект.ПоступлениеТоваров.
Так как это объект, все его данные уже считаны из БД и содержатся в самом объекте, не нужно делать запросы к нему для получения, например, табличной части.
Нужна табличная часть "Товары"?
Источник.Товары
Нужны сами товары?
Для каждого СтрокаТовара Из Источник.Товары Цикл
ТекущийТовар = СтрокаТовара.Товар;
КонецЦиккла;
Вообще, мне кажется неправильной идея с проверкой наличия нужного реквизита. Это говорит о непродуманности архитектуры.
Вы же сами создаёте эту подписку - либо делайте её только для тех объектов, у которых есть все нужные реквизиты, либо сделайте так, чтобы у всех нужных объектов были эти реквизиты.
Все равно не получается вытащить у меня товар, который находится в табличной части самого документа, Источник.Ссылка... Источник.Номенклатура(это табличная часть)... не один метод не передает в РС мне какие-либо товары
(18)
а вы прорабатывали - что вы будете делать с вашими записями в РС
- если в документе изменится состав ТЧ товары
- если документ отменят проведение /поставят пометку на удаление.
(19)Да, все моменты с изменением документа проработаны, в РС будут храниться новые и старые данные документа, думала про запрос, но думала, что можно обратиться как-нибудь и без обхода через цикл, а просто взять данные как и с обычных реквизитов.
Насчет книг, да, пробовала, читала 2 книги по разработке "Начинала" но в книгах книгах было много воды, если можете посоветовать что-то, то буду благодарна
(20)
Я начиснала с Радчено и Хрусталева
на ИТС есть бесплатные книги.
Что за задачу вам поставили ? Зачем что-то дополнительно хранить - дублирую данные из документов с отслеживанием изменений ? Про какую конфигурацию идеи речь?
(23)Про как работает подписка понятно, я изменила на 1 конкретный документ, у меня должны проверяться все Реквизиты перед записью, остались они такими же или пользователь их поменял, если пользователь поменял, я должна в РС вносить все данные + измененные данные, вот всё работает, но проблема именно с получением Номенклатуры, которая была в табличной части, сейчас пыталась вытащить запросом из Документа Ссылку и Где - Документ.Ссылка = &Номенклатура, установила параметр и у меня выдаёт ошибку (Нельзя сравнивать поля неограниченной длины и поля несовместимого типа) все реквизиты у меня имеют нужные типы
выдаёт ошибку (Нельзя сравнивать поля неограниченной длины и поля несовместимого типа)
Не находите тут противоречие? Откуда уверенность в том, что "все реквизиты у меня имеют нужные типы"? В отладке смотрели?
Может быть приведёте код подписки, чтобы можно было оценить масштаб бедствия?