Как обратиться к объекту или реквизиту с пробелом в имени в 1С и исправить ошибку?

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

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

Причины возникновения и ограничения платформы 1С

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

  1. Синтаксис встроенного языка: невозможность обращения к свойству или методу через оператор разыменования (точку).
  2. Язык запросов: в языке запросов 1С отсутствует экранирование имен полей и таблиц (в отличие от SQL, где применяются кавычки или квадратные скобки). Обратиться к полю с пробелом в блоке ВЫБРАТЬ или условиях соединения напрямую невозможно.
  3. Конструкция ЗНАЧЕНИЕ() в запросах: если пробел содержится в имени предопределенного элемента, конструкция вида ЗНАЧЕНИЕ(Справочник.Номенклатура.Элемент С Пробелом) выдаст ошибку синтаксического анализатора запроса.

Способ 1. Программное обращение через квадратные скобки

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

Посмотрим на пример обращения к реквизиту объекта или ссылки:


// Обращение к реквизиту объекта или ссылки через квадратные скобки
ИмяРеквизита = "Имя С Пробелом";
ЗначениеРеквизита = СсылкаНаОбъект[ИмяРеквизита];

// Установка значения реквизита в объекте
ОбъектДляИзменения[ИмяРеквизита] = НовоеЗначение;

Если требуется получить доступ к объекту метаданных, используем коллекцию метаданных платформы:


// Доступ к метаданным справочника с пробелом в имени
ИмяСправочника = "Справочник С Пробелом";
ОбъектМетаданных = Метаданные.Справочники[ИмяСправочника];

// Получение ссылки на предопределенный элемент через менеджер
ПредопределеннаяСсылка = Справочники[ИмяСправочника]["Имя Предопределенного"];

Способ 2. Передача предопределенных значений в запросы через параметры

Если в запросе невозможно использовать предопределенный элемент из-за пробела в имени, получим его значение во встроенном языке и передадим в запрос через параметр. Рассмотрим подробнее этот алгоритм:


// Получаем ссылку на предопределенный элемент во встроенном языке
ИмяПредопределенного = "Элемент С Пробелом";
ЗначениеПараметра = Справочники.Номенклатура[ИмяПредопределенного];

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    Таблица.Ссылка КАК Ссылка,
    |    Таблица.Количество КАК Количество
    |ИЗ
    |    Документ.РеализацияТоваровУслуг.Товары КАК Таблица
    |ГДЕ
    |    Таблица.Номенклатура = &НужнаяНоменклатура";

Запрос.УстановитьПараметр("НужнаяНоменклатура", ЗначениеПараметра);
РезультатЗапроса = Запрос.Выполнить();

Способ 3. Исправление имени в дереве метаданных (Конфигуратор)

Рассмотрим радикальное и правильное решение проблемы — переименование реквизита или объекта в конфигураторе. Проанализируем по шагам процесс исправления:

  1. Создание резервной копии: перед любыми изменениями структуры метаданных обязательно создаем выгрузку информационной базы (файл .dt) или резервную копию средствами СУБД.
  2. Включение возможности изменения: если конфигурация находится на поддержке без возможности редактирования, переходим в меню Конфигурация — Поддержка — Настройка поддержки и включаем возможность изменения с сохранением поддержки.
  3. Корректировка имени: находим проблемный объект или реквизит в дереве метаданных, открываем его свойства и удаляем лишний пробел из поля Имя. При этом Синоним можно оставить без изменений.
  4. Обновление конфигурации базы данных: применяем изменения (клавиша F7). При переименовании реквизита или объекта внутренний идентификатор (UUID) сохраняется, поэтому физические данные в таблицах базы данных не теряются.

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

← На главную