Таблица значений в 1С 8.3: как увидеть её содержимое в отладчике, сообщениях и на форме

· 10 мин

Содержание

Самый быстрый способ просмотреть таблицу значений в 1С — поставить точку останова (F9) на строке после её заполнения, запустить отладку и открыть окно «Вычислить выражение» (Shift+F9). Там видно число строк, колонки и значения каждой ячейки. Если отладчик недоступен, таблицу выводят в сообщения, в табличный документ или на форму.

Выбор способа зависит от того, где живёт таблица. Таблица значений существует только на сервере и в толстом клиенте: в тонком и веб-клиенте её нет, поэтому в управляемом приложении показывать её приходится через реквизит формы или табличный документ. Ниже — код для каждого варианта, который можно скопировать и вставить в модуль.

Подготовка: где создаётся таблица и что нужно для отладки

Прежде чем выбирать способ, ответьте на два вопроса.

  • 🖥️ В каком контексте выполняется код. Процедура с директивой &НаСервере, общий модуль с флагом «Сервер», модуль объекта — это сервер. &НаКлиенте в управляемой форме — тонкий клиент, таблицы значений там не будет.
  • 🗄️ Какая база. В файловой базе отладка работает сразу. В клиент-серверной серверный код останавливается на точках, только если сервер 1С запущен с разрешённой отладкой (ключ -debug у агента сервера ragent).

Перезапуск службы сервера 1С с ключом -debug обрывает все сеансы пользователей. Делайте это на тестовом сервере или вне рабочего времени, а в рабочей базе отладку лучше не включать вовсе.

Для отладки в Конфигураторе нужен запуск через меню Отладка → Начать отладку → 1С:Предприятие (или Тонкий клиент, в зависимости от версии). Если 1С:Предприятие уже открыто, его можно подключить к отладке через Отладка → Подключение.

Способ 1. Отладчик: самый наглядный просмотр

Отладчик показывает таблицу целиком, ничего не меняя в коде. Порядок такой:

  1. Откройте модуль и найдите строку, после которой таблица уже заполнена. Обычно это строка сразу после Запрос.Выполнить().Выгрузить() или после цикла с Добавить().
  2. Поставьте на неё точку останова — F9 или двойной щелчок по левому полю.
  3. Запустите отладку и выполните действие, которое вызывает этот код: нажмите кнопку, проведите документ, сформируйте отчёт.
  4. Когда выполнение остановится, выделите имя переменной и нажмите Shift+F9.
  5. В окне «Вычислить выражение» раскройте переменную. Для таблицы значений отладчик показывает свойство Колонки и строки по индексам.

Чтобы видеть таблицу сразу в виде сетки, а не дерева узлов, в окне вычисления выражения есть кнопка показа значения в отдельном окне. Там строки и колонки выводятся как обычная таблица, её удобно пролистывать.

Выражения, которые экономят время

В поле выражения можно писать не только имя переменной, но и вызовы методов. Полезный набор:

ВыражениеЧто покажет
ТЗ.Количество()Число строк
ТЗ.Колонки.Количество()Число колонок
ТЗ[0]Первую строку со всеми полями
ТЗ.ВыгрузитьКолонку("Сумма")Массив значений одной колонки
ТЗ.Итог("Сумма")Сумму по числовой колонке
ТЗ.Найти("ООО Ромашка", "Контрагент")Первую строку с таким значением или Неопределено
ТЗ.НайтиСтроки(Новый Структура("Склад", Склад))Массив подходящих строк

Индексы строк начинаются с нуля: в таблице из 15 строк последняя — ТЗ[14].

💡 Если нужно следить за таблицей на нескольких шагах, добавьте её в табло: Отладка → Табло, затем перетащите туда имя переменной. Значение будет обновляться при каждой остановке.

Как посмотреть временные таблицы запроса

Временные таблицы хранятся в менеджере временных таблиц, а не в переменной. В современных версиях платформы их можно достать прямо в окне «Вычислить выражение»:

МенеджерВТ.Таблицы["ВТ_Остатки"].ПолучитьДанные().Выгрузить()

Результат — обычная таблица значений, которую можно раскрыть. Имя ВТ_Остатки замените на то, что стоит после ПОМЕСТИТЬ в тексте запроса.

Способ 2. Вывод в сообщения через Сообщить

