Таблица значений в 1С 8.3: как увидеть её содержимое в отладчике, сообщениях и на форме
Содержание
Самый быстрый способ просмотреть таблицу значений в 1С — поставить точку останова (F9) на строке после её заполнения, запустить отладку и открыть окно «Вычислить выражение» (Shift+F9). Там видно число строк, колонки и значения каждой ячейки. Если отладчик недоступен, таблицу выводят в сообщения, в табличный документ или на форму.
Выбор способа зависит от того, где живёт таблица. Таблица значений существует только на сервере и в толстом клиенте: в тонком и веб-клиенте её нет, поэтому в управляемом приложении показывать её приходится через реквизит формы или табличный документ. Ниже — код для каждого варианта, который можно скопировать и вставить в модуль.
Подготовка: где создаётся таблица и что нужно для отладки
Прежде чем выбирать способ, ответьте на два вопроса.
- 🖥️ В каком контексте выполняется код. Процедура с директивой
&НаСервере, общий модуль с флагом «Сервер», модуль объекта — это сервер.&НаКлиентев управляемой форме — тонкий клиент, таблицы значений там не будет. - 🗄️ Какая база. В файловой базе отладка работает сразу. В клиент-серверной серверный код останавливается на точках, только если сервер 1С запущен с разрешённой отладкой (ключ
-debugу агента сервераragent).
Перезапуск службы сервера 1С с ключом -debug обрывает все сеансы пользователей. Делайте это на тестовом сервере или вне рабочего времени, а в рабочей базе отладку лучше не включать вовсе.
Для отладки в Конфигураторе нужен запуск через меню Отладка → Начать отладку → 1С:Предприятие (или Тонкий клиент, в зависимости от версии). Если 1С:Предприятие уже открыто, его можно подключить к отладке через Отладка → Подключение.
Способ 1. Отладчик: самый наглядный просмотр
Отладчик показывает таблицу целиком, ничего не меняя в коде. Порядок такой:
- Откройте модуль и найдите строку, после которой таблица уже заполнена. Обычно это строка сразу после
Запрос.Выполнить().Выгрузить()или после цикла сДобавить(). - Поставьте на неё точку останова —
F9или двойной щелчок по левому полю. - Запустите отладку и выполните действие, которое вызывает этот код: нажмите кнопку, проведите документ, сформируйте отчёт.
- Когда выполнение остановится, выделите имя переменной и нажмите
Shift+F9. - В окне «Вычислить выражение» раскройте переменную. Для таблицы значений отладчик показывает свойство
Колонкии строки по индексам.
Чтобы видеть таблицу сразу в виде сетки, а не дерева узлов, в окне вычисления выражения есть кнопка показа значения в отдельном окне. Там строки и колонки выводятся как обычная таблица, её удобно пролистывать.
Выражения, которые экономят время
В поле выражения можно писать не только имя переменной, но и вызовы методов. Полезный набор:
| Выражение | Что покажет |
|---|---|
ТЗ.Количество() | Число строк |
ТЗ.Колонки.Количество() | Число колонок |
ТЗ[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) или показывайте табличный документ. - 🧹 Отладочный код остался в продакшене. Временный
Сообщитьв цикле проведения засыпает пользователей сообщениями и замедляет проведение. Помечайте такие строки комментарием и удаляйте перед поставкой.
Можно ли посмотреть таблицу значений без Конфигуратора?
Как сохранить таблицу значений в Excel?
ТабДок.Записать(Путь, ТипФайлаТабличногоДокумента.XLSX).Чем таблица значений отличается от табличной части в отладчике?
НомерСтроки. Таблицу значений можно получить из неё методом Выгрузить() и смотреть уже как обычную таблицу.Почему в отладчике видно не все строки?
ТЗ.Количество(), ТЗ[Индекс] или ТЗ.НайтиСтроки().Как посмотреть дерево значений?
Строки у каждого уровня. Для вывода в сообщения нужен рекурсивный обход по Строки.