При разработке в среде 1С:Предприятие 8.3, особенно в таких сложных конфигурациях, как Бухгалтерия предприятия КОРП, начинающие программисты часто сталкиваются с парадоксальной ситуацией в отладчике. Просматривая переменную, которая содержит ссылку на справочник, они видят в колонке «Значение» некую строку, визуально состоящую из нескольких элементов (например, перечисленных через запятую или пробел). Однако при попытке обратиться к «третьему» элементу этой строки с помощью индекса [2], система выдает ошибку: «получение элемента по индексу для значения не определено».
В этой статье мы подробно разберем, почему так происходит, научимся правильно интерпретировать показания отладчика и выясним, как на самом деле «вытащить» нужные данные из реквизитов табличной части.
Первое, что мы должны сделать — это четко разграничить типы данных. В 1С объекты могут быть либо одиночными (ссылка на элемент, строка, число, дата), либо коллекциями (Массив, СписокЗначений, ТаблицаЗначений, Структура).
Проанализируем ситуацию пользователя: в табличной части (ТЧ) документа есть реквизит. Тип этого реквизита — СправочникСсылка. Когда мы находимся в цикле обхода табличной части:
Для Каждого Стр Из Объект.Товары Цикл
// Пытаемся обратиться к реквизиту
НужныйЭлемент = Стр.Номенклатура[2]; // Здесь возникает ошибка
КонецЦикла;
Ошибка возникает потому, что СправочникСсылка — это уникальный идентификатор одного-единственного объекта в базе данных. Даже если в отладчике в поле «Значение» вы видите текст «Товар 1, Товар 2, Товар 3», для платформы 1С это всего лишь строковое представление одной ссылки. У ссылки нет индексов, это не массив.
Чтобы окончательно убедиться в том, с чем мы имеем дело, воспользуемся окном «Вычислить выражение» (Shift + F9). Рассмотрим по шагам, как проверить тип:
Стр.НужныйРеквизит и нажмите Shift + F9.ТипЗнч(Стр.НужныйРеквизит).Справочник ссылка: [ИмяСправочника], значит, это одиночный объект.Если бы это была коллекция, тип назывался бы Массив или СписокЗначений. Только к ним можно обращаться через квадратные скобки [].
Разберем, откуда берется иллюзия списка. В настройках любого справочника в конфигураторе есть вкладка «Данные», где устанавливается «Основное представление». Обычно это «Наименование» или «Код».
Если пользователь в поле «Наименование» конкретного элемента справочника записал строку вида «Яблоко, Груша, Слива», то отладчик, показывая значение ссылки, выведет именно это наименование. Вы видите «5 элементов», но на самом деле это одна длинная строка названия одного элемента справочника.
Чтобы увидеть структуру объекта более детально, в окне отладки нажмите клавишу F2 на исследуемом значении или нажмите на иконку с лупой (показать в отдельном окне). Вы увидите все поля этого элемента справочника (Код, Наименование, Родитель и др.) и поймете, что это единая сущность.
Если ваша задача — получить «третье слово» из того строкового представления, которое вы видите, вам нужно работать не с самой ссылкой, а с ее строковым свойством. Рассмотрим пример кода, который поможет это сделать:
// Получаем текстовое наименование ссылки
ТекстНаименования = Стр.НужныйРеквизит.Наименование;
// Разделяем строку в массив, используя разделитель (например, запятую)
МассивЧастей = СтрРазделить(ТекстНаименования, ",");
// Проверяем, есть ли в массиве хотя бы 3 элемента (индекс 2)
Если МассивЧастей.Количество() >= 3 Тогда
НужноеНамЗначение = СокрЛП(МассивЧастей[2]);
Сообщить("Мы достали третье значение: " + НужноеНамЗначение);
КонецЕсли;
В данном примере функция СтрРазделить превращает строку в настоящий массив, к которому уже можно обращаться по индексу.
Иногда путаница возникает, если «5 значений» — это не текст в наименовании, а строки табличной части внутри самого справочника, на который мы ссылаемся. Если вам нужно получить данные из ТЧ этого элемента, обращение будет выглядеть иначе:
// Стр.НужныйРеквизит — это ссылка на элемент справочника
// Предположим, у этого справочника есть своя ТЧ с именем "Состав"
Если Стр.НужныйРеквизит.Состав.Количество() >= 3 Тогда
ТретьяСтрокаТЧ = Стр.НужныйРеквизит.Состав[2];
ЗначениеРеквизитаТЧ = ТретьяСтрокаТЧ.ИмяРеквизита;
КонецЕсли;
Здесь мы сначала обращаемся к ссылке, затем к ее табличной части Состав (которая является коллекцией), и только потом применяем индекс [2] для получения третьей строки.
В конфигурации БП КОРП часто используются механизмы Дополнительных реквизитов и сведений. Проанализируем ситуацию: если ваш реквизит имеет составной тип данных, он может содержать ссылку на справочник «Значения свойств объектов».
Если вы видите список значений, возможно, на форме отображается не один реквизит, а результат работы общего модуля, который собирает данные из разных мест. В этом случае всегда проверяйте ПутьКДанным у элемента формы. Если программный код работает напрямую с Объект.ИмяТабличнойЧасти, всегда ориентируйтесь на метаданные этой таблицы в конфигураторе.
Подведем итоги нашего исследования:
СправочникСсылка, обращение по индексу [] всегда приведет к ошибке.F2 в отладке, чтобы «провалиться» внутрь объекта и увидеть его реальные реквизиты.СтрРазделить.Ссылка.ИмяТабличнойЧасти[Индекс].Помните, что в 1С 8.3 работа с данными строится на строгой типизации объектов. Понимание разницы между ссылкой на объект и коллекцией объектов — это базовый навык, который убережет вас от множества ошибок при разработке сложных систем.