Как исправить ошибку в выражении при работе с флажками в табличном поле 1С?

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

При разработке интерфейсов на обычных формах (толстый клиент) программисты часто сталкиваются с необходимостью реализации механизма «флажков» (чекбоксов) в табличном поле. Однако при копировании примеров кода из внешних источников или при написании логики обработки событий нередко возникают трудночитаемые ошибки. В этой статье мы подробно разберем, почему возникает «Ошибка в выражении», как правильно обрабатывать нажатие на флажок и какие подводные камни таит в себе работа с коллекциями строк.

Причина №1: Коварные «типографские» кавычки

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


Процедура ТабПриИзмененииФлажка(Элемент, Колонка)
    Если Колонка.Имя = “ПроверкаПриход” Тогда
        // Логика обработки
    КонецЕсли; 
КонецПроцедуры

Выясним причину ошибки: если вы копируете код из интернет-блога, текстового редактора (например, MS Word) или мессенджера, стандартные программные кавычки " " (прямые) часто автоматически заменяются на «умные» или типографские кавычки “ ” или « ». Для встроенного языка 1С эти символы не являются ограничителями строковых литералов. Система воспринимает их как неизвестные символы, что приводит к синтаксической ошибке. Чтобы решить эту проблему, необходимо удалить кавычки в конфигураторе и набрать их вручную с клавиатуры в английской раскладке (Shift + ').

Причина №2: Логические несоответствия в именах переменных

Разберем следующую проблему, которая часто скрывается за синтаксическими ошибками. Даже если кавычки исправлены, код может работать некорректно из-за невнимательности при именовании коллекций. Посмотрим на фрагмент кода автора темы:


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

Проанализируем ситуацию: поиск осуществляется в объекте ОтмеченныеСтроки, а добавление и удаление — в объекте ОтмеченныеПользователи. Это критическая ошибка логики. Если список ОтмеченныеСтроки изначально пуст, условие НайденныйЭлемент = Неопределено будет всегда истинным, и программа будет бесконечно добавлять одну и ту же строку в ОтмеченныеПользователи, никогда не заходя в ветку удаления. Всегда проверяйте, что поиск и модификация производятся над одной и той же коллекцией данных (обычно это СписокЗначений).

Правильная реализация обработки флажка в табличном поле

Рассмотрим по шагам, как должна выглядеть надежная процедура обработки флажка для табличного поля, которое не связано напрямую с данными (колонкой Булево в источнике данных).

Во-первых, убедимся, что у колонки табличного поля в свойствах установлены правильные параметры:

  1. Данные: оставить пустым (если мы управляем флажком программно).
  2. ДанныеФлажка: здесь обычно указывается имя поля, но если мы используем внешнюю коллекцию для хранения состояния, поле может быть пустым.
  3. РежимРедактирования: установим «Непосредственно». Это позволит флажку менять состояние по первому клику мыши.

Во-вторых, напишем корректный код обработки события ПриИзмененииФлажка. Рассмотрим пример, где мы используем один список значений для хранения выбранных строк:


Процедура ТабличноеПолеПриИзмененииФлажка(Элемент, Колонка)
    
    // Проверяем, что нажата именно нужная нам колонка
    Если Колонка.Имя = "ПроверкаПриход" Тогда
        
        // ТекущаяСтрока содержит ссылку на объект или строку таблицы значений
        ТекущаяДанные = Элемент.ТекущаяСтрока;
        
        // Ищем строку в нашем списке отмеченных элементов
        НайденныйЭлемент = СписокВыбранныхСтрок.НайтиПоЗначению(ТекущаяДанные);
        
        Если НайденныйЭлемент = Неопределено Тогда
            // Если не нашли - добавляем
            СписокВыбранныхСтрок.Добавить(ТекущаяДанные);
            Сообщить("Элемент добавлен в список выбора.");
        Иначе
            // Если нашли - удаляем именно найденный объект элемента списка
            СписокВыбранныхСтрок.Удалить(НайденныйЭлемент);
            Сообщить("Элемент удален из списка выбора.");
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Альтернативный подход: Использование булевой колонки

Профессиональным стандартом разработки в 1С считается отказ от внешних списков значений в пользу добавления колонки типа Булево непосредственно в источник данных (например, в ТаблицуЗначений). Рассмотрим преимущества этого метода:

Проанализируем пример реализации:

  1. Добавим в ТаблицуЗначений колонку «Пометка» с типом Булево.
  2. В свойствах колонки табличного поля в поле «ДанныеФлажка» укажем имя этой колонки — «Пометка».
  3. Установим свойство «РежимРедактирования» в значение «Непосредственно».

Теперь состояние флажка будет автоматически сохраняться в строке таблицы без написания кода в событии ПриИзмененииФлажка. Для обработки результата используем такой код:


ПараметрыОтбора = Новый Структура("Пометка", Истина);
МассивВыбранныхСтрок = ИмяВашейТаблицы.НайтиСтроки(ПараметрыОтбора);

Для Каждого СтрокаТЗ Из МассивВыбранныхСтрок Цикл
    // Выполняем действия с отмеченными строками
КонецЦикла;

Как использовать отладку для поиска ошибок

Если код все равно выдает ошибку, разберем, как воспользоваться механизмом отладки. Для начинающего разработчика это самый быстрый способ понять, что идет не так.

Посмотрим, как настроить автоматическую остановку системы при возникновении ошибки:

  1. В конфигураторе перейдите в меню Отладка — Настройка отладки.
  2. В открывшемся окне выберите пункт Остановка по ошибке.
  3. Установите галочку «Останавливаться по ошибке».

Теперь при запуске программы в режиме отладки 1С сама остановит выполнение кода именно на той строке, где происходит сбой. Вы сможете навести курсор на переменные (например, на Колонка.Имя) и увидеть их реальное значение в момент ошибки. Это позволит сразу понять, правильно ли указано имя колонки и инициализированы ли переменные ОтмеченныеПользователи или СписокЗначений.

Помните, что внимательность к деталям (кавычки, соответствие имен переменных) и использование типизированных данных (колонки таблиц вместо списков) сокращают время на разработку и отладку в несколько раз.

← На главную