При разработке расширений или внешних обработок в среде 1С:Предприятие программисты часто сталкиваются с ситуацией: на локальной базе «всё летает», а после переноса в рабочую среду (особенно в облачные сервисы, такие как 42clouds) часть функционала перестает работать без видимых ошибок. Рассмотрим, почему процедура может «молча» игнорироваться, и разберем методы диагностики в условиях, когда классическая отладка через конфигуратор недоступна.
Проанализируем ситуацию: у нас есть две серверные процедуры. Первая успешно считывает файл Excel через ТабличныйДокумент, а вторая, предназначенная для обработки полученных данных, не подает признаков жизни. Важно понимать, что в облачных инфраструктурах клиент и сервер разделены сложными сетевыми экранами, а права доступа расширений часто ограничены «безопасным режимом».
Разберем основные причины, по которым код может не выполняться:
Попытка...Исключение) просто прекратит выполнение.Когда мы не можем «зайти» в код отладчиком, единственным надежным инструментом становится Журнал регистрации. Вместо использования метода Сообщить(), который на сервере может вести себя непредсказуемо в контексте фоновых заданий или специфических настроек облака, рассмотрим использование метода ЗаписьЖурналаРегистрации().
Добавим в код контрольные точки, чтобы выяснить, доходит ли выполнение до нужного алгоритма:
&НаСервере
Процедура ЗаполнитьНоменклатуруНаСервере()
// Пишем в журнал начало процедуры
ЗаписьЖурналаРегистрации("МояОбработка.Диагностика",
УровеньЖурналаРегистрации.Информация, , ,
"Запуск заполнения номенклатуры. Количество строк: " + Объект.ТаблицаДанных.Количество());
Если Выгрузка = Перечисления.ПеречисленияДляВыгрузкиЗагрузки.Этикетки Тогда
ЗаписатьЭтикетки();
Иначе
ЗаписьЖурналаРегистрации("МояОбработка.Диагностика",
УровеньЖурналаРегистрации.Предупреждение, , ,
"Условие по перечислению не выполнено. Текущее значение: " + Выгрузка);
КонецЕсли;
КонецПроцедуры
После выполнения кода в режиме 1С:Предприятие откройте Администрирование — Обслуживание — Журнал регистрации. Отфильтруйте записи по событию «МояОбработка.Диагностика». Если записей нет — процедура действительно не вызывается. Если записи есть — вы увидите, на каком этапе логика свернула не туда.
Выясним причину, которая часто ставит в тупик: несоответствие имен таблиц. Рассмотрим пример ошибки, которую допустил автор темы. На форме расширения могут присутствовать две таблицы со схожими именами, например, ТаблицаТоваров (заимствованная) и ТаблицаДанныхДляЗагрузки (собственная). Если в коде идет перебор не той таблицы, процедура отработает мгновенно и без ошибок, так как коллекция будет пустой.
Проверим это, добавив проверку на количество строк перед циклом:
&НаСервере
Процедура ЗаписатьЭтикетки()
// Проанализируем, ту ли таблицу мы обходим
Если Объект.ТоварыДляЗагрузки.Количество() = 0 Тогда
ЗаписьЖурналаРегистрации("ОшибкаЛогики", УровеньЖурналаРегистрации.Ошибка, , , "Таблица пуста!");
Возврат;
КонецЕсли;
Для Каждого Строка Из Объект.ТоварыДляЗагрузки Цикл
// Поиск и заполнение номенклатуры
КонецЦикла;
КонецПроцедуры
Также не стоит забывать про серверный кэш. В облачных средах при обновлении расширения сервер приложений может продолжать использовать старую версию скомпилированного кода. Если вы уверены, что код верный, попробуйте перезапустить сеанс или обратитесь в техподдержку облака для очистки серверного кэша.
Если ваша обработка использует COMОбъект("Excel.Application"), в облаке она почти наверняка не будет работать, так как на серверах провайдера часто не установлен пакет Microsoft Office. В приведенном автором коде используется метод табДок.Прочитать(ИмяФайла). Это правильный подход, так как он использует встроенные механизмы платформы 1С и не зависит от стороннего ПО.
Однако помните: путь к файлу ИмяФайла должен быть доступен серверу. Если вы выбрали файл на своем компьютере, сервер облака его не увидит. Файл необходимо предварительно передать на сервер через ПоместитьФайлВоВременноеХранилище().
Рассмотрим правильную схему загрузки:
ТабличныйДокумент.
&НаКлиенте
Процедура Загрузить(Команда)
// Помещаем файл во временное хранилище
Описание = Новый ОписаниеПередаваемогоФайла(ИмяФайла);
ПередаваемыеФайлы = Новый Массив;
ПередаваемыеФайлы.Добавить(Описание);
НачатьПомещениеФайловНаСервер(,, ПередаваемыеФайлы, УникальныйИдентификатор);
КонецПроцедуры
// В обработчике завершения или после помещения:
&НаСервере
Процедура ЗагрузитьНаСервере(АдресХранилища)
ДанныеФайла = ПолучитьИзВременногоХранилища(АдресХранилища);
// Теперь работаем с данными
КонецПроцедуры
Если процедура в 1С «не срабатывает» после переноса в облако, выполните следующие шаги:
Перечисление или Справочник заполнены корректно и соответствуют условиям Если...Тогда.Скрупулезная проверка имен объектов и использование логов позволяют решить 99% проблем, связанных с «неработающими» процедурами в облачных средах.