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

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

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

Разбор синтаксической ошибки

В нашей практике мы столкнулись с ошибкой Тип не определен при попытке инициализировать объект документа. Автор вопроса использовал следующий код:


ДокОбъект = ДанныеФормыВЗначение(ДанныеФормы, Тип("ДокументОбъект.ДвижениеПрочихАктивовПассивов)"));

Проанализируем причину сбоя. В строке кода была допущена опечатка: закрывающая круглая скобка попала внутрь кавычек. Платформа 1С ожидает, что внутри функции Тип() будет передана строка с полным именем метаданного. Лишний символ делает это имя некорректным, поэтому система не может найти такой тип. Чтобы исправить проблему, достаточно просто убрать лишнюю скобку:


ДокОбъект = ДанныеФормыВЗначение(ДанныеФормы, Тип("ДокументОбъект.ДвижениеПрочихАктивовПассивов"));

Оптимизация работы с формой: прямой доступ к данным

Хотя исправление опечатки решит проблему, мы рекомендуем пересмотреть подход к работе с формой. Использование преобразований ДанныеФормыВЗначение и ЗначениеВДанныеФормы на сервере является довольно «тяжелой» операцией для системы, так как она требует полной сериализации данных объекта.

Если вам нужно просто изменить значение реквизита (например, даты) у нового документа, можно сделать это гораздо проще — на стороне клиента, сразу после получения формы. Рассмотрим, как это сделать:

  1. Получите форму с помощью метода ПолучитьФорму().
  2. Обратитесь к объекту формы через свойство Объект.
  3. Установите необходимое значение.
  4. Откройте форму.

Посмотрим на пример такого кода:


Процедура ДвижениеПрочихАктивовПассивов(Команда)
    Форма = ПолучитьФорму("Документ.ДвижениеПрочихАктивовПассивов.ФормаОбъекта");
    Форма.Объект.Дата = РабочаяДата;
    Форма.Открыть();
КонецПроцедуры

Этот способ имеет несколько преимуществ:

Когда стоит использовать серверные методы?

Несмотря на удобство клиентского доступа к реквизитам, метод ДанныеФормыВЗначение остается незаменимым в более сложных ситуациях. Разберем, в каких случаях мы вынуждены прибегать к серверной обработке:

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

  1. Передавайте ДанныеФормы на сервер.
  2. Выполняйте конвертацию в ДокументОбъект.
  3. Производите необходимые расчеты или заполнения.
  4. Возвращайте изменения обратно в ДанныеФормы с помощью метода ЗначениеВДанныеФормы.

Подведем итоги

Мы выяснили, что ошибка при инициализации объекта часто кроется в опечатках при указании строки типа. Однако, прежде чем писать сложный код с серверными преобразованиями, всегда задавайте себе вопрос: можно ли решить эту задачу проще? Чаще всего для установки стандартных реквизитов, таких как Дата, Организация или Валюта, достаточно прямого обращения к Форма.Объект на стороне клиента.

Используйте этот простой прием, чтобы сделать ваш код чище, быстрее и надежнее!

← На главную