При разработке дополнительных отчетов и обработок для сервиса 1С:Фреш (1cfresh.com) программисты часто сталкиваются с жестким отказом аудита. Одной из самых распространенных причин является использование в текстах запросов обращений к реквизитам через точку от полей составного типа. На первый взгляд это кажется избыточным требованием, ограничивающим удобство платформы, однако за этим правилом стоят серьезные архитектурные и технические причины. В данной статье мы подробно разберем, почему «экономия на спичках» в коде может привести к деградации всего облачного сервиса, и научимся писать запросы, которые легко проходят аудит.
Рассмотрим ситуацию, когда в запросе происходит обращение к полю ДокументОснование.Склад, где ДокументОснование имеет составной тип, включающий, например, 30 различных видов документов. Проанализируем, что происходит на уровне системы управления базами данных (СУБД). Платформа 1С для получения значения реквизита через точку вынуждена выполнить соединение (LEFT OUTER JOIN) со всеми таблицами, которые входят в этот составной тип.
Если в составной тип входит 30 типов документов, в итоговом SQL-запросе появится 30 дополнительных соединений. Это приводит к следующим последствиям:
Выясним причину, по которой админы 1С:Фреш не могут просто «добавить оперативной памяти» или ограничить ресурсы конкретного пользователя. В отличие от обычного облачного хостинга, где у каждого клиента своя база данных, 1С:Фреш работает по технологии Multi-tenancy (многоарендность).
В этой архитектуре тысячи организаций (областей данных) физически находятся в одной информационной базе SQL. Разделение данных происходит на программном уровне с помощью механизма Разделители данных. Это означает следующее:
Таким образом, аудит кода — это не «административная импотенция», а необходимый инструмент защиты стабильности сервиса для всех его клиентов.
Рассмотрим, как изменить подход к написанию кода, чтобы соответствовать стандартам 1С и успешно проходить аудит. Основная задача — исключить неопределенность типов в запросе.
Если мы заранее знаем, реквизиты какого именно типа документа нам нужны, мы должны явно указать это платформе. Разберем пример оптимизированного запроса:
ВЫБРАТЬ
ВЫРАЗИТЬ(Источник.ДокументОснование КАК Документ.РеализацияТоваровУслуг).Склад КАК Склад,
Источник.Ссылка КАК Ссылка
ИЗ
Документ.МаркировкаТоваровИСМП КАК Источник
ГДЕ
Источник.ДокументОснование ССЫЛКА Документ.РеализацияТоваровУслуг
В данном случае, благодаря использованию ВЫРАЗИТЬ, платформа создаст соединение только с одной таблицей Документ.РеализацияТоваровУслуг, что существенно снизит нагрузку на СУБД.
Если нам нужно получить данные из нескольких типов документов, входящих в составной тип, рекомендуется сначала отобрать ссылки во временную таблицу, сгруппировав их по типам. Проанализируем алгоритм:
ВЫРАЗИТЬ.ОБЪЕДИНИТЬ ВСЕ.Пример структуры такого запроса:
// Шаг 1: Отбор ссылок
ВЫБРАТЬ
Т.ДокументОснование КАК СсылкаОснование
ПОМЕСТИТЬ ВТ_Основания
ИЗ
Документ.МаркировкаТоваровИСМП КАК Т;
// Шаг 2: Выборка с типизацией
ВЫБРАТЬ
ВЫРАЗИТЬ(ВТ.СсылкаОснование КАК Документ.РеализацияТоваровУслуг).Склад КАК Склад
ИЗ
ВТ_Основания КАК ВТ
ГДЕ
ВТ.СсылкаОснование ССЫЛКА Документ.РеализацияТоваровУслуг
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВЫРАЗИТЬ(ВТ.СсылкаОснование КАК Документ.ОтчетОРозничныхПродажах).Склад
ИЗ
ВТ_Основания КАК ВТ
ГДЕ
ВТ.СсылкаОснование ССЫЛКА Документ.ОтчетОРозничныхПродажах
Посмотрим на реальные цифры. Как показывает практика эксплуатации крупных баз, один некорректный запрос к составному типу может загрузить 16-ядерный SQL-сервер на 100%. После исправления запроса с использованием явной типизации (через ВЫРАЗИТЬ или временные таблицы) нагрузка падает до 4-15%. Это критическая разница, которая определяет, будет ли сервис работать или «лежать».
Чтобы ваша обработка прошла проверку с первого раза, придерживайтесь следующих правил:
ВЫРАЗИТЬ.Ссылка.Реквизит.Реквизит2.Реквизит3.FreshPublic), чтобы вовремя заметить ошибки работы с общими данными.Подводя итог, можно сказать, что требования 1С:Фреш — это не прихоть администраторов, а промышленный стандарт разработки. Переход от «быстрого говнокода» к качественной архитектуре запросов делает вас более квалифицированным специалистом, способным работать с высоконагруженными системами (HighLoad), где ресурсы всегда ограничены.