Когда отладчик подключить нельзя (рабочий сервер, чужая база, фоновое задание без отладки), таблицу выводят в окно сообщений. Код работает на сервере, а сообщения платформа сама передаёт на клиент после серверного вызова.

&НаСервере
Процедура ПоказатьТаблицуВСообщениях(ТЗ)

    Сообщить("Строк: " + Формат(ТЗ.Количество(), "ЧН=0; ЧГ=0"));

    Для Каждого СтрокаТЗ Из ТЗ Цикл
        Части = Новый Массив;
        Для Каждого Колонка Из ТЗ.Колонки Цикл
            Части.Добавить(Колонка.Имя + " = " + Строка(СтрокаТЗ[Колонка.Имя]));
        КонецЦикла;
        Сообщить(СтрСоединить(Части, "; "));
    КонецЦикла;

КонецПроцедуры

Переменную цикла назовите СтрокаТЗ, а не Строка: иначе она перекроет встроенную функцию Строка(), и преобразование значения в текст перестанет работать.

Ограничения способа:

  • 📜 На таблице в несколько тысяч строк окно сообщений становится нечитаемым. Выводите первые 50–100 строк или только отфильтрованные.
  • 🔤 Ссылки выводятся представлением («Поступление товаров 00000012 от …»), даты — в формате сеанса. Для точного сравнения добавьте XMLСтрока() к нужной колонке.
  • 🕒 В фоновом задании сообщения не появятся у пользователя автоматически. Их забирают из задания программно или пишут в журнал регистрации через ЗаписьЖурналаРегистрации().

💡 В конфигурациях на БСП вместо Сообщить обычно используют ОбщегоНазначения.СообщитьПользователю(). Для разовой диагностики подходят оба варианта.

Способ 3. Табличный документ: таблица как отчёт

Табличный документ можно передать на клиент и открыть отдельным окном. Это лучший вариант для больших таблиц: есть прокрутка, поиск, сохранение в Excel.

Короткий путь — построитель отчёта. Он сам выводит все колонки с заголовками:

&НаСервере
Функция ТаблицаВТабличныйДокумент(ТЗ)

    Построитель = Новый ПостроительОтчета;
    Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТЗ);

    ТабДок = Новый ТабличныйДокумент;
    Построитель.Вывести(ТабДок);

    Возврат ТабДок;

КонецФункции

&НаКлиенте
Процедура ПоказатьТаблицу(Команда)
    ТабДок = ПолучитьТабличныйДокументНаСервере();
    ТабДок.Показать("Просмотр таблицы значений");
КонецПроцедуры

Функция ПолучитьТабличныйДокументНаСервере() здесь — ваша серверная процедура, которая получает таблицу и вызывает ТаблицаВТабличныйДокумент(). Саму таблицу значений на клиент не передают: туда уходит только готовый табличный документ.

Если нужен полный контроль над форматом, заполняйте ячейки вручную:

ТабДок = Новый ТабличныйДокумент;
НомерКолонки = 0;
Для Каждого Колонка Из ТЗ.Колонки Цикл
    НомерКолонки = НомерКолонки + 1;
    ТабДок.Область(1, НомерКолонки, 1, НомерКолонки).Текст = Колонка.Имя;
КонецЦикла;

НомерСтроки = 1;
Для Каждого СтрокаТЗ Из ТЗ Цикл
    НомерСтроки = НомерСтроки + 1;
    НомерКолонки = 0;
    Для Каждого Колонка Из ТЗ.Колонки Цикл
        НомерКолонки = НомерКолонки + 1;
        ТабДок.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки).Текст = Строка(СтрокаТЗ[Колонка.Имя]);
    КонецЦикла;
КонецЦикла;

Первая строка документа — заголовки колонок, данные начинаются со второй. Для таблицы из 3 колонок и 10 строк получится сетка 3 × 11 ячеек.

Способ 4. Консоль запросов и временные таблицы

Консоль запросов — внешняя обработка, которая выполняет произвольный запрос и показывает результат в табличном виде. Её удобно использовать, когда таблица значений — это результат запроса: скопируйте текст запроса из модуля, подставьте параметры и выполните его в консоли. Увидите то же, что получил бы код.

Чтобы посмотреть промежуточные шаги пакетного запроса, в консоли выводят каждую временную таблицу отдельно. Временно добавьте в конец пакета запрос:

ВЫБРАТЬ
    *
ИЗ
    ВТ_Остатки КАК ВТ_Остатки

