Почему переменная в 1С принимает тип Булево вместо строки и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки и отладки программного кода в 1С:Предприятии разработчики иногда сталкиваются с аномальным поведением переменных. Представим ситуацию: в коде внешней обработки или модуля пишется обычное присваивание строки, например конкатенация строковых данных документа, однако в табло отладчика переменная упорно отображает тип Булево со значением Ложь или Истина, а само вычисляемое строковое выражение при этом в отладчике рассчитывается корректно.

Разберем подробнее, почему возникает эта ошибка, как устроена работа отладчика с памятью и какими способами можно устранить эту проблему.

Посмотрим на пример кода, в котором проявилась неполадка:

НомерКорректировки = "[№ " + Док.Номер + " год " + Год(Док.Дата) + " ППВ]";

Справа от знака равенства находится явное строковое выражение. При ручном вычислении правой части через окно «Вычислить выражение» (Shift+F9) платформа возвращает ожидаемую строку. Однако сама переменная НомерКорректировки в окне локальных переменных или в табло имеет тип Булево. Выясним причину такого поведения платформы.

Причины некорректного отображения типа переменной

  1. Повреждение и рассинхронизация кэша отладки (карты символов). При компиляции модулей платформа 1С преобразует исходный текст в байт-код, выделяя локальным переменным ячейки во фрейме стека. Если локальный кэш конфигурации или кэш отладочной информации поврежден (что часто происходит при многократном редактировании и перезапуске внешних обработок либо после динамического обновления), связь между именами переменных в исходном тексте и адресами в скомпилированном модуле нарушается. Отладчик считывает данные из соседней ячейки памяти, где может находиться внутренний флаг платформы или булев реквизит.
  2. Точка останова на самой строке присваивания. Если точка останова установлена непосредственно на строку, где происходит вычисление, операция присвоения еще физически не выполнена. До перехода на следующую строку значение неявной переменной зависит от состояния стека вызовов, и отладчик может отображать данные предыдущих контекстов.
  3. Коллизия контекстов и затенение имен. Если переменная не объявлена явно через директиву Перем, платформа ищет идентификатор в цепочке областей видимости: локальные переменные, реквизиты объекта или формы, реквизиты расширений, общие переменные. Наличие одноименного реквизита типа Булево в контексте формы может перехватывать обращение.

Способ 1. Очистка локального кэша платформы 1С

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

Разберем по шагам, как очистить кэш:

  1. Полностью завершите все сеансы «1С:Предприятия» и конфигуратора на компьютере.
  2. Перейдите в каталоги временных файлов пользователя Windows:

    %LOCALAPPDATA%\1C\1cv8

    %APPDATA%\1C\1cv8

  3. Найдите и удалите папки с длинными шестнадцатеричными буквенно-цифровыми названиями (GUID-идентификаторами), например вида a8b6c4..., которые хранят динамический кэш конфигураций. Каталоги с номерами версий платформы (например, 8.3.24.1342) удалять не требуется.
  4. Для внешних обработок также полезно очистить системный каталог временных файлов %TEMP%, так как платформа распаковывает и запускает временные копии файлов именно оттуда.

Способ 2. Запуск приложения с параметром /ClearCache

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

  1. Откройте окно запуска списка информационных баз 1С.
  2. Выберите нужную базу и нажмите кнопку «Изменить».
  3. Перейдите на последнюю страницу настроек к полю «Дополнительные параметры запуска».
  4. Укажите параметр: /ClearCache.
  5. Нажмите «Готово» и запустите базу. При каждом таком запуске платформа будет очищать кэш метаданных клиента перед началом сеанса.

Способ 3. Явное объявление переменной в процедуре

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


Процедура СформироватьНомер(Док)
    Перем НомерКорректировки;
    
    НомерКорректировки = "[№ " + Док.Номер + " год " + Год(Док.Дата) + " ППВ]";
    
    // Дальнейшие действия с переменной
КонецПроцедуры

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

Способ 4. Проверка шага выполнения в отладчике

При пошаговой отладке кода всегда контролируйте положение текущего маркера выполнения:

  1. Если выполнение остановилось на строке присваивания, нажмите клавишу F10 («Шагнуть через»), чтобы строка действительно выполнилась процессором платформы.
  2. Только после перехода стрелки отладчика на следующую строку проверяйте значение переменной в окне «Табло» или по наведению курсора мыши. До выполнения строки значение не является достоверным.
← На главную