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