Вывод текста в 1С 8.3 для проверки и отладки кода

· 9 мин

Содержание

Чтобы вывести строку в 1С, проще всего написать Сообщить("Текст"); — строка появится в окне сообщений внизу формы. Это работает и на клиенте, и на сервере. Если код менять нельзя, ставьте точку останова и смотрите значение в отладчике. Если код идёт без пользователя (регламентное задание), пишите строку в журнал регистрации.

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

Процедура Сообщить(): самый быстрый вывод строки

Сообщить() — глобальная процедура платформы. Первый параметр — текст, второй (статус сообщения) в интерфейсе «Такси» на вид окна почти не влияет, его можно не указывать.

Сообщить("Начали обработку");
Сообщить("Сумма документа: " + Формат(Сумма, "ЧДЦ=2; ЧГ=0"));
Сообщить(Контрагент); // выведется представление ссылки, то есть наименование

Что важно знать о поведении процедуры:

  • 📌 Сообщить принимает не только строку. Число, дату и ссылку платформа сама приведёт к строке через представление.
  • 📌 Для коллекций выводится только имя типа. Сообщить(Структура) покажет слово «Структура», а не содержимое.
  • 📌 Сообщения копятся в окне сообщений активной формы. Если форма закрыта, текст уходит в окно основного окна приложения.
  • 📌 Вызов в цикле на 10 000 строк заметно тормозит интерфейс. Выводите каждую сотую итерацию или итог.

Чтобы вывести содержимое таблицы значений, пройдите её циклом:

Для Каждого Стр Из ТаблицаТоваров Цикл
    Сообщить(СтрШаблон("%1 | %2 шт. | %3 руб.",
        Стр.Номенклатура, Стр.Количество, Формат(Стр.Сумма, "ЧДЦ=2; ЧГ=0")));
КонецЦикла;

Отладочные Сообщить легко забыть в коде. Помечайте их одинаковым комментарием, например // ОТЛАДКА, и перед сдачей ищите его через Правка → Найти по всей конфигурации (Ctrl+Shift+F).

СообщениеПользователю: строка с привязкой к полю формы

Когда текст адресован пользователю, а не разработчику, лучше объект СообщениеПользователю. Он умеет подсвечивать поле, к которому относится ошибка. Пользователь кликает по сообщению — и курсор встаёт в нужную ячейку.

Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не заполнен склад";
Сообщение.Поле = "Объект.Склад";
Сообщение.Сообщить();

Для табличной части в Поле указывают путь к ячейке строки, например "Объект.Товары[0].Количество". Индекс строк начинается с нуля: первая строка — [0], пятая — [4].

В серверном модуле объекта, где формы нет, сообщение привязывают к данным:

Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Дата документа раньше даты запрета";
Сообщение.Поле = "Дата";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();

В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) то же самое делает одна строка: ОбщегоНазначения.СообщитьПользователю(Текст, , Поле, ПутьКДанным, Отказ) на сервере и ОбщегоНазначенияКлиент.СообщитьПользователю(...) на клиенте. Если в типовой правите код — пользуйтесь этой функцией, так принято в БСП.

Другие способы показать строку на экране

Иногда окно сообщений не подходит: строку надо показать крупно, во всплывающем окне или целым текстом на несколько экранов. Все методы ниже работают только на клиенте.

МетодЧто видит пользовательКогда брать
ПоказатьПредупреждение()Окно с кнопкой «ОК»Нужно, чтобы текст точно прочитали
ПоказатьОповещениеПользователя()Всплывающее уведомление в углуКороткий итог: «Загружено 120 строк»
Состояние()Текст в строке состоянияХод долгой операции
ТекстовыйДокумент.Показать()Отдельное окно с текстомДлинный лог, XML, JSON, текст запроса

Пример с немодальным предупреждением:

ПоказатьПредупреждение(, "Выгрузка завершена", 10, "Готово");

Первый параметр — описание оповещения о закрытии, его можно пропустить. Третий — таймаут в секундах.

Старое Предупреждение("Текст") модальное. Если в свойствах конфигурации режим использования модальности стоит «Не использовать», такой вызов выдаст ошибку. В новых конфигурациях пишите ПоказатьПредупреждение.

Длинную строку удобнее всего открыть текстовым документом. Его можно прокручивать, искать по нему и копировать:

ТД = Новый ТекстовыйДокумент;
ТД.УстановитьТекст(ТекстЗапроса);
ТД.Показать("Текст запроса");

