Почему отчет в 1С:УНФ выдает пустой результат в облачной базе, хотя в файловой копии все работает?

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

Разработка отчетов для конфигурации «1С:Управление нашей фирмой» (УНФ) часто преподносит сюрпризы при переносе кода из локальной (файловой) среды в облачную инфраструктуру (например, арендованную базу на серверах провайдеров вроде Рарус или сервиса 1cfresh). Типичная ситуация: программист пишет отчет на локальной копии, все данные выводятся корректно, но после загрузки в рабочую облачную базу отчет формирует только «шапку», а тело документа остается абсолютно пустым. Рассмотрим причины этой проблемы и способы ее решения.

Анализ основной причины: Коварство метода НайтиПоНаименованию

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


Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Менеджер по продажам"));

Выясним причину, почему это работает в файловой базе и отказывает в серверной. Конфигурация УНФ построена на базе Библиотеки стандартных подсистем (БСП). В этой системе дополнительные реквизиты — это элементы плана видов характеристик (ПВХ), которые могут иметь разные внутренние идентификаторы в разных базах, даже если они выглядят одинаково для пользователя.

Почему НайтиПоНаименованию — это плохая практика:

  1. Разделение данных: В облачных сервисах часто используется режим разделения данных (SaaS). При миграции или создании новых свойств наименование элемента ПВХ может формироваться динамически, включая в себя имя владельца (например, «Менеджер по продажам (Заказ покупателя)»).
  2. Дублирование имен: В базе может существовать несколько свойств с одинаковым заголовком для разных документов. Метод НайтиПоНаименованию вернет первый попавшийся, который может не относиться к табличной части нужного документа.
  3. Локализация и кэш: В серверном варианте работы кэш метаданных обновляется иначе. Если свойство было переименовано или создано программно, поиск по строке может вернуть пустую ссылку (БитыеСсылки).

Правильный способ поиска дополнительных реквизитов

Разберем, как сделать поиск свойства надежным. В БСП у дополнительных реквизитов есть реквизит Имя (или внутренний идентификатор для разработчиков). Рекомендуется использовать поиск по этому уникальному имени или по внутреннему заголовку. Рассмотрим пример более стабильного кода:


// Поиск по внутреннему имени (если оно задано в конфигурации)
СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("ИмяПредопределенногоДанного", "МенеджерПоПродажам");

// Или поиск по заголовку через метаданные БСП
Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Заголовок", "Менеджер по продажам"));

Если поиск все равно возвращает пустую ссылку, проанализируем ситуацию с помощью консоли запросов непосредственно в арендованной базе. Это позволит убедиться, что свойство с таким наименованием действительно существует и доступно текущему пользователю.

Проблема использования регистра ФактОплатыЗаказов

В тексте запроса автора присутствует соединение с регистром РегистрСведений.ФактОплатыЗаказов. Это специфический объект УНФ, данные в который попадают не всегда напрямую при проведении документов.

Проанализируем условие в блоке ГДЕ:


И ФактОплатыЗаказов.СуммаОплаты + ФактОплатыЗаказов.СуммаАванса - ФактОплатыЗаказов.Сумма >= 0

В арендованных базах часто ограничивается работа регламентных заданий для экономии ресурсов. В УНФ за заполнение регистра ФактОплатыЗаказов отвечает фоновое задание по расчету статусов оплаты. Если в облаке это задание отключено или работает с большой задержкой, регистр будет пуст. В файловой копии данные могли сохраниться от предыдущих ручных обновлений, а в облаке их просто нет. В результате ЛЕВОЕ СОЕДИНЕНИЕ при наложении жесткого фильтра в ГДЕ превращается во ВНУТРЕННЕЕ, и запрос не возвращает ни одной строки.

Совет: Используйте проверку на NULL или выносите условия по регистрам расчетов в параметры виртуальных таблиц, чтобы отсутствие данных по оплате не скрывало сами документы продажи.

Оптимизация: Запросы в цикле — главная ошибка производительности

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

  1. Сетевые задержки (Latency): В облаке каждое обращение к серверу БД — это сетевой пакет. Если в отчете 1000 строк, отчет сделает 1000 дополнительных микро-запросов. Суммарная задержка может привести к тому, что сервер приложений прервет выполнение по таймауту.
  2. Блокировки: Постоянные мелкие запросы к РегистрСведений.ЦеныНоменклатуры.СрезПоследних создают лишнюю нагрузку на сервер БД.

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

Пример оптимизации структуры запроса:


// Вместо функции в цикле, добавьте соединение в основной запрос
// ВЫБРАТЬ ...
// ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаПо, ) КАК Цены
// ПО ...

Влияние прав доступа и RLS в облаке

Выясним еще одну возможную причину «пустоты» отчета — RLS (Record Level Security). В арендованных базах права доступа часто настроены более жестко, чем в локальных тестовых копиях.

Если запрос написан без использования конструкции ВЫБРАТЬ РАЗРЕШЕННЫЕ, а у пользователя в облаке ограничены права, например, на конкретный Филиал (Структурную единицу) или Контрагента, система может вернуть пустой результат вместо ошибки доступа. Всегда добавляйте ключевое слово РАЗРЕШЕННЫЕ в текст запроса, чтобы отчет выводил те данные, на которые у пользователя есть права.

Итоги и рекомендации

Подводя итог, если ваш отчет работает локально, но пуст в облаке УНФ, выполните следующие шаги:

  1. Замените НайтиПоНаименованию на поиск по внутреннему идентификатору или реквизиту Имя.
  2. Проверьте заполненность служебных регистров (например, ФактОплатыЗаказов) в облачной базе через «Функции для технического специалиста».
  3. Добавьте в запросы ВЫБРАТЬ РАЗРЕШЕННЫЕ.
  4. Избавьтесь от запросов в цикле (функция ПолучитьСумму), объединив их в один пакетный запрос. Это не только ускорит отчет, но и исключит ошибки из-за таймаутов серверных вызовов.
← На главную