Почему программно не создается документ в управляемой форме 1С 8.3?

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

При разработке обработок загрузки данных начинающие разработчики часто сталкиваются с ситуацией, когда код процедуры написан без явных синтаксических ошибок, кнопка нажимается, но новый документ в базе данных так и не появляется. Разберем по шагам, почему возникает эта проблема, какие ошибки часто допускаются в клиент-серверном взаимодействии и как правильно организовать создание и проведение документов программно.

Причина 1. Отсутствие вызова серверной процедуры из обработчика команды

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

Посмотрим на исходный пример, где обработка файла происходила на клиенте, а серверная процедура осталась изолированной:


&НаКлиенте
Процедура КнопкаВыполнитьНажатие(Команда)
    // Обработка данных
    // Серверная процедура СоздатьНовыйДокумент() здесь не вызывалась!
КонецПроцедуры

&НаСервере
Процедура СоздатьНовыйДокумент()
    // Логика создания документа
КонецПроцедуры

Чтобы код отработал, свяжем клиентскую команду и серверный контекст:


&НаКлиенте
Процедура КнопкаВыполнитьНажатие(Команда)
    СоздатьНовыйДокументНаСервере();
КонецПроцедуры

&НаСервере
Процедура СоздатьНовыйДокументНаСервере()
    // Создание и запись документа
КонецПроцедуры

Причина 2. Синтаксические ошибки при обращении к методам и функциям

В коде создания объектов 1С важно соблюдать корректный синтаксис вызова методов. Рассмотрим типичные неточности:

  1. Пропущенные круглые скобки: конструкции вида Документы.ПеремещениеТоваров.СоздатьДокумент или ТекущаяДата без скобок () не вызывают метод или системную функцию, а возвращают описание объекта/метода. Обязательно пишем Документы.ПеремещениеТоваров.СоздатьДокумент().
  2. Использование серверного времени: вместо функции ТекущаяДата() на сервере рекомендуется применять ТекущаяДатаСеанса(), чтобы учитывать часовой пояс пользователя, запустившего сеанс.

Причина 3. Ошибки при записи, нумерации и проведении

Разберем нюансы сохранения созданного документа в информационной базе:

  1. Избыточная двойная запись: вызов метода НовыйДокумент.Записать(РежимЗаписиДокумента.Запись); непосредственно перед НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение); создает лишнюю транзакцию и нагрузку на СУБД. Если документ нужно сразу провести, достаточно одного вызова с режимом РежимЗаписиДокумента.Проведение.
  2. Ручная установка номеров: прямое присвоение строкового значения в свойство Номер сбивает механизм автонумерации платформы. Рекомендуется использовать метод НовыйДокумент.УстановитьНовыйНомер(); или оставить формирование номера платформе при первой записи.
  3. Инициализация значений по умолчанию: вызов СоздатьДокумент() создает полностью пустой объект. Чтобы сработал стандартный модуль объекта и реквизиты заполнились типовыми значениями, вызовем метод НовыйДокумент.Заполнить(Неопределено);.

Пример корректного создания документа

Объединим рекомендации и посмотрим на готовый шаблон процедуры создания документа на сервере:


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

Как настроить отладку серверного кода

Выясним причину, почему точки останова могут не срабатывать в процедурах с директивой &НаСервере. По умолчанию служба кластера серверов 1С запускается без режима отладки. Чтобы отладчик останавливался в серверных модулях:

  1. Запуск службы с флагом отладки: в свойствах службы 1С:Предприятия (ragent) в параметре запуска необходимо указать ключ -debug.
  2. Проверка протокола отладки: при использовании отладки по протоколу HTTP убедимся, что запущен модуль dbgs, а соответствующие порты открыты в брандмауэре.
  3. Подключение предметов отладки: в конфигураторе в меню Отладка -> Подключение проверим, включено ли автоматическое подключение к фоновым заданиям и серверным сеансам.

Работа с файлами в клиент-серверной архитектуре

Если данные для документа считываются из внешнего XML-файла, важно учитывать, что сервер 1С не имеет прямого доступа к файловой системе клиентского компьютера (по путям вида C:\test\test.xml). Правильная схема работы:

  1. На клиенте выбираем файл и помещаем его во временное хранилище с помощью метода ПоместитьФайлНаСервер() или ПоместитьФайлыНаСервер().
  2. Передаем полученный адрес во временном хранилище в серверную процедуру.
  3. На сервере получаем двоичные данные через ПолучитьИзВременногоХранилища() и выполняем парсинг через ЧтениеXML или ФабрикаXDTO.
← На главную