Разработка и Конфигурация · 11 мин
Как получить картинку по индексу в 1С
Как получить картинку по индексу в 1С: работа с коллекциями картинок, метод Получить, индексация элементов, примеры кода на встроенном языке и типичные ошибки.
В 1С картинки хранятся в нескольких видах коллекций: общие картинки конфигурации, библиотека картинок платформы, картинки в реквизитах объектов и наборы картинок элементов управления (например, у табличного поля или дерева значений). Во всех этих случаях обращение к конкретной картинке часто выполняется по индексу — числовой позиции элемента внутри коллекции. Понимание того, как устроена эта индексация, позволяет выводить нужные пиктограммы в формах, отчётах и табличных документах без дублирования файлов.
Чаще всего задача «получить картинку по индексу» возникает в трёх сценариях: при работе с коллекцией картинок через метод Получить(), при обращении к библиотеке картинок через БиблиотекаКартинок и при использовании свойства КартинкаСтрок с указанием индекса в дереве значений или таблице. Ниже разобраны все три подхода с рабочим кодом, ограничениями и способами проверки результата.
Как устроена индексация картинок в 1С
Все коллекции картинок в платформе 1С индексируются с нуля: первый элемент имеет индекс 0, второй — 1 и так далее. Это касается коллекций, получаемых методом ПолучитьКартинки(), наборов картинок в свойствах элементов формы и любых пользовательских коллекций, созданных через Новый Массив или Новый СписокЗначений с картинками внутри.
Важно различать индекс и имя картинки. Общие картинки конфигурации и элементы библиотеки картинок адресуются по имени (БиблиотекаКартинок.Сохранить), а по индексу — только элементы упорядоченных коллекций. Если вы пытаетесь обратиться к именованной картинке по индексу, это признак того, что выбран не тот механизм: для именованных ресурсов индекса нет.
Количество элементов коллекции всегда можно получить методом Количество(). Допустимый диапазон индексов — от 0 до Количество() - 1. Обращение за пределами диапазона вызывает ошибку выполнения, поэтому перед получением элемента стоит проверять границы.
Получение картинки из коллекции методом Получить
Базовый синтаксис обращения по индексу выглядит так: Картинка = КоллекцияКартинок.Получить(Индекс);. Вместо метода Получить() допустим и краткий вариант с квадратными скобками: КоллекцияКартинок[Индекс] — обе формы возвращают объект типа «Картинка».
Типовой пример — перебор коллекции и выбор нужного элемента:
Коллекция = ЭлементыФормы.ТабличноеПоле.КартинкиСтрок;
ВсегоКартинок = Коллекция.Количество();
Если Индекс >= 0 И Индекс < ВсегоКартинок Тогда
НужнаяКартинка = Коллекция.Получить(Индекс);
Иначе
Сообщить("Индекс вне диапазона: " + Индекс);
КонецЕсли;
Обратите внимание: метод Получить() возвращает ссылку на объект картинки, а не её копию. Если вы изменяете полученный объект (что редко нужно), изменения отразятся в самой коллекции. Для безопасного использования достаточно присвоить картинку свойству элемента формы или реквизиту — платформа сама управляет временем жизни объекта.
Картинка = КоллекцияКартинок.Получить(1); // второй элемент, индексация с нуляОбращение к библиотеке картинок и общим картинкам
Стандартные пиктограммы платформы доступны через свойство БиблиотекаКартинок, а картинки, добавленные разработчиком в конфигурацию, — через Метаданные.ОбщиеКартинки и оператор БиблиотекаКартинок либо ПолучитьОбщуюКартинку() в обычных формах. Здесь адресация идёт по имени, а не по индексу: Картинка = БиблиотекаКартинок.Найти;.
Однако индекс появляется, когда картинка из библиотеки помещается в коллекцию элемента формы. Например, у табличного поля есть свойство КартинкиСтрок — коллекция, в которую можно добавить несколько картинок и затем ссылаться на них по индексу из данных строки:
// В управляемой форме: заполняем коллекцию картинок строк
Элементы.СписокТоваров.КартинкаСтрок = БиблиотекаКартинок.Справочник;
// В обычной форме: добавляем несколько картинок в коллекцию
КоллекцияКартинок = ЭлементыФормы.ДеревоНоменклатуры.КартинкиСтрок;
КоллекцияКартинок.Добавить(БиблиотекаКартинок.Справочник);
КоллекцияКартинок.Добавить(БиблиотекаКартинок.ЭлементСправочника);
// Теперь индекс 0 — папка, индекс 1 — элемент
После такого заполнения в колонке данных, связанной с отображением картинки, указывается именно числовой индекс — этим и достигается связь «строка → картинка по индексу».
Картинка по индексу в дереве значений и таблице значений
Классический сценарий — отображение разных пиктограмм для групп и элементов в дереве значений на обычной форме. Механизм такой: в дерево добавляется служебная колонка (обычно числового типа), в которую для каждой строки записывается индекс картинки из коллекции КартинкиСтрок. Затем в свойствах колонки табличного поля указывается, что эта колонка содержит индекс картинки.
// Заполняем индексы картинок при построении дерева
Процедура ЗаполнитьСтроки(Строки)
Для Каждого Строка Из Строки Цикл
Если Строка.ЭтоГруппа Тогда
Строка.ИндексКартинки = 0; // папка
Иначе
Строка.ИндексКартинки = 1; // элемент
КонецЕсли;
ЗаполнитьСтроки(Строка.Строки);
КонецЦикла;
КонецПроцедуры
Признак корректной настройки: в дереве на форме у групп и элементов отображаются разные пиктограммы, при сворачивании и разворачивании веток картинки не сбрасываются. Если вместо картинки виден пустой квадрат или стандартный значок — проверьте, что коллекция КартинкиСтрок заполнена до установки индексов и что индексы не выходят за её границы.
В табличном документе картинку по индексу получают иначе: там используется коллекция рисунков области или явная вставка объекта Картинка через Рисунок.Картинка = .... Индексация рисунков внутри табличного документа также начинается с нуля.
- 1Создайте дерево значений с числовой колонкой для индекса картинки
- 2Заполните коллекцию КартинкиСтрок табличного поля нужными картинками
- 3При заполнении строк проставьте каждой строке индекс от 0 до Количество()-1
- 4Настройте колонку табличного поля: укажите путь к данным индекса картинки
- 5Откройте форму и проверьте отображение пиктограмм у всех типов строк
Картинки из хранилища значений и реквизитов объектов
Если картинки хранятся в базе данных — в реквизитах типа «ХранилищеЗначения» справочника или в регистре сведений — понятие индекса меняет смысл. Здесь «по индексу» обычно означает «из строки таблицы с нужным номером», например из табличной части с дополнительными изображениями товара:
// Получаем картинку из первой строки табличной части "Изображения"
Если Объект.Изображения.Количество() > 1 Тогда
СтрокаКартинки = Объект.Изображения[1]; // вторая строка
ДвоичныеДанные = СтрокаКартинки.Хранилище.Получить();
Если ДвоичныеДанные <> Неопределено Тогда
Картинка = Новый Картинка(ДвоичныеДанные);
КонецЕсли;
КонецЕсли;
Здесь критично проверять, что метод Получить() хранилища вернул данные, а не Неопределено — пустое хранилище без проверки приведёт к ошибке конструктора картинки. Также помните, что обращение к строке табличной части по индексу выполняется через квадратные скобки, и индексация снова начинается с нуля.
Проверка результата и типичные ошибки
После получения картинки убедитесь, что объект валиден. Простейшая проверка — сравнение с пустой картинкой и контроль размера: у корректно загруженной картинки свойства Высота и Ширина больше нуля. Для отображения в форме достаточно визуального контроля: пиктограмма должна появиться в нужной колонке без искажений.
Наиболее частая ошибка — путаница с нумерацией: разработчик ожидает, что первый элемент имеет индекс 1, и получает либо не ту картинку, либо ошибку выхода за границы при обращении к элементу с индексом, равным Количество(). Вторая типичная проблема — обращение к коллекции до её заполнения: если КартинкиСтрок ещё пустая, любой индекс окажется вне диапазона.
Третья группа ошибок связана с контекстом выполнения. В тонком клиенте и веб-клиенте часть методов работы с картинками недоступна или требует асинхронного вызова (например, загрузка из файла — через НачатьПомещениеФайла). Код, работающий в толстом клиенте, может молча не выполниться на сервере, где недоступны элементы формы.
Как проверить результат
Переменная содержит объект типа Картинка, высота и ширина больше нуля
Неопределено или ошибка выполнения при обращении к коллекции
Пиктограмма видна в нужной строке и колонке
Пустой квадрат, стандартный значок или отсутствие картинки
Картинки сохраняются после сворачивания веток и переоткрытия формы
Индексы сбрасываются, картинки пропадают
FAQ
С какого числа начинается индексация коллекций картинок в 1С?
С нуля. Первый элемент любой коллекции — Получить(0), последний — Получить(Количество() - 1). Это отличается от нумерации строк в некоторых табличных представлениях, где пользователь видит номера с единицы.
Можно ли получить картинку из БиблиотекаКартинок по индексу?
Нет, библиотека картинок адресуется только по имени: БиблиотекаКартинок.ИмяКартинки. Если нужна индексация, добавьте картинки из библиотеки в собственную коллекцию (массив или КартинкиСтрок элемента формы) и обращайтесь к ней по индексу.
Как вывести разные картинки строк в управляемой форме?
В управляемой форме свойство КартинкаСтрок задаёт одну картинку для всех строк динамического списка или дерева. Для индивидуальных пиктограмм используют условное оформление либо отдельную колонку с полем типа Картинка, куда программно помещают нужный объект для каждой строки.
Что делать, если Получить(Индекс) вызывает ошибку?
Проверьте три вещи: коллекция заполнена (Количество() больше нуля), индекс неотрицательный и меньше Количество(), а сама переменная коллекции не равна Неопределено. Чаще всего ошибка возникает из-за обращения к ещё не инициализированной коллекции.
Работает ли получение картинки по индексу на сервере?
Работа с самими коллекциями и объектами Картинка доступна на сервере. Недоступны на сервере элементы формы — свойства КартинкиСтрок табличного поля можно менять только в клиентском контексте обычного приложения или в обработчиках формы.
Как получить картинку из файла вместо коллекции?
Используйте конструктор Новый Картинка(ПутьКФайлу) в толстом клиенте или на сервере. В тонком и веб-клиенте файл сначала помещается во временное хранилище асинхронным методом НачатьПомещениеФайла, затем картинка создаётся из двоичных данных.
Что важно запомнить
Картинка по индексу получается методом Получить(Индекс) или через квадратные скобки, индексация всегда с нуля. Перед обращением проверяйте границы коллекции, а при работе с хранилищем значений — результат на Неопределено. Для отображения разных пиктограмм в строках дерева индекс хранится в служебной числовой колонке.