В процессе разработки интеграционных решений, таких как панели телефонии, часто возникает задача автоматического создания и записи документов. Иногда требуется зафиксировать факт события или звонка, даже если пользователь не открывал форму документа для ручного заполнения. Рассмотрим, как эффективно решить эту задачу и разберемся, почему возникают сложности при работе с ДанныеФормыСтруктура.
Важно понимать фундаментальное различие между представлением данных на экране и объектом в базе данных. В управляемом приложении:
Данные формы — это отражение объекта, оптимизированное для отображения на клиенте.Объект (ДокументОбъект, СправочникОбъект) — это полноценная сущность, доступная на сервере, которая имеет методы Записать(), Провести() и другие.Попытки напрямую присвоить ссылку полю ДанныеФормыСтруктура обычно терпят неудачу, так как это поле является лишь частью структуры отображения. Для полноценного управления объектом нам нужно использовать серверные методы.
Если форма уже существует (например, была создана платформой при открытии панели телефонии), самым простым и быстрым способом сохранить данные является вызов метода Записать() напрямую у объекта формы. Платформа сама определит, что нужно преобразовать данные формы в объект и сохранить его в информационной базе.
Рассмотрим, как это выглядит в коде:
// Пример вызова записи из контекста формы или владельца формы
Если ФормаДокумента.Открыта() Тогда
ФормаДокумента.Записать();
Иначе
// Если форма не открыта, но объект создан
ФормаДокумента.ВладелецФормы.Записать();
КонецЕсли;
Этот подход удобен, так как он автоматически обновляет состояние формы и связанные с ней элементы интерфейса, сохраняя ссылочную целостность.
Если вам требуется выполнить более сложные манипуляции с документом перед записью, или если вы хотите работать с документом как с объектом без участия интерфейса, воспользуйтесь методом РеквизитФормыВЗначение(). Этот метод позволяет «извлечь» объект из формы, внести в него любые изменения и записать его штатно.
Разберем последовательность шагов:
Записать() у полученного объекта.
&НаСервере
Процедура ЗаписатьДокументПрограммно(ИмяРеквизитаОбъекта)
// Получаем объект документа из формы
ОбъектДокумента = РеквизитФормыВЗначение(ИмяРеквизитаОбъекта);
// Выполняем действия с объектом
ОбъектДокумента.Дата = ТекущаяДата();
ОбъектДокумента.Комментарий = "Записано автоматически";
// Записываем документ в базу
ОбъектДокумента.Записать();
КонецПроцедуры
Для создания надежных и поддерживаемых решений рекомендуем придерживаться следующих правил:
Документы.ИмяДокумента.СоздатьДокумент(), а не инициализировать формы.Проанализировав ситуацию, можно сделать вывод: если ваша задача — просто сохранить текущее состояние формы, используйте метод Записать(). Если же требуется гибкое управление данными — используйте РеквизитФормыВЗначение(). Это сделает ваш код чище и избавит от проблем с обработкой объектов, которые «не открываются» для пользователя.