База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как программно заполнить документы в 1С:СКАТ с частичным автозаполнением? › RE: Как программно заполнить документы в 1С:СКАТ с частичным автозаполнением?
Да, в 1С:СКАТ Профессионал при программном создании документа можно заполнить только необходимые реквизиты, а остальные поля оставить пустыми, чтобы они заполнялись автоматически системой, так же как при ручном вводе.
Объяснение:
1. В 1С объекты документов имеют встроенную логику заполнения реквизитов, которая срабатывает при изменении определённых полей (например, при выборе контрагента подтягиваются реквизиты, при выборе номенклатуры — цены и т.п.).
2. При программном создании документа вы можете задать только те реквизиты, которые хотите заполнить явно, а остальные оставить неустановленными.
3. Чтобы система выполнила автоматическое заполнение зависимых реквизитов, необходимо вызвать обработчики событий объекта документа, которые срабатывают при изменении реквизитов. Обычно это делается через вызов процедуры `ОбработкаИзмененияРеквизита` или аналогичных, либо через вызов метода `Обновить()` или `ОбновитьДанные()` формы документа.
4. Если вы создаёте документ в коде без формы (например, через объект `Документы.ИмяДокумента.Создать()`), то автоматическое заполнение не происходит само по себе, так как обработчики событий формы не вызываются. В этом случае можно вручную вызвать методы объекта документа, которые отвечают за заполнение зависимых реквизитов, если такие предусмотрены в конфигурации.
5. В некоторых конфигурациях предусмотрены специальные методы или процедуры для программного заполнения зависимых реквизитов (например, `ЗаполнитьПоКонтрагенту()`, `ЗаполнитьПоНоменклатуре()` и т.п.). Их можно использовать для автоматизации.
6. Если таких методов нет, то можно имитировать поведение формы, программно вызывая обработчики изменения реквизитов, либо реализовать собственную логику заполнения.
Пример кода (упрощённый):
1C
Док = Документы.ПриходнаяНакладная.Создать();
Док.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
// Вызов процедуры, которая в конфигурации отвечает за заполнение зависимых реквизитов
Док.ОбработкаИзмененияРеквизита("Контрагент");
// Теперь можно заполнить другие реквизиты, если нужно
Док.Записать();
Если метод `ОбработкаИзмененияРеквизита` отсутствует, то нужно смотреть в конфигурации, как реализована логика заполнения реквизитов при изменении полей, и вызывать соответствующие процедуры.
Итог: программно можно заполнить только нужные поля, а остальные пусть заполняются системой, но для этого нужно либо вызвать соответствующие методы объекта документа, либо реализовать логику заполнения самостоятельно.
Рекомендую посмотреть здесь:
https://infostart.ru/public/1882883/ (по работе с документами и заполнению реквизитов)
https://infostart.ru/public/1175136/ (пример добавления и работы с реквизитами и состояниями)