В процессе разработки и отладки программ на платформе 1С:Предприятие 8.3 часто возникают ситуации, когда в коде обнаруживается досадная опечатка или неверное условие. Например, вы обращаетесь к свойству объекта, которого не существует (пишете Автомобиль.VIN вместо Автомобиль.ВИН), и программа неизбежно должна «упасть» с ошибкой. Однако перезапуск тяжелого сеанса или долгое выполнение алгоритма до точки ошибки отнимает много времени, особенно если вам надоело перезапускать конфигуратор. В этой статье мы подробно разберем, как можно «обмануть» систему и подменить данные прямо в памяти отладчика, не прерывая выполнение программы.
Сразу проясним важный момент: в отличие от некоторых других сред разработки, 1С не поддерживает технологию Edit and Continue в чистом виде. Это означает, что вы не можете просто исправить текст модуля в конфигураторе и продолжить выполнение с той же строки. Любые изменения в тексте кода вступят в силу только после сохранения конфигурации и перезапуска отладочного сеанса.
Однако мы можем изменить состояние объектов в оперативной памяти. Наша цель — подготовить данные таким образом, чтобы текущая строка кода, содержащая ошибку или неверное условие, отработала корректно или так, как нам нужно для теста.
Разберем самый популярный и мощный инструмент — окно «Вычислить выражение». Многие начинающие разработчики используют его только для просмотра текущих значений, но его функционал гораздо шире. Рассмотрим, как выполнить присвоение значения:
Shift+F9.Отказ = Ложь.В этот момент платформа выполнит команду, и значение переменной в контексте выполнения изменится. Рассмотрим ситуацию из вопроса автора: в коде написано ОбластьШапка.Параметры.НомерVIN = Автомобиль.VIN, но у структуры Автомобиль нет ключа VIN, а есть ВИН. Чтобы программа не упала, нам нужно «на лету» добавить этот ключ.
Проанализируем пример кода, который можно ввести в окне вычисления выражений, если Автомобиль — это Структура:
Автомобиль.Вставить("VIN", Автомобиль.ВИН)
После нажатия кнопки «Рассчитать» у структуры появится недостающее поле, и следующая строка кода выполнится без ошибок, так как свойство VIN теперь существует в памяти.
Выясним причину, почему одни объекты менять проще, чем другие. В 1С объекты делятся на примитивные типы (числа, строки, даты) и ссылочные/сложные (структуры, таблицы значений, объекты документов). Если вы работаете со сложным объектом, вы можете вызывать его методы прямо из отладчика.
Рассмотрим подробнее работу с ТаблицейЗначений. Если вы видите, что алгоритм сейчас отработает неверно из-за пустой таблицы, вы можете наполнить её данными прямо в отладке:
НоваяСтрока = ТаблицаТоваров.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Тестовый Товар");
НоваяСтрока.Количество = 1;
Каждую строку нужно «рассчитать» в окне Shift+F9. Это позволяет изменять состав коллекций, не выходя из режима отладки.
Если ошибка возникает внутри длинного цикла (например, на 500-й итерации), менять значения вручную через Shift+F9 становится невозможно. В этом случае разберем использование расширенных свойств точек останова.
Даже если вы используете только стандартное «Условие», вы можете написать там выражение, которое меняет данные и возвращает Ложь (чтобы не останавливаться). Например: (Автомобиль.Вставить("VIN", "123") = Неопределено). Система выполнит вставку и продолжит движение.
Иногда код падает, потому что в объекте базы данных (например, в справочнике ТранспортныеСредства) не заполнено обязательное поле. Если выполнение остановилось на точке останова, мы можем поступить так:
Shift+F9 вызовите метод АвтомобильОбъект.Прочитать() (если у вас в переменной объект) или просто перечитайте данные запросом.Это позволит актуализировать данные в памяти отладчика без прерывания текущего процесса.
Посмотрим на ограничения, которые накладывает платформа:
Вставить(), так как их структура жестко задана в метаданных. В этом случае поможет только подмена всего объекта структурой (если код далее позволяет использовать структуру вместо объекта).Знач, изменение её значения внутри процедуры не повлияет на переменную в вызывающем коде.Резюмируем: функционал кнопки f(x) (или Shift+F9) — это не просто просмотрщик, а полноценная консоль для выполнения кода в контексте текущей строки. Используйте её для временной подмены значений, исправления «на лету» опечаток в структурах и обхода ошибочных условий. Это значительно повысит вашу скорость разработки и сэкономит время на перезапусках системы.