В процессе разработки на платформе 1С 7.7 мы часто сталкиваемся с задачами, когда необходимо получить выборку данных, основываясь не на самих измерениях или ресурсах регистра, а на результате их математической обработки — например, разности между Планом и Фактом. Рассмотрим, почему штатный механизм «черных» запросов не всегда позволяет это сделать «красиво» и какие инструменты помогут нам справиться с этой задачей.
Многие разработчики, привыкшие к SQL, пытаются использовать привычную логику WHERE -> GROUP BY -> HAVING внутри 1С. Однако важно понимать: штатный «черный» запрос 1С 7.7 работает иначе. При выполнении запроса платформа сначала выбирает записи, удовлетворяющие условиям, и лишь затем выполняет группировку и вычисление функций. Если вы попытаетесь отфильтровать результат по вычисляемой функции (например, Сумма(План - Факт) > 0) внутри условия запроса, вы столкнетесь с тем, что условие применяется к каждой строке до агрегации, что ведет к искажению данных и неверным итогам.
Если объемы данных позволяют, самым гибким решением будет использование компоненты 1С++ и её объекта ИндексированнаяТаблица. Это позволяет сначала выгрузить «сырую» выборку, а затем выполнить любую фильтрацию, сортировку и свертку в оперативной памяти.
Разберем алгоритм работы с ИТЗ:
ИТЗ методом ЗагрузитьЗапрос.ИТЗ для группировки или удаления ненужных строк.
// Пример создания и обработки данных в ИТЗ
ИТЗ = СоздатьОбъект("ИндексированнаяТаблица");
ИТЗ.ЗагрузитьЗапрос(Запрос, 1, 0);
// Выполняем группировку или отбор
ИТЗ.ВыбратьСтроки();
// Здесь мы можем программно отсечь строки, где План - Факт <= 0
Важное замечание: при использовании ИТЗ помните, что колонки могут терять строгую типизацию. Если вы используете универсальные процедуры для печати таблиц, они могут перестать корректно определять тип данных, что потребует написания дополнительных оберток или явного приведения типов при отладке.
Если производительность штатного механизма становится «бутылочным горлышком» или логика запроса становится слишком запутанной из-за многочисленных костылей, лучшим выходом будет использование прямых запросов к базе данных.
Использование SQL позволяет нам полноценно использовать оператор HAVING. В этом случае сервер базы данных сам выполнит все необходимые вычисления и вернет нам уже готовую, отфильтрованную выборку. Это экономит ресурсы клиента и значительно повышает скорость работы системы на больших объемах данных.
Если использование внешних компонент типа 1С++ невозможно, мы можем применить метод двухэтапной обработки:
ТаблицаЗначений.ОбходСтрок или свертку (Свернуть) для очистки таблицы от лишних данных.Несмотря на то, что это решение кажется менее производительным, оно является наиболее «родным» для платформы 1С 7.7 и позволяет избежать ошибок типизации. Для повышения удобства отладки мы рекомендуем выносить логику группировки в отдельные процедуры-обертки.
Чтобы работа с данными была эффективной, придерживайтесь следующих правил:
ИТЗ или ТЗ. Если используете МоментДокумента, учитывайте, что для хронологии сортировки недостаточно просто сортировки по дате.ИТЗ, чтобы видеть содержимое таблицы в процессе разработки, так как стандартные методы 1С могут не понимать структуры данных 1С++.Помните, что «клюшечная» разработка — это искусство баланса между возможностями платформы и эффективностью используемых инструментов. Выбор между ИТЗ и прямыми запросами всегда зависит от конкретной задачи и объемов данных, с которыми работает ваше предприятие.