При разработке и поддержке конфигураций на платформе 1С:Предприятие 7.7 программисты часто сталкиваются со специфическим поведением универсального объекта коллекций — ТаблицаЗначений. Одной из самых распространенных ошибок среди начинающих разработчиков является сбой с текстом: «Поле агрегатного объекта не обнаружено (ИмяКолонки)».
В этой статье мы подробно разберем, почему возникает данная ошибка при попытке выгрузить данные (например, код счета дебета из операции Опер.Дебет.Счет.Код) в колонку таблицы значений, проанализируем внутренние механизмы работы платформы 1С 7.7 и рассмотрим все возможные способы решения этой проблемы.
Рассмотрим типичный фрагмент кода, который приводит к аварийному завершению программы:
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("СчетДебета", "Строка", 5);
// Попытка напрямую записать значение в колонку
ТЗ.СчетДебета = Опер.Дебет.Счет.Код;
// Ошибка: Поле агрегатного объекта не обнаружено (СчетДебета)
На первый взгляд код выглядит логично: создана таблица значений, в нее добавлена колонка СчетДебета с типом «Строка» и длиной 5 символов. Однако при попытке присвоить значение напрямую через точку платформа выдает ошибку. Выясним истинные причины такого поведения системы.
Основная и самая частая причина кроется в архитектуре работы с объектом ТаблицаЗначений в 1С 7.7. В отличие от более современных версий платформы (например, 1С 8.x), прямое обращение к колонке таблицы значений как к свойству объекта (ТЗ.ИмяКолонки = Значение) работает только тогда, когда в таблице значений есть активная (выбранная) строка.
Когда вы только создали таблицу значений с помощью СоздатьОбъект() и добавили колонки через метод НоваяКолонка(), в таблице физически еще нет ни одной строки. Соответственно, отсутствует понятие «текущая строка». Платформа не понимает, в какую именно ячейку строки вы хотите записать значение, и сообщает, что такое свойство (поле) у объекта ТЗ в данный момент не обнаружено.
Решение проблемы по шагам:
Перед тем как записывать данные напрямую в колонку, необходимо создать строку и сделать её активной. Для этого используется метод НоваяСтрока(). Давайте посмотрим на правильный вариант написания кода:
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("СчетДебета", "Строка", 5);
// Шаг 1: Создаем новую строку и автоматически позиционируемся на ней
ТЗ.НоваяСтрока();
// Шаг 2: Теперь прямое присвоение отработает без ошибок
ТЗ.СчетДебета = Опер.Дебет.Счет.Код;
Если вы работаете в цикле (например, обходя выборку проводок или операций), вызов метода НоваяСтрока() должен происходить на каждой итерации цикла перед заполнением полей строки:
ВыбратьОперации();
Пока ПолучитьОперацию() = 1 Цикл
ТЗ.НоваяСтрока();
ТЗ.СчетДебета = Опер.Дебет.Счет.Код;
КонецЦикла;
Еще одна неочевидная ловушка для новичков связана с предварительной очисткой таблицы значений. Часто перед повторным заполнением таблицы разработчики пишут:
ТЗ.Очистить();
В платформе 1С 7.7 метод Очистить() выполняет жесткое действие: он полностью уничтожает структуру таблицы значений, стирая не только все строки, но и все ранее созданные колонки. После этого вызова колонка СчетДебета физически перестает существовать в структуре объекта. При попытке выполнить код ТЗ.СчетДебета = ... вы гарантированно получите ошибку «Поле агрегатного объекта не обнаружено».
Как правильно очищать таблицу:
Если вам нужно сохранить структуру колонок, но при этом полностью очистить таблицу от накопленных данных (строк), используйте метод УдалитьСтроки(). Проанализируем правильный шаблон подготовки таблицы:
// Безопасная очистка строк с сохранением колонок "СчетДебета"
ТЗ.УдалитьСтроки();
// Добавление новой строки для записи
ТЗ.НоваяСтрока();
ТЗ.СчетДебета = Опер.Дебет.Счет.Код;
Прямое обращение через точку (ТЗ.СчетДебета = ...) очень чувствительно к текущему состоянию объекта. Если в коде между созданием строки и присвоением значения произойдет случайный вызов метода, сбрасывающего позиционирование, программа аварийно завершится.
Чтобы сделать код максимально надежным и независимым от «активной строки», мы рекомендуем использовать явные методы работы с ячейками таблицы значений — УстановитьЗначение() и ПолучитьЗначение(). Для их работы требуется знать только номер строки (индекс) и имя колонки.
Рассмотрим пример безопасного заполнения таблицы по шагам:
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("СчетДебета", "Строка", 5);
// Создаем строку и получаем её номер в переменную
НомСтроки = ТЗ.НоваяСтрока();
// Записываем значение в конкретную строку и колонку без явного позиционирования
ТЗ.УстановитьЗначение(НомСтроки, "СчетДебета", Опер.Дебет.Счет.Код);
Этот метод гарантирует стабильность работы программы, даже если параллельно выполняются другие процедуры обработки этой же таблицы значений.
Для успешной отладки программного кода в среде 1С 7.7 крайне важно различать две похожие по звучанию ошибки:
ТЗ) действительно существует и инициализирован как ТаблицаЗначений, но у него сейчас нет доступного свойства или колонки с таким именем. Причина: нет активной строки или колонка была удалена (например, через метод Очистить()).ТЗ) не является объектом. Такое происходит, если вы забыли написать ТЗ = СоздатьОбъект("ТаблицаЗначений");, или случайно перезаписали переменную простым числом или строкой в ходе выполнения программы.Если бы проблема была на стороне правой части выражения (например, не выбран счет дебета в операции), платформа 1С 7.7 выдала бы ошибку «Значение не представляет агрегатный объект (Код)», так как у пустого значения (ПолучитьПустоеЗначение()) невозможно запросить свойство Код. Тот факт, что в тексте ошибки фигурирует именно СчетДебета, однозначно указывает на проблему позиционирования в левой части выражения (внутри ТЗ).
Чтобы ваши обработки и отчеты в 1С 7.7 работали быстро и без сбоев, придерживайтесь следующих правил:
НоваяСтрока() непосредственно перед заполнением полей новой строки.УдалитьСтроки() вместо Очистить().УстановитьЗначение() и ПолучитьЗначение() с явным указанием номера строки.