Как посмотреть строку в отладчике, не меняя код

Отладчик выводит значение любой переменной без единой строки кода. Это главный инструмент, когда правки в базу вносить нельзя или лишний Сообщить попадёт к пользователям.

Точка останова и вычисление выражения

  1. Откройте модуль в Конфигураторе и поставьте курсор на нужную строку.
  2. Нажмите F9 — слева появится красная точка останова.
  3. Запустите отладку: F5 (меню Отладка → Начать отладку).
  4. В клиенте выполните действие, которое запускает код. Выполнение встанет на точке.
  5. Выделите переменную и нажмите Shift+F9 — откроется окно «Вычислить выражение» со значением.
  6. Шагайте дальше: F10 — на следующую строку, F11 — внутрь процедуры.

В окне вычисления можно ввести не только имя переменной, но и выражение: СтрДлина(Текст), Стр.Сумма * 1.2, ТаблицаТоваров.Количество(). Для длинной строки значение удобно открыть в отдельном окне просмотра — так видны переносы строк и пробелы в конце.

Табло и точка останова с условием

  • 🔍 Табло — список выражений, которые пересчитываются на каждом шаге. Добавьте туда 3–4 переменные и шагайте по циклу: видно, на какой итерации значение «поехало».
  • 🔍 Условная точка — Ctrl+Shift+F9. Задайте условие, например Стр.НомерСтроки = 57, и отладчик остановится только на 57-й строке, а не на каждой.
  • 🔍 Остановка по ошибке — в меню Отладка включите остановку по ошибке. Выполнение встанет прямо на строке, где возникло исключение, со всеми переменными.

Отладка серверного кода

В файловой базе серверные процедуры отлаживаются сразу. В клиент-серверной сервер 1С должен быть запущен с ключом -debug, иначе точки в серверных модулях не сработают. Это настраивает администратор сервера; изменение параметров службы требует её перезапуска, а перезапуск оборвёт сеансы всех пользователей — делайте это вне рабочего времени.

Для фоновых и регламентных заданий откройте Отладка → Подключение и включите автоматическое подключение нужных предметов отладки (серверных и фоновых сеансов).

Вывод строк из серверного кода, фоновых заданий и «консоли»

Где выполняется код, определяет, увидите ли вы строку вообще.

Серверный вызов из формы. Сообщить на сервере работает: сообщения копятся и показываются на клиенте после возврата из серверной процедуры. Ничего дополнительно делать не надо.

Фоновое задание. Клиента у задания нет, сообщения складываются в буфер задания. Забрать их можно с клиента или сервера по ссылке на задание:

Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдЗадания);
Если Задание <> Неопределено Тогда
    Сообщения = Задание.ПолучитьСообщенияПользователю(Истина);
    Для Каждого Сообщ Из Сообщения Цикл
        Сообщить(Сообщ.Текст);
    КонецЦикла;
КонецЕсли;

Параметр Истина очищает буфер, чтобы при следующем опросе те же строки не вывелись повторно.

Регламентное задание. Пользователя нет, забирать сообщения некому — Сообщить уходит в пустоту. Здесь вывод строки делается только записью в журнал регистрации или в файл.

Консоль кода. Под «консолью» в 1С обычно понимают внешнюю обработку , которая выполняет произвольный код в пользовательском режиме через Выполнить(). Её открывают через Файл → Открыть как обычную внешнюю обработку. Вывод в ней тот же — через Сообщить. Удобно, когда нужно проверить кусок кода на рабочих данных без Конфигуратора.

Консоль кода в рабочей базе может изменить и записать данные. Прогоняйте код, который что-то пишет, сначала на копии базы, а в рабочей — только чтение.

Где выполняется код, из которого нужно вывести строку?

Запись строки в журнал регистрации и в файл

Журнал регистрации сохраняет строку надолго, с датой, пользователем и компьютером. Это лучший вариант для кода, который работает без человека, и для разбора сбоев «задним числом».

ЗаписьЖурналаРегистрации("Загрузка прайса",
    УровеньЖурналаРегистрации.Информация, , ,
    СтрШаблон("Загружено строк: %1", Формат(Счетчик, "ЧГ=0")));

Параметры по порядку: имя события, уровень, объект метаданных, данные (ссылка), комментарий. Строку для вывода кладите в комментарий. Имя события задавайте своё и постоянное — по нему потом фильтруют.

