Работа с платформой 1С версии 7.7 требует глубокого понимания механизмов формирования запросов и вывода данных в печатные формы (таблицы). Часто начинающие разработчики или те, кто редко сталкивается с "семеркой", допускают типичные ошибки при получении остатков и иерархическом представлении данных. В этой статье мы подробно рассмотрим, как правильно построить запрос к регистру остатков, как оптимизировать обращение к атрибутам справочников и как эффективно вывести результат в таблицу.
Представим ситуацию: нам необходимо вывести остатки товаров с указанием их кода, артикула и иерархической цепочки родителей (папок). Рассмотрим основные моменты, на которые стоит обратить внимание при написании программного кода.
Первая распространенная ошибка — неправильное именование переменных внутри текста запроса. Использование зарезервированных или стандартных названий, таких как Наименование, может привести к путанице. В 1С 7.7 Наименование — это строковый реквизит. Если вы назначите это имя переменной, которая ссылается на весь объект (справочник "Товары"), это создаст когнитивный диссонанс при чтении кода. Рекомендуется называть такие переменные согласно их сути, например, Товар или Номенклатура.
При получении остатков из регистров в 1С 7.7 крайне важно правильно указать период. Проанализируем два основных варианта:
|с (ТекущаяДата()) по (ТекущаяДата());, система будет вычислять остатки на конец указанного дня. Если итоги на этот момент не рассчитаны, системе придется брать итоги на начало месяца и прибавлять к ним все движения за прошедшее время, что может существенно замедлить формирование отчета.Посмотрим на пример правильного оформления периода и получения функции остатка в запросе:
ТекстЗапроса =
"//{{ЗАПРОС(ОстаткиСклад)
|Период по ДатаОтчета;
|Товар = Регистр.ОстаткиТоваров.Товар;
|Остаток = Регистр.ОстаткиТоваров.ОстатокТовара;
|Функция ОстатокКонОст = КонОст(Остаток);
|Группировка Товар без групп;
|"//}}ЗАПРОС
;
Многие разработчики совершают лишние действия, вызывая метод ТекущийЭлемент() или заново обращаясь к справочнику вне запроса. Рассмотрим, как делать правильно. Если в тексте запроса мы определили переменную Товар = Регистр.ОстаткиТоваров.Товар;, то внутри цикла обхода Запрос.Группировка() мы уже имеем ссылку на объект.
Чтобы получить Код или Артикул, не обязательно делать дополнительные выборки. Это можно сделать двумя способами:
|Код = Регистр.ОстаткиТоваров.Товар.Код; и |Арт = Регистр.ОстаткиТоваров.Товар.Артикул; в текст запроса. Это позволит обращаться к ним как Запрос.Код и Запрос.Арт максимально быстро.Запрос.Товар.Код. Это допустимо, но чуть менее производительно, чем первый вариант, так как вызывает дополнительное обращение к базе данных при каждом проходе цикла.В исходном коде часто встречается попытка найти родителей товара через цикл Пока род.Родитель.Выбран()=1. Это рабочий метод, но он заставляет систему выполнять множество мелких запросов к базе. Рассмотрим более элегантное решение — использование встроенной группировки "По Иерархии".
Если в запросе указать Группировка Товар По Иерархии;, то при обходе результата методом Запрос.Группировка(1) система сама сначала выдаст родительскую папку, а затем её содержимое. Проанализируем ситуацию:
Пока Запрос.Группировка(1) = 1 Цикл
Если Запрос.Товар.ЭтоГруппа() = 1 Тогда
// Выводим секцию папки
Таб.ВывестиСекцию("Строка|Папка");
Иначе
// Выводим секцию товара
Наименование = Запрос.Товар.Наименование;
Код = Запрос.Товар.Код;
Остаток = Запрос.ОстатокКонОст;
Таб.ВывестиСекцию("Строка|Товар");
КонецЕсли;
КонецЦикла;
Для вывода данных в 1С 7.7 используется объект Таблица. Разберем основные методы, которые нам понадобятся:
ВывестиСекцию() — добавляет секцию вниз, создавая новую строку (или строки).ПрисоединитьСекцию() — добавляет секцию справа от последней выведенной, не создавая новой строки. Это полезно для построения динамических колонок.Опции() — позволяет зафиксировать шапку отчета. Например, Таб.Опции(0,0,Таб.ВысотаТаблицы(),0); зафиксирует все выведенные на данный момент строки в качестве заголовка, который будет виден при прокрутке.Важный совет: При отладке больших отчетов действительно удобно использовать ограничение количества итераций (например, счетчик до 40 строк), так как в 7.7 нет встроенного оператора TOP или LIMIT в языке запросов (за исключением прямых SQL-запросов через внешние компоненты).
Проанализируем шаги, которые приведут к созданию качественного отчета:
<Запрос.Товар.Наименование>).КонОст). Используем понятные имена переменных.Пока Запрос.Группировка() = 1. Внутри цикла заполняем переменные, которые используются в макете, и вызываем Таб.ВывестиСекцию().Таб.Показать() для вывода результата пользователю.Помните, что 1С 7.7 чувствительна к количеству обращений к базе данных. Старайтесь вытаскивать максимум информации в одном запросе, избегайте лишних вызовов ТекущийЭлемент() и всегда проверяйте, возвращает ли запрос результат (Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли;). Это обеспечит быструю и стабильную работу ваших обработок.