Почему серверная процедура 1С не выполняется в облаке, хотя на локальном компьютере всё работает?

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

При разработке расширений или внешних обработок в среде 1С:Предприятие программисты часто сталкиваются с ситуацией: на локальной базе «всё летает», а после переноса в рабочую среду (особенно в облачные сервисы, такие как 42clouds) часть функционала перестает работать без видимых ошибок. Рассмотрим, почему процедура может «молча» игнорироваться, и разберем методы диагностики в условиях, когда классическая отладка через конфигуратор недоступна.

Анализ проблемы: контекст исполнения и облачные ограничения

Проанализируем ситуацию: у нас есть две серверные процедуры. Первая успешно считывает файл Excel через ТабличныйДокумент, а вторая, предназначенная для обработки полученных данных, не подает признаков жизни. Важно понимать, что в облачных инфраструктурах клиент и сервер разделены сложными сетевыми экранами, а права доступа расширений часто ограничены «безопасным режимом».

Разберем основные причины, по которым код может не выполняться:

  1. Отсутствие доступа к отладчику: В облаке серверная отладка чаще всего выключена. Когда вы ставите точку останова, конфигуратор «ловит» только клиентские вызовы. Переход в серверную процедуру не происходит, и создается ложное впечатление, что код не выполняется, хотя на самом деле он может просто отрабатывать с ошибкой, которая подавляется платформой или логикой кода.
  2. Опечатки и различия в именах объектов: При переносе расширения между базами (через выгрузку/загрузку) могут возникнуть несоответствия в именах реквизитов формы. Если код обращается к таблице значений, которая в расширении названа иначе, чем в тестовой базе, серверная процедура либо упадет с ошибкой, либо (при наличии оберток Попытка...Исключение) просто прекратит выполнение.
  3. Безопасный режим расширения: В облаке расширения часто работают в безопасном режиме. Это блокирует доступ к файловой системе сервера и внешним компонентам.

Диагностика через журнал регистрации

Когда мы не можем «зайти» в код отладчиком, единственным надежным инструментом становится Журнал регистрации. Вместо использования метода Сообщить(), который на сервере может вести себя непредсказуемо в контексте фоновых заданий или специфических настроек облака, рассмотрим использование метода ЗаписьЖурналаРегистрации().

Добавим в код контрольные точки, чтобы выяснить, доходит ли выполнение до нужного алгоритма:


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

    Если Выгрузка = Перечисления.ПеречисленияДляВыгрузкиЗагрузки.Этикетки Тогда 
        ЗаписатьЭтикетки();
    Иначе
        ЗаписьЖурналаРегистрации("МояОбработка.Диагностика", 
            УровеньЖурналаРегистрации.Предупреждение, , , 
            "Условие по перечислению не выполнено. Текущее значение: " + Выгрузка);
    КонецЕсли;

КонецПроцедуры

После выполнения кода в режиме 1С:Предприятие откройте Администрирование — Обслуживание — Журнал регистрации. Отфильтруйте записи по событию «МояОбработка.Диагностика». Если записей нет — процедура действительно не вызывается. Если записи есть — вы увидите, на каком этапе логика свернула не туда.

Проблема именования реквизитов и кэширования

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

Проверим это, добавив проверку на количество строк перед циклом:


&НаСервере
Процедура ЗаписатьЭтикетки()
    // Проанализируем, ту ли таблицу мы обходим
    Если Объект.ТоварыДляЗагрузки.Количество() = 0 Тогда
        ЗаписьЖурналаРегистрации("ОшибкаЛогики", УровеньЖурналаРегистрации.Ошибка, , , "Таблица пуста!");
        Возврат;
    КонецЕсли;

    Для Каждого Строка Из Объект.ТоварыДляЗагрузки Цикл
        // Поиск и заполнение номенклатуры
    КонецЦикла;
КонецПроцедуры

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

Особенности работы с Excel в облаке (SaaS)

Если ваша обработка использует COMОбъект("Excel.Application"), в облаке она почти наверняка не будет работать, так как на серверах провайдера часто не установлен пакет Microsoft Office. В приведенном автором коде используется метод табДок.Прочитать(ИмяФайла). Это правильный подход, так как он использует встроенные механизмы платформы 1С и не зависит от стороннего ПО.

Однако помните: путь к файлу ИмяФайла должен быть доступен серверу. Если вы выбрали файл на своем компьютере, сервер облака его не увидит. Файл необходимо предварительно передать на сервер через ПоместитьФайлВоВременноеХранилище().

Рассмотрим правильную схему загрузки:

  1. На клиенте выбираем файл и помещаем его во временное хранилище.
  2. Передаем адрес хранилища на сервер.
  3. На сервере извлекаем данные из хранилища в ТабличныйДокумент.

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

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

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

Если процедура в 1С «не срабатывает» после переноса в облако, выполните следующие шаги:

  1. Проверьте Журнал регистрации: это ваш главный «глаз» в отсутствие отладчика.
  2. Убедитесь в именовании: проверьте, что в коде расширения указаны именно те реквизиты, которые созданы на форме.
  3. Контролируйте типы данных: убедитесь, что реквизиты типа Перечисление или Справочник заполнены корректно и соответствуют условиям Если...Тогда.

Скрупулезная проверка имен объектов и использование логов позволяют решить 99% проблем, связанных с «неработающими» процедурами в облачных средах.

← На главную