Разработка отчетов для конфигурации «1С:Управление нашей фирмой» (УНФ) часто преподносит сюрпризы при переносе кода из локальной (файловой) среды в облачную инфраструктуру (например, арендованную базу на серверах провайдеров вроде Рарус или сервиса 1cfresh). Типичная ситуация: программист пишет отчет на локальной копии, все данные выводятся корректно, но после загрузки в рабочую облачную базу отчет формирует только «шапку», а тело документа остается абсолютно пустым. Рассмотрим причины этой проблемы и способы ее решения.
Проанализируем фрагмент кода, который чаще всего становится «бутылочным горлышком» при работе в разных средах. В предоставленном примере разработчик устанавливает параметр запроса следующим образом:
Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Менеджер по продажам"));
Выясним причину, почему это работает в файловой базе и отказывает в серверной. Конфигурация УНФ построена на базе Библиотеки стандартных подсистем (БСП). В этой системе дополнительные реквизиты — это элементы плана видов характеристик (ПВХ), которые могут иметь разные внутренние идентификаторы в разных базах, даже если они выглядят одинаково для пользователя.
Почему НайтиПоНаименованию — это плохая практика:
НайтиПоНаименованию вернет первый попавшийся, который может не относиться к табличной части нужного документа.БитыеСсылки).Разберем, как сделать поиск свойства надежным. В БСП у дополнительных реквизитов есть реквизит Имя (или внутренний идентификатор для разработчиков). Рекомендуется использовать поиск по этому уникальному имени или по внутреннему заголовку. Рассмотрим пример более стабильного кода:
// Поиск по внутреннему имени (если оно задано в конфигурации)
СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("ИмяПредопределенногоДанного", "МенеджерПоПродажам");
// Или поиск по заголовку через метаданные БСП
Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Заголовок", "Менеджер по продажам"));
Если поиск все равно возвращает пустую ссылку, проанализируем ситуацию с помощью консоли запросов непосредственно в арендованной базе. Это позволит убедиться, что свойство с таким наименованием действительно существует и доступно текущему пользователю.
В тексте запроса автора присутствует соединение с регистром РегистрСведений.ФактОплатыЗаказов. Это специфический объект УНФ, данные в который попадают не всегда напрямую при проведении документов.
Проанализируем условие в блоке ГДЕ:
И ФактОплатыЗаказов.СуммаОплаты + ФактОплатыЗаказов.СуммаАванса - ФактОплатыЗаказов.Сумма >= 0
В арендованных базах часто ограничивается работа регламентных заданий для экономии ресурсов. В УНФ за заполнение регистра ФактОплатыЗаказов отвечает фоновое задание по расчету статусов оплаты. Если в облаке это задание отключено или работает с большой задержкой, регистр будет пуст. В файловой копии данные могли сохраниться от предыдущих ручных обновлений, а в облаке их просто нет. В результате ЛЕВОЕ СОЕДИНЕНИЕ при наложении жесткого фильтра в ГДЕ превращается во ВНУТРЕННЕЕ, и запрос не возвращает ни одной строки.
Совет: Используйте проверку на NULL или выносите условия по регистрам расчетов в параметры виртуальных таблиц, чтобы отсутствие данных по оплате не скрывало сами документы продажи.
Посмотрим на функцию ПолучитьСумму в коде автора. Она вызывается внутри цикла по каждой строке результата основного запроса. Внутри функции выполняется еще один запрос к срезу последних цен. Рассмотрим, почему в облаке это критично:
РегистрСведений.ЦеныНоменклатуры.СрезПоследних создают лишнюю нагрузку на сервер БД.Как сделать лучше: Проанализируем возможность объединения запросов. Все цены по прайсам нужно получить одним запросом во временную таблицу и затем соединить ее с основными данными. Это классический подход 1С, который гарантирует работу отчета за секунды вместо минут.
Пример оптимизации структуры запроса:
// Вместо функции в цикле, добавьте соединение в основной запрос
// ВЫБРАТЬ ...
// ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаПо, ) КАК Цены
// ПО ...
Выясним еще одну возможную причину «пустоты» отчета — RLS (Record Level Security). В арендованных базах права доступа часто настроены более жестко, чем в локальных тестовых копиях.
Если запрос написан без использования конструкции ВЫБРАТЬ РАЗРЕШЕННЫЕ, а у пользователя в облаке ограничены права, например, на конкретный Филиал (Структурную единицу) или Контрагента, система может вернуть пустой результат вместо ошибки доступа. Всегда добавляйте ключевое слово РАЗРЕШЕННЫЕ в текст запроса, чтобы отчет выводил те данные, на которые у пользователя есть права.
Подводя итог, если ваш отчет работает локально, но пуст в облаке УНФ, выполните следующие шаги:
НайтиПоНаименованию на поиск по внутреннему идентификатору или реквизиту Имя.ФактОплатыЗаказов) в облачной базе через «Функции для технического специалиста».ВЫБРАТЬ РАЗРЕШЕННЫЕ.ПолучитьСумму), объединив их в один пакетный запрос. Это не только ускорит отчет, но и исключит ошибки из-за таймаутов серверных вызовов.