Здравствуйте!
Есть документ "Документ1". У этого документа два реквизита: 1) "Документ2" - ссылка на другой документ
                                                                                                          2) "Сумма" - число.
В документе "Документ2" - один реквизит: "Сумма" - число.

Можно ли сделать такой фокус как, если отменить проведение "Документ1", то "Документ2" тоже становится непроведенным. Если "Документ1" проводится, то проводится и "Документ2" и если "Сумма" в "Документ1" меняется, то она меняется и в "Документ2" без его открытия?

Если такое возможно в самописной базе без БСП, то подскажите, пожалуйста.

Спасибо.
---
Главный принцип такой, что делать манипуляции со связанным документом нужно в транзакции записи основного документа. Тогда отмена транзакции (по любой причине) откатит изменения обоих документов.
Главных событий два (в модуле объекта) - "перед записью" и "при записи". Ключевая разница - в "при записи" реквизиты основного документа уже не меняете (это ведет к нежелательным побочным эффектам типа неявной повторной записи). Если нужно менять реквизиты основного документа в процессе - это надо делать в "перед записью". Кроме этого особой разницы нет - оба события находятся уже в транзакции записи.
(13)Тогда принципиальной разницы нет. Можно так:

```1c
    Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    ДокументКС = КС.ПолучитьОбъект();
    ДокументКС.Записать(РежимЗаписи, РежимПроведения);
    КонецПроцедуры
```
---
Примерно так, при отменене проведения Документ1 (к примеру, подпиской на событие):

```1c
    ДокОб = Документ1.Документ2.ПолучитьОбъект();
    ДокОб.Записать(РежимЗаписиДокумента.ОтменаПроведения)
```
---
только "Записать", а не "Провести"
---
точно, сейчас поправлю)
---
"Подпиской на событие" ... а можете подробней где именно нужно задать код выполнения, в каком событии?
---
Создаете новый объект "Подписка на событие", там указываете источник и событие, при котором нужно вызвать определенный код - в данном случае отмена проведения связанного документа. Вот пример подписки из типовой конфигурации:
---
Этот код прописывать в общем модуле, который привязан к подписке, верно?
---
Как я понимаю перезапись реквизита "Сумма" при его изменении в "Документ1" в "Документ2" осуществляется тоже подпиской на событие?
---
(8) Верно
---
Подпиской - это если конфа на поддержке.
Если таких ограничений нет, то просто в родных событиях объекта пишите.
---
Конфа самописная, как говорится, что хочу, то ворочу.
Можете подробней описать каким именно родным событием можно это провернуть?
---
Это зависит. Расскажите чуть подробней про полный цикл работы связанных документов. Что за чем создается, откуда куда когда связь прописывается...
---
Я тогда буду конкретно писать фактическое название документов.

Как есть.

Создается документ "Табель".
В этом документе заполняется информация об отработанном времени сотрудников.
После заполнения этих данных, в поле КС ("ДокументСсылка.КС") выбирается ранее созданный документ КС.
Оба документа проведены.
И вдруг заполнитель понимает, что ошибся или необходимо добавить еще данные. Он отменяет проведение документа "Табель" и тут необходимо, чтобы КС тоже отменилась.
---
Главный принцип такой, что делать манипуляции со связанным документом нужно в транзакции записи основного документа. Тогда отмена транзакции (по любой причине) откатит изменения обоих документов.
Главных событий два (в модуле объекта) - "перед записью" и "при записи". Ключевая разница - в "при записи" реквизиты основного документа уже не меняете (это ведет к нежелательным побочным эффектам типа неявной повторной записи). Если нужно менять реквизиты основного документа в процессе - это надо делать в "перед записью". Кроме этого особой разницы нет - оба события находятся уже в транзакции записи.
(13)Тогда принципиальной разницы нет. Можно так:

```1c
    Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    ДокументКС = КС.ПолучитьОбъект();
    ДокументКС.Записать(РежимЗаписи, РежимПроведения);
    КонецПроцедуры
```
---
ДокументКС = КС.ПолучитьОбъект();

При такой записи будет ругаться "Переменная не определена (КС)
 ДокументКС = <<?>>КС.ПолучитьОбъект(); (Проверка: Тонкий клиент)"
---
Я забыл уточнить. Управляемые формы.
---
Подчеркнул жирным в (14)
---
Я страницу не обновил и не обратил внимания, спасибо.
Скажите, а если эти два документа делают движения по регистрам, такой вариант их проведения не повлечет за собой ошибок записи в регистры?
---
Вам виднее должно быть. Если бизнес-логика не нарушается, то нет.
---
А можете еще подсказать? В табеле есть информация об общей начисленной сумме. Она указывается в КС.
При изменении этой суммы в табеле она также должна измениться в КС. Тоже через общий модуть?
---
Откуда общий модуль взялся? Вроде о модуле документа говорили.

```1c
    Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    ДокументКС = КС.ПолучитьОбъект();
    ДокументКС.ОбщаяНачисленнаяСумма = ОбщаяНачисленнаяСумма;
    ДокументКС.Записать(РежимЗаписи, РежимПроведения);
    КонецПроцедуры
```

Главное, чтобы алгоритм проведения КС не базировался на движениях табеля. Тогда это не в "перед записью" делать надо. Будет то самое нарушение бизнес-логики.
---
Поторопился, модуль объекта.
---
Скажите, пожалуйста, а можно организовать оперативное проведение документа?
---
Странный вопрос. Раз такой режим существует, то очевидно его можно использовать :)
А зачем вам оперативное проведение?
А, дошло. У вас главный документ проводится оперативно?
И какая возникает проблема при попытке оперативного проведения подчиненного документа?
---
Может быть я неправильно сформулировал вопрос. При отмене проведения документа "Табель", отменяется проведение документа "КС". Это хорошо.
Далее делаю изменения в документе "Табель", записываю, провожу. Захожу проверить данные в "КС". Все верно, даже движение по регистру верное, но открыв печатную форму заметил, что старые данные подставляются. Откуда берутся непонятно. Но после нажатия на кнопку "Провести и закрыть" или "Провести", в печатной форме получаю реальную картину.
Этот момент настораживает.
---
но открыв печатную форму заметил, что старые данные подставляются. Откуда берутся непонятно.
Ну, мне отсюда тоже не видно. Возможно, какие-то ваши "хитрости". Естественно, нужно с ними разобраться. Может, у вас там какие-то костыли из-за которых программное проведение и интерактивное отличаются по результату.
(28) Вероятно, КС в прошлой дате. Ессно, задним числом невозможно провести оперативно. Тогда берите режим проведения не из главного документа, а просто всегда проводите КС неоперативно. А если у вас суровая самописка и на оперативное проведение ничего не завязано, то просто запретите оперативное проведение табеля и КС в конфигураторе. Пускай всегда неоперативно проводится и не задает глупые вопросы.
---
а просто всегда проводите КС неоперативно

Это заходить в документ и проводить, я правильно понял?
---
Это заходить в документ и проводить, я правильно понял?
Неправильно.
Оперативно или неоперативно - это второй параметр метода "Записать" - "РежимПроведения".
---
Да, сделали изменение и нажали провести. Я точно сказать не могу. Пишет, что невозможно оперативно провести документ.
---
Но вообще, когда цифры нужно синхронизировать между документами, это чаще всего признак ошибки проектирования.
Да и связанные документы я могу как-то оправдать только лобовой автоматизацией типовых цепочек документооборота.
---
Перезаполнять и привязанный документ получилось. Спасибо большое за подсказки.