Обратная задача — передать готовую таблицу значений в запрос и работать с ней как с временной таблицей:

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст =
"ВЫБРАТЬ
|    Т.Номенклатура,
|    Т.Количество
|ПОМЕСТИТЬ ВТ_Данные
|ИЗ
|    &ТЗ КАК Т";
Запрос.УстановитьПараметр("ТЗ", ТЗ);
Запрос.Выполнить();

У колонок таблицы должны быть заданы типы. Колонка, созданная через ТЗ.Колонки.Добавить("Количество") без описания типов, в запрос не пройдёт. Правильно — ТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число")).

💡 Таблицу из рабочего кода можно переложить в консоль через файл: на сервере выполните ЗначениеВФайл("C:\Temp\tz.txt", ТЗ), а потом прочитайте её ЗначениеИзФайла() в своей обработке. Путь указывается на машине, где выполняется код, — в клиент-серверной базе это сервер 1С.

Способ 5. Показ таблицы значений на управляемой форме

Если таблицу нужно показывать пользователю постоянно, заведите на форме реквизит типа ТаблицаЗначений. Колонки задаются в редакторе формы, а заполнение делается одной строкой на сервере:

&НаСервере
Процедура ЗаполнитьНаСервере()
    ТЗ = ПолучитьДанные(); // ваша функция, возвращающая таблицу значений
    ЗначениеВРеквизитФормы(ТЗ, "ТаблицаПросмотра");
КонецПроцедуры

Имена колонок реквизита должны совпадать с именами колонок таблицы. Лишние колонки таблицы просто не загрузятся, пустые колонки реквизита останутся пустыми.

Когда колонки заранее неизвестны

Для универсального просмотра реквизит и колонки создают программно:

&НаСервере
Процедура ПоказатьПроизвольнуюТаблицу(ТЗ)

    Новые = Новый Массив;
    Новые.Добавить(Новый РеквизитФормы("ТаблицаПросмотра", Новый ОписаниеТипов("ТаблицаЗначений")));
    Для Каждого Колонка Из ТЗ.Колонки Цикл
        Новые.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "ТаблицаПросмотра", Колонка.Заголовок));
    КонецЦикла;
    ИзменитьРеквизиты(Новые);

    ЭлементТаблица = Элементы.Добавить("ТаблицаПросмотра", Тип("ТаблицаФормы"));
    ЭлементТаблица.ПутьКДанным = "ТаблицаПросмотра";
    Для Каждого Колонка Из ТЗ.Колонки Цикл
        Поле = Элементы.Добавить("ТаблицаПросмотра" + Колонка.Имя, Тип("ПолеФормы"), ЭлементТаблица);
        Поле.Вид = ВидПоляФормы.ПолеВвода;
        Поле.ПутьКДанным = "ТаблицаПросмотра." + Колонка.Имя;
    КонецЦикла;

    ЗначениеВРеквизитФормы(ТЗ, "ТаблицаПросмотра");

КонецПроцедуры

Процедуру вызывают один раз за жизнь формы. Повторный вызов попытается создать реквизит с тем же именем и упадёт с ошибкой. Для перезаполнения удалите старый реквизит вторым параметром ИзменитьРеквизиты() и старые элементы через Элементы.Удалить(), либо просто откройте форму заново.

Способ 6. Внешняя обработка для просмотра любой таблицы

Код из способа 5 удобно один раз оформить во внешнюю обработку и вызывать из любого места. Таблицу передают не напрямую, а через временное хранилище — так она не попадает на клиент:

&НаСервере
Функция АдресТаблицы()
    ТЗ = ПолучитьДанные();
    Возврат ПоместитьВоВременноеХранилище(ТЗ, УникальныйИдентификатор);
КонецФункции

&НаКлиенте
Процедура ОткрытьПросмотр(Команда)
    ПараметрыФормы = Новый Структура("АдресТаблицы", АдресТаблицы());
    ОткрытьФорму("ВнешняяОбработка.ПросмотрТЗ.Форма.Форма", ПараметрыФормы);
КонецПроцедуры

В форме обработки, в обработчике ПриСозданииНаСервере, таблицу получают через ПолучитьИзВременногоХранилища(Параметры.АдресТаблицы) и передают в ПоказатьПроизвольнуюТаблицу(). Чтобы форма открылась по имени ВнешняяОбработка.ПросмотрТЗ, обработку сначала подключают к сеансу (например, через ВнешниеОбработки.Подключить() с адресом файла во временном хранилище). В конфигурациях на БСП проще зарегистрировать её в справочнике дополнительных отчётов и обработок.

