Привет.
Задача: по нажатию кнопки программно создавать новый документ и заполнять его.
Для этого можно написать свой код в ОбработкаЗаполнения, а можно написать весь код например в общем модуле.
Всегда ли надо стараться поместить код в ОбработкаЗаполнения? Если нет, то какие могут быть критерии выбора места размещения кода?
Есть ли похожие паттерны в других языках программирования?
---
И вообще к чему вопрос. Читаем внимательно СП

"Описание:
Возникает при вводе документа на основании, а также при выполнении метода Заполнить, при вводе на основании, а также при интерактивном вводе нового. В процедуре-обработчике этого события должен быть описан сам алгоритм заполнения реквизитов документа на основании переданного значения."

Что тут написано?
1) при вводе на основании
2) при интерактивном вводе нового.

Что такое интерактивное? Это явно не программное создание документа, да еще если вы не вызвали ввод на основании.
А ввод на основании это открытие формы с переданным основанием.

Вот и все...

Поэтому обработка заполнения вообще никаким боком к программному созданию не имеет.
---
Вопрос очень субъективный. Ответ тоже субъективный:
Было бы прекрасно иметь общий модуль для заполнения "всего" на основании "всего"!
Ведь есть куча различных реквизитов, которые формируются в общих модулях из процедур обработки заполнения документов в самих документах...
---
Заполнять документ должен тот, кто больше всего знает о нём.
Обычно это - сам документ, именно поэтому обработка заполнения находится в его модуле.
Если документ создается и заполняется в нескольких местах, то имеет смысл вынести заполнение в общий модуль, чтобы уменьшить связность компонентов, перенеся ответственность на этот общий модуль. Однако вызывать стандартную обработку заполнения всё равно нужно будет ради свойства реквизитов "Значение заполнения".
Есть ли похожие паттерны в других языках программирования?
Например, в GRASP об этом говорится в элементах "Information Expert" и "Creator".
---
Для 1С вот здесь все описывают Оформление модулей
---
в УНФ например совсем нет программных обработчиков событий заполнения документов.
Да все они страдают..

Обработка заполнения не обязательна вообще. Но с учетом того что в документах куча реквизитов которые заполняются то от договора, то от соглашения - это все надо учитывать.

А программно обработка событий не всегда помогает. Там в основном в типовых все события когда на основании. И почти ничего когда документ создается просто так.

А если ты программно пишешь - то можешь и программно заполнить как хочешь.
---
А глобальник всегда нужен если ты создаешь прогрммно документ из разных обработок и прочего. На то он и глобальник - чтобы в каждом модуле не писать одно и тоже.
Другого смысла в глобальнике нет.

В обработка событий штатные (почти везде) - требуют какого то основания.
---
Давно уже можно и без основания. Достаточно простой структуры.
---
там в основном в структуре и передаются основания.
---
И вообще к чему вопрос. Читаем внимательно СП

"Описание:
Возникает при вводе документа на основании, а также при выполнении метода Заполнить, при вводе на основании, а также при интерактивном вводе нового. В процедуре-обработчике этого события должен быть описан сам алгоритм заполнения реквизитов документа на основании переданного значения."

Что тут написано?
1) при вводе на основании
2) при интерактивном вводе нового.

Что такое интерактивное? Это явно не программное создание документа, да еще если вы не вызвали ввод на основании.
А ввод на основании это открытие формы с переданным основанием.

Вот и все...

Поэтому обработка заполнения вообще никаким боком к программному созданию не имеет.
---
При программном создании объекта следует явно вызывать метод объекта Заполнить. Если данных для заполнения нет, то передать значение Неопределено. В этом случае корректно отработают свойства реквизитов объекта "Значение заполнения", будет вызван обработчик ОбработкаЗаполнения и подписки на это событие, как при интерактивной работе с объектом.
...
Исключением могут быть случаи, когда объект полностью загружается из источника при обмене данными или восстановление базы из резервной копии (загрузка из XML).
Стандарт разработки #std451
---
>>Есть ли похожие паттерны в других языках программирования?
На бейсике?

>>Всегда ли надо стараться поместить код в ОбработкаЗаполнения?
Код может быть где угодно, — главное, чтобы обработка заполнения вызвала его.
Например, вызвать процедуру общего модуля по заполнению общих реквизитов документа, проверить тип документа и вызвать процедуру модуля объекта по заполнению на основании данного типа, которая в том числе вызывает процедуру общего модуля по заполнению табличной части Товары и т.д., и т.п.
Потребителю удобнее вызвать метод документа Заполнить — разумеется, в предположении, что Обработка заполнения умеет обрабатывать данное основание. Даже если основания нет, в процедуре может быть описана инициализация.

Поскольку причин и сценариев заполнения документа может быть великое множество, в конкретном кейсе алгоритм заполнения можно нарисовать в самой кнопке по причине того, что
-у документа нет обработки заполнения / заполнения по данному сценарию, а дорабатывать конфигурацию нет нужды
-это частный / разовый сценарий
-и так всё понятно
Сам же алгоритм заполнения может вызывать любые прочие вспомогательные процедуры, в том числе ДокументОбъект.Заполнить