Иногда в типовых конфигурациях или в результате некорректного объединения метаданных разработчики сталкиваются с нестандартной ситуацией: в идентификаторе реквизита, табличной части, предопределенного элемента или самого объекта конфигурации присутствует пробел (часто случайный завершающий пробел). Проанализируем, почему возникает такая ошибка, какие ограничения платформы 1С она вызывает и как получить доступ к данным или окончательно устранить проблему.
Встроенный язык 1С использует пробел как разделитель синтаксических лексем. По этой причине прямое обращение через точку вида Объект.Имя С Пробелом вызывает синтаксическую ошибку компиляции модуля. Выясним основные проблемы, с которыми можно столкнуться при наличии пробелов в идентификаторах:
ВЫБРАТЬ или условиях соединения напрямую невозможно.ЗНАЧЕНИЕ() в запросах: если пробел содержится в имени предопределенного элемента, конструкция вида ЗНАЧЕНИЕ(Справочник.Номенклатура.Элемент С Пробелом) выдаст ошибку синтаксического анализатора запроса.Разберем, как получить значение реквизита или объекта программно без изменения структуры конфигурации. Платформа 1С поддерживает механизм обращения к свойствам объектов и коллекций по строковому имени с помощью квадратных скобок.
Посмотрим на пример обращения к реквизиту объекта или ссылки:
// Обращение к реквизиту объекта или ссылки через квадратные скобки
ИмяРеквизита = "Имя С Пробелом";
ЗначениеРеквизита = СсылкаНаОбъект[ИмяРеквизита];
// Установка значения реквизита в объекте
ОбъектДляИзменения[ИмяРеквизита] = НовоеЗначение;
Если требуется получить доступ к объекту метаданных, используем коллекцию метаданных платформы:
// Доступ к метаданным справочника с пробелом в имени
ИмяСправочника = "Справочник С Пробелом";
ОбъектМетаданных = Метаданные.Справочники[ИмяСправочника];
// Получение ссылки на предопределенный элемент через менеджер
ПредопределеннаяСсылка = Справочники[ИмяСправочника]["Имя Предопределенного"];
Если в запросе невозможно использовать предопределенный элемент из-за пробела в имени, получим его значение во встроенном языке и передадим в запрос через параметр. Рассмотрим подробнее этот алгоритм:
// Получаем ссылку на предопределенный элемент во встроенном языке
ИмяПредопределенного = "Элемент С Пробелом";
ЗначениеПараметра = Справочники.Номенклатура[ИмяПредопределенного];
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Таблица.Ссылка КАК Ссылка,
| Таблица.Количество КАК Количество
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Таблица
|ГДЕ
| Таблица.Номенклатура = &НужнаяНоменклатура";
Запрос.УстановитьПараметр("НужнаяНоменклатура", ЗначениеПараметра);
РезультатЗапроса = Запрос.Выполнить();
Рассмотрим радикальное и правильное решение проблемы — переименование реквизита или объекта в конфигураторе. Проанализируем по шагам процесс исправления:
.dt) или резервную копию средствами СУБД.Имя. При этом Синоним можно оставить без изменений.Важно: при последующих типовых обновлениях конфигурации от поставщика через сравнение и объединение конфигураций следует контролировать сопоставление исправленного объекта с объектом из нового релиза поставщика, чтобы исключить дублирование метаданных.