Подключение внешних обработок в рабочей базе ограничено правами и настройками безопасности. Отлаживайте такую обработку в копии базы.

Особенности управляемого приложения и сравнение способов

В управляемом приложении действует одно правило: таблица значений — серверный объект. Отсюда типичные ситуации.

  • ❌ Новый ТаблицаЗначений в процедуре &НаКлиенте даёт ошибку Тип не определен (ТаблицаЗначений).
  • 🔁 Реквизит формы типа ТаблицаЗначений на клиенте виден как ДанныеФормыКоллекция. Строки у него есть, но методов Итог(), Свернуть(), ВыгрузитьКолонку() нет.
  • 🔄 Чтобы получить полноценную таблицу из реквизита, на сервере вызывают РеквизитФормыВЗначение("ТаблицаПросмотра"), а после изменений — обратно ЗначениеВРеквизитФормы().
  • 🧭 В отладчике клиентский код покажет ДанныеФормыКоллекция. Чтобы увидеть исходную таблицу значений, ставьте точку останова в серверной процедуре.

В толстом клиенте обычного приложения таблица значений есть и на клиенте. Там работает классический приём ТЗ.ВыбратьСтроку("Просмотр"): он открывает окно со всеми строками. В тонком клиенте этого метода нет.

СпособКогда подходитОграничения
ОтладчикРазработка и тестовая базаНужна отладка на сервере; в рабочей базе неуместен
СообщитьБыстрая проверка без отладчикаНеудобно больше 100 строк
Табличный документБольшие таблицы, выгрузка в ExcelНужно дописать код вызова
Консоль запросовТаблица — результат запросаВидит только данные запроса, а не изменения в коде
Реквизит формыПостоянный показ пользователюКолонки задаются заранее
Внешняя обработкаУниверсальный просмотр любой таблицыПодключение требует прав
Где выполняется код, таблицу из которого нужно увидеть?

Частые ошибки при просмотре таблиц значений

  • 🛑 Точка останова не срабатывает в серверном коде. В клиент-серверной базе не включена отладка на сервере. Проверьте ключ -debug у службы сервера 1С и то, что Конфигуратор подключён к нужному кластеру.
  • 🔢 Пустые колонки в запросе. При передаче таблицы в запрос без типов колонок платформа выдаёт ошибку вида Тип не может быть выбран в запросе. Задайте ОписаниеТипов при создании колонок.
  • 🧩 Колонки реквизита формы не заполнились. Имена колонок в редакторе формы отличаются от имён в таблице на один символ или регистр раскладки (латинская «С» вместо кириллической).
  • 🐢 Форма открывается медленно. На форму отправлены десятки тысяч строк. Ограничьте выборку в запросе (ВЫБРАТЬ ПЕРВЫЕ 1000) или показывайте табличный документ.
  • 🧹 Отладочный код остался в продакшене. Временный Сообщить в цикле проведения засыпает пользователей сообщениями и замедляет проведение. Помечайте такие строки комментарием и удаляйте перед поставкой.
Можно ли посмотреть таблицу значений без Конфигуратора?
Только если код сам её выводит: через сообщения, табличный документ или форму. Из режима 1С:Предприятие заглянуть в переменные чужого кода нельзя.
Как сохранить таблицу значений в Excel?
Выведите её в табличный документ, откройте его и сохраните в формате xlsx через команду сохранения в меню окна. Программно — методом ТабДок.Записать(Путь, ТипФайлаТабличногоДокумента.XLSX).
Чем таблица значений отличается от табличной части в отладчике?
Табличная часть объекта показывается как коллекция строк с реквизитами, у неё есть номер строки НомерСтроки. Таблицу значений можно получить из неё методом Выгрузить() и смотреть уже как обычную таблицу.
Почему в отладчике видно не все строки?
При раскрытии больших коллекций отладчик показывает строки порциями. Для точечной проверки используйте выражения ТЗ.Количество(), ТЗ[Индекс] или ТЗ.НайтиСтроки().
Как посмотреть дерево значений?
Так же, как таблицу, но строки вложены: в отладчике раскрывайте Строки у каждого уровня. Для вывода в сообщения нужен рекурсивный обход по Строки.