Как программно записать документ из управляемой формы в 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет IT и автоматизация бизнеса
← На главную

В процессе разработки интеграционных решений, таких как панели телефонии, часто возникает задача автоматического создания и записи документов. Иногда требуется зафиксировать факт события или звонка, даже если пользователь не открывал форму документа для ручного заполнения. Рассмотрим, как эффективно решить эту задачу и разберемся, почему возникают сложности при работе с ДанныеФормыСтруктура.

Разберемся в архитектуре данных

Важно понимать фундаментальное различие между представлением данных на экране и объектом в базе данных. В управляемом приложении:

  1. Данные формы — это отражение объекта, оптимизированное для отображения на клиенте.
  2. Объект (ДокументОбъект, СправочникОбъект) — это полноценная сущность, доступная на сервере, которая имеет методы Записать(), Провести() и другие.

Попытки напрямую присвоить ссылку полю ДанныеФормыСтруктура обычно терпят неудачу, так как это поле является лишь частью структуры отображения. Для полноценного управления объектом нам нужно использовать серверные методы.

Способ 1: Использование метода Записать() у формы

Если форма уже существует (например, была создана платформой при открытии панели телефонии), самым простым и быстрым способом сохранить данные является вызов метода Записать() напрямую у объекта формы. Платформа сама определит, что нужно преобразовать данные формы в объект и сохранить его в информационной базе.

Рассмотрим, как это выглядит в коде:


// Пример вызова записи из контекста формы или владельца формы
Если ФормаДокумента.Открыта() Тогда
    ФормаДокумента.Записать();
Иначе
    // Если форма не открыта, но объект создан
    ФормаДокумента.ВладелецФормы.Записать();
КонецЕсли;

Этот подход удобен, так как он автоматически обновляет состояние формы и связанные с ней элементы интерфейса, сохраняя ссылочную целостность.

Способ 2: Использование метода РеквизитФормыВЗначение

Если вам требуется выполнить более сложные манипуляции с документом перед записью, или если вы хотите работать с документом как с объектом без участия интерфейса, воспользуйтесь методом РеквизитФормыВЗначение(). Этот метод позволяет «извлечь» объект из формы, внести в него любые изменения и записать его штатно.

Разберем последовательность шагов:

  1. Получаем объект из формы на сервере.
  2. Вносим необходимые изменения в поля объекта.
  3. Вызываем метод Записать() у полученного объекта.

&НаСервере
Процедура ЗаписатьДокументПрограммно(ИмяРеквизитаОбъекта)
    // Получаем объект документа из формы
    ОбъектДокумента = РеквизитФормыВЗначение(ИмяРеквизитаОбъекта);
    
    // Выполняем действия с объектом
    ОбъектДокумента.Дата = ТекущаяДата();
    ОбъектДокумента.Комментарий = "Записано автоматически";
    
    // Записываем документ в базу
    ОбъектДокумента.Записать();
КонецПроцедуры

Рекомендации по оптимизации

Для создания надежных и поддерживаемых решений рекомендуем придерживаться следующих правил:

Проанализировав ситуацию, можно сделать вывод: если ваша задача — просто сохранить текущее состояние формы, используйте метод Записать(). Если же требуется гибкое управление данными — используйте РеквизитФормыВЗначение(). Это сделает ваш код чище и избавит от проблем с обработкой объектов, которые «не открываются» для пользователя.

← На главную