Уровни: Информация, Примечание, Предупреждение, Ошибка. Для отладочных строк берите Информация, для перехваченных исключений — Ошибка:

Попытка
    ВыполнитьЗагрузку();
Исключение
    ЗаписьЖурналаРегистрации("Загрузка прайса",
        УровеньЖурналаРегистрации.Ошибка, , ,
        ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    ВызватьИсключение;
КонецПопытки;

Где посмотреть записи:

  • 📂 в Конфигураторе — Администрирование → Журнал регистрации;
  • 📂 в пользовательском режиме — Все функции → Стандартные → Журнал регистрации. Если пункта «Все функции» нет в главном меню, включите его: Сервис → Параметры (в главном меню ☰), флажок «Отображать команду “Все функции”».

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

Не пишите в журнал каждую итерацию цикла на большом объёме. Журнал растёт, и отбор по нему начинает тормозить. Одна запись с итогом лучше тысячи по строке.

Вывод в текстовый файл

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

Запись = Новый ЗаписьТекста("C:\Temp\debug.txt", КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку("Старт: " + Формат(ТекущаяДата(), "ДФ='dd.MM.yyyy HH:mm:ss'"));
Запись.ЗаписатьСтроку("Строк к обработке: " + Формат(Количество, "ЧГ=0"));
Запись.Закрыть();

Не забывайте Закрыть(): до этого файл заблокирован, и часть текста может не записаться.

Как собрать строку для вывода: конкатенация, Формат и СтрШаблон

Половина «странных» сообщений — это не ошибка логики, а неудачно собранная строка.

Конкатенация через +. Склеивает строки. Число без форматирования выведется с разделителем разрядов: "Строк: " + 12500 даст «Строк: 12 500» с неразрывным пробелом. Для чисел, которые потом копируют или сравнивают, нужен Формат.

Функция Формат() — главный инструмент оформления:

ЗадачаПримерРезультат
Число без пробеловФормат(12500, "ЧГ=0")12500
Два знака после запятойФормат(1234.5, "ЧДЦ=2")1 234,50
Ноль не пустойФормат(0, "ЧН=0")0
ДатаФормат(Дата, "ДФ=dd.MM.yyyy")07.10.2026
БулевоФормат(Истина, "БЛ=Нет; БИ=Да")Да

Без ЧН нулевое число превращается в пустую строку — в отладочном выводе это сбивает с толку.

СтрШаблон() (платформа 8.3.6 и новее) подставляет значения в %1, %2 и так далее до %10. Код читается лучше, чем цепочка плюсов:

Текст = СтрШаблон("Документ %1 от %2: сумма %3",
    Документ.Номер, Формат(Документ.Дата, "ДФ=dd.MM.yyyy"), Формат(Сумма, "ЧДЦ=2"));

Служебные символы и сборка из частей:

  • ↩️ Символы.ПС — перенос строки, Символы.Таб — табуляция.
  • 🧩 СтрСоединить(Массив, ", ") склеивает массив строк с разделителем.
  • ✂️ СокрЛП(Строка) убирает пробелы по краям — полезно, когда сравнение «одинаковых» строк даёт Ложь.
  • 🔎 Чтобы увидеть невидимые пробелы, выводите строку в скобках: Сообщить("[" + Код + "]"). Лишний пробел в конце сразу заметен.

Частые вопросы

Почему Сообщить ничего не выводит?
Чаще всего код выполняется там, где нет клиента: в регламентном задании, при обмене или в фоновом задании, сообщения которого никто не забрал. Для таких мест пишите строку в журнал регистрации.
Как вывести строку, если в ней кавычки?
Внутри строкового литерала кавычку удваивают: “Договор ““Поставка””” выведет Договор “Поставка”.
Можно ли вывести строку в 1С без программирования?
Да. Значение реквизита видно в форме, а результат запроса — в консоли запросов. Код нужен только для промежуточных значений внутри алгоритма.
Есть ли ограничение на длину строки в Сообщить?
Практически нет, но очень длинный текст неудобно читать в окне сообщений. Строки длиннее пары экранов лучше показать через ТекстовыйДокумент.Показать или записать в файл.
Как вывести текст запроса с параметрами?
Свойство Запрос.Текст выводит текст без значений параметров. Значения выведите отдельно, перебрав Запрос.Параметры в цикле: ключ и значение.