В процессе разработки и отладки программного кода в 1С:Предприятии разработчики иногда сталкиваются с аномальным поведением переменных. Представим ситуацию: в коде внешней обработки или модуля пишется обычное присваивание строки, например конкатенация строковых данных документа, однако в табло отладчика переменная упорно отображает тип Булево со значением Ложь или Истина, а само вычисляемое строковое выражение при этом в отладчике рассчитывается корректно.
Разберем подробнее, почему возникает эта ошибка, как устроена работа отладчика с памятью и какими способами можно устранить эту проблему.
Посмотрим на пример кода, в котором проявилась неполадка:
НомерКорректировки = "[№ " + Док.Номер + " год " + Год(Док.Дата) + " ППВ]";
Справа от знака равенства находится явное строковое выражение. При ручном вычислении правой части через окно «Вычислить выражение» (Shift+F9) платформа возвращает ожидаемую строку. Однако сама переменная НомерКорректировки в окне локальных переменных или в табло имеет тип Булево. Выясним причину такого поведения платформы.
Перем, платформа ищет идентификатор в цепочке областей видимости: локальные переменные, реквизиты объекта или формы, реквизиты расширений, общие переменные. Наличие одноименного реквизита типа Булево в контексте формы может перехватывать обращение.Наиболее частое и действенное решение в данной ситуации — очистить пользовательский кэш. Когда карта соответствия метаданных и исполняемого байт-кода повреждена, очистка временных файлов возвращает отладчик в нормальное состояние.
Разберем по шагам, как очистить кэш:
%LOCALAPPDATA%\1C\1cv8
%APPDATA%\1C\1cv8
a8b6c4..., которые хранят динамический кэш конфигураций. Каталоги с номерами версий платформы (например, 8.3.24.1342) удалять не требуется.%TEMP%, так как платформа распаковывает и запускает временные копии файлов именно оттуда.Чтобы автоматизировать очистку клиентского кэша и не искать папки вручную, воспользуемся штатным параметром запуска. Проанализируем, как это сделать:
/ClearCache.Чтобы исключить коллизии с реквизитами формы или старыми слотами в стеке вызовов, объявим переменную явно в начале процедуры или функции с помощью ключевого слова Перем. Посмотрим на пример правильного кода:
Процедура СформироватьНомер(Док)
Перем НомерКорректировки;
НомерКорректировки = "[№ " + Док.Номер + " год " + Год(Док.Дата) + " ППВ]";
// Дальнейшие действия с переменной
КонецПроцедуры
В этом случае платформа гарантированно создаст изолированную локальную переменную и инициализирует её значением Неопределено до момента первого присвоения, исключая нежелательную связь с глобальным или контекстным окружением.
При пошаговой отладке кода всегда контролируйте положение текущего маркера выполнения: