Как правильно выгрузить результат запроса в таблицу значений в 1С 7.7 и обойти её?

Программист 1С v7.7
← На главную

Работа с запросами в 1С:Предприятии 7.7 часто вызывает вопросы у начинающих разработчиков, особенно в части переноса данных в ТаблицаЗначений. Ошибка Поле агрегатного объекта не обнаружено является классической проблемой при попытке обращения к полям, которые не были правильно инициализированы в структуре таблицы.

Разбираем причину ошибки обращения к полю

Основная причина возникновения ошибки — отсутствие данных в таблице значений или некорректная выгрузка из объекта Запрос. Когда мы выполняем запрос, мы должны явно указать группировку, иначе платформа не сформирует необходимые колонки в объекте ТаблицаЗначений.

Рассмотрим правильную структуру запроса. Чтобы получить список элементов справочника без итогов, необходимо использовать конструкцию Группировка:


ТекстЗапроса = 
"|ТекущийУчасток = Справочник.Участки.ТекущийЭлемент;
|ДатаРег = Справочник.Участки.ДатаРег;
|Группировка ТекущийУчасток Без Групп;";
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
КонецЕсли;

Как правильно выгрузить запрос в Таблицу Значений

Метод Выгрузить требует правильного использования параметров. Первый параметр — сама таблица, второй — флаг очистки (обычно 1), третий — флаг использования итогов. Если вы не укажете параметры, структура колонок может не создаться корректно.

Используйте следующий подход для получения данных:


Уч = СоздатьОбъект("ТаблицаЗначений");
// Выгружаем с параметром 1 для корректного формирования колонок
Запрос.Выгрузить(Уч, 1);

Если после выгрузки вы видите, что таблица пуста, обязательно воспользуйтесь отладочным методом Уч.ВыбратьСтроку(). Это позволит «глазками» увидеть, какие колонки реально существуют в таблице и есть ли в ней данные.

Организация цикла обхода таблицы

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


Уч.ВыбратьСтроки();
Пока Уч.ПолучитьСтроку() = 1 Цикл
    // Обращаемся к колонке напрямую
    ДатаРег = Формат(Уч.ДатаРег, "ДДДММГГГГ");
    Сообщить(ДатаРег);
    
    // Если нужен номер строки, используем встроенный атрибут
    Счетчик = Уч.НомерСтроки;
КонецЦикла;

Сортировка данных в таблице значений

Часто возникает задача отсортировать результат запроса, например, по коду элемента. Важно помнить, что в 1С 7.7 поле Код является строковым. При сортировке платформа будет использовать строковые правила (лексикографические), поэтому «10» будет стоять перед «2».

Чтобы отсортировать таблицу, используйте метод Сортировать:


// Сортировка по возрастанию
Уч.Сортировать("Код+");

Если автоматическая сортировка не дает нужного результата из-за специфики строковых кодов, вы всегда можете пройтись циклом по таблице, привести значения к нужному формату (например, дополнить нулями слева через функцию Прав() или Формат()) и повторить операцию сортировки.

Советы по отладке

  1. Всегда проверяйте результат запроса через Запрос.Выполнить(). Если функция вернула 0, значит в тексте запроса есть синтаксическая ошибка.
  2. Используйте Попытка...Исключение при обращении к строкам по индексу, чтобы программа не вылетала с критической ошибкой, если счетчик вышел за пределы количества строк.
  3. Для визуального контроля всегда держите под рукой ВыбратьСтроку() — это лучший друг разработчика при работе с любыми табличными данными в 7.7.

Следуя этим правилам, вы избавитесь от ошибок доступа к объектам и сможете гибко управлять выборками данных в ваших обработках и отчетах.

← На главную