Работа с пользовательским вводом в конфигурациях 1С:Предприятие часто требует организации удобных интерфейсов выбора. Одним из самых гибких инструментов для этой цели является объект СписокЗначений. Он позволяет формировать динамические перечни, которые отображаются в полях выбора, табличных частях форм или используются для фильтрации данных.
Начинающие разработчики часто сталкиваются с вопросом, как программно наполнить этот объект и какие методы существуют для добавления конкретных записей. В отличие от стандартных перечислений, СписокЗначений не хранится в базе данных постоянно, а создается «на лету» в оперативной памяти. Это делает его идеальным решением для ситуаций, когда состав вариантов зависит от текущих условий работы пользователя или специфических настроек системы.
В этой статье мы детально разберем алгоритм создания объекта, добавления в него элементов с различными свойствами и особенности работы с кодом. Вы узнаете, как избежать распространенных ошибок при формировании списков и как правильно использовать методы сортировки для улучшения пользовательского опыта.
Создание объекта и базовая структура
Первым шагом в работе со списками значений является инициализация самого объекта. В коде 1С это делается через конструктор Новый СписокЗначений. Важно понимать, что пустой объект не содержит никаких данных и требует явного заполнения перед выводом на форму или передачу в другие процедуры. Структура элемента списка включает значение, представление и дополнительные свойства.
Каждый элемент списка представляет собой сложную структуру, где ключевым параметром является Значение. Именно этот параметр будет возвращен в переменную после выбора пользователем. Однако для отображения в интерфейсе используется параметр Представление, который может отличаться от внутреннего значения. Такая двойственность позволяет показывать пользователю понятный текст, а в логику программы передавать уникальный идентификатор или код.
Используйте свойство "Пометка" для визуального выделения важных элементов в списке, например, пометив курсом валюты, который используется по умолчанию.
При создании списка вы можете сразу определить его основные характеристики, такие как возможность множественного выбора или тип хранимых данных. Хотя эти настройки часто оставляют по умолчанию, в специфических задачах их изменение критически важно. Например, если список используется для отбора нескольких контрагентов одновременно, свойство МножественныйВыбор должно быть установлено в истину.
⚠️ Внимание: Не пытайтесь присвоить списку значений значение
Неопределенопосле его создания, если планируете добавлять элементы циклом. Это приведет к ошибке выполнения. Всегда инициализируйте объект перед началом работы с ним.
Методы добавления элементов в список
Основной механизм наполнения списка реализуется через метод Добавить. Этот метод принимает несколько параметров, позволяющих гибко настроить создаваемый элемент. Синтаксис вызова выглядит следующим образом: Список.Добавить(Значение, Представление, Картинка, Пометка, Данные). Разберем каждый из этих параметров подробнее, так как понимание их назначения необходимо для корректной работы.
Параметр Значение является обязательным и определяет то, что фактически будет сохранено при выборе. Это может быть строка, число, ссылка на объект базы данных или даже структура. Параметр Представление отвечает за текст, видимый пользователю в выпадающем списке. Если этот параметр не указан, система автоматически преобразует значение в строку, что не всегда дает красивый результат.
Список = Новый СписокЗначений;
Список.Добавить("001", "Основной склад");
Список.Добавить("002", "Резервный склад");
Дополнительные параметры, такие как Картинка и Пометка, отвечают за визуальное оформление. Картинка позволяет добавить иконку слева от текста, что улучшает восприятие информации. Пометка отображает галочку справа, что часто используется в списках для отбора или в настройках прав доступа. Использование этих параметров делает интерфейс более дружелюбным и интуитивно понятным.
Существует также метод Вставить, который позволяет добавить элемент не в конец списка, а на конкретную позицию. Это полезно, когда порядок элементов имеет смысловую нагрузку и должен соблюдаться строго. Например, при формировании списка статусов документа, где первый элемент всегда должен быть «Черновик».
Работа со свойствами элементов и типами данных
Одной из ключевых особенностей СписокЗначений является возможность хранения данных разных типов в одном списке. Вы можете смешивать ссылки на документы, справочники и примитивные типы данных. Однако при выводе такого списка в поле формы типа ПолеВыбора могут возникнуть нюансы отображения, если типы данных слишком разнородны.
Для управления поведением элементов используется свойство Данные. Это поле не отображается пользователю и не участвует в выборе, но служит для хранения служебной информации. Например, туда можно записать признак доступности элемента или ссылку на родительскую запись, которая потребуется при последующей обработке выбора.
| Параметр | Тип данных | Описание | Обязательный |
|---|---|---|---|
| Значение | Любой | Внутреннее значение элемента | Да |
| Представление | Строка | Текст для отображения в интерфейсе | Нет |
| Картинка | Картинка | Иконка элемента | Нет |
| Пометка | Булево | Наличие галочки справа | Нет |
При работе с ссылочными типами данных, такими как СправочникСсылка или ДокументСсылка, важно учитывать, что пустые ссылки могут вести к ошибкам при попытке получить их представление. Рекомендуется всегда проверять объект на заполненность перед добавлением в список. Это предотвратит появление строк с пустым текстом в интерфейсе пользователя.
Особенности работы с перечислениями
При добавлении элементов перечисления в список значений, свойство Представление заполняется автоматически на основе синонима элемента перечисления, заданного в конфигураторе.
Сортировка и поиск внутри списка
После наполнения списка часто возникает необходимость упорядочить элементы. Для этого в объекте предусмотрен метод СортироватьПоПредставлению. Он позволяет расположить элементы в алфавитном порядке, что значительно упрощает поиск нужного пункта пользователем, особенно если список содержит десятки позиций.
Поиск элементов осуществляется через метод НайтиПоЗначению или НайтиПоПредставлению. Эти методы возвращают индекс найденного элемента или значение Неопределено, если совпадений не найдено. Использование поиска критически важно при обновлении существующих списков, чтобы избежать дублирования записей.
Рассмотрим пример проверки на наличие элемента перед добавлением. Это стандартная практика, обеспечивающая целостность данных в списке. Если элемент с таким значением уже существует, его можно обновить или пропустить, в зависимости от логики работы программы.
Элемент = Список.НайтиПоЗначению(Идентификатор);
Если Элемент = Неопределено Тогда
Список.Добавить(Идентификатор, Описание);
КонецЕсли;
⚠️ Внимание: Методы поиска чувствительны к регистру при работе со строковыми значениями. Если вы ищете строку "Склад", элемент "склад" найден не будет. Учитывайте это при формировании логики сравнения.
Загрузка данных из запроса и табличных частей
В реальных задачах ручной перебор элементов для добавления в список встречается редко. Гораздо чаще данные получаются из базы данных с помощью объекта Запрос. Результат выборки можно напрямую преобразовать в СписокЗначений, используя метод ВыгрузитьКолонку или циклический обход результата.
При загрузке из запроса важно правильно сопоставить колонки результата с параметрами метода Добавить. Обычно одна колонка содержит уникальный ключ (значение), а другая — понятное наименование (представление). Такой подход позволяет динамически формировать списки актуальных контрагентов, номенклатуры или статей затрат.
Аналогичный подход применяется при работе с табличными частями документов. Вы можете собрать список уникальных значений из строк таблицы, чтобы предложить пользователю выбор на основе ранее введенных данных. Это создает связный и логичный интерфейс работы с документом.
☑️ Алгоритм загрузки из запроса
Очистка и удаление элементов
Управление содержимым списка включает не только добавление, но и удаление. Метод Очистить полностью удаляет все элементы, возвращая объект в исходное пустое состояние. Это удобно использовать перед повторным заполнением списка новыми данными, чтобы избежать смешивания старой и новой информации.
Для удаления конкретного элемента используется метод Удалить, который принимает индекс удаляемой строки. При удалении элементов в цикле необходимо быть осторожным с индексацией, так как после удаления элемента индексы последующих строк сдвигаются. Рекомендуется проходить цикл в обратном порядке или использовать специальные конструкции итерации.
Также существует возможность удаления элемента по значению через метод УдалитьПоЗначению. Это более безопасный способ, если вы не знаете точного индекса элемента, но уверены в уникальности его значения внутри списка. Система сама найдет и удалит нужный элемент.
⚠️ Внимание: Интерфейс платформы 1С и методы работы с объектами могут обновляться в новых версиях. Всегда проверяйте актуальность синтаксиса в справочной системе конфигурации, если вы работаете с устаревшими релизами или специфическими отраслевыми решениями.
Правильное управление памятью и очистка списков значений перед повторным использованием предотвращает утечки памяти и логические ошибки в длительных сеансах работы.
Часто задаваемые вопросы (FAQ)
Можно ли добавить в список значений целый объект структуры?
Да, в параметр Значение можно передавать объекты типа Структура или Соответствие. При этом в качестве представления нужно явно указать строку, так как автоматическое преобразование сложных объектов в читаемый текст не предусмотрено.
Как сделать так, чтобы некоторые элементы списка нельзя было выбрать?
Сам объект СписокЗначений не имеет встроенного свойства "Только чтение" для отдельных элементов. Однако вы можете реализовать эту логику на стороне формы, обрабатывая событие изменения поля выбора, или визуально пометить такие элементы (например, серым цветом в расширенном представлении), хотя программно запретить выбор стандартными средствами сложно.
В чем разница между СпискомЗначений и Перечислением?
Перечисление — это метаданные, жестко заданные в конфигураторе и неизменные в ходе работы программы. СписокЗначений — это программный объект, создаваемый динамически, содержимое которого может меняться в зависимости от условий выполнения кода.
Как отсортировать список по числовому значению, а не по тексту?
Стандартный метод СортироватьПоПредставлению работает только со строками. Для сортировки по числовому значению или другому типу данных необходимо выгрузить список в таблицу значений, отсортировать таблицу нужным образом, а затем выгрузить данные обратно в список значений.
Можно ли передать список значений в серверный метод?
Да, объект СписокЗначений является сериализуемым и может быть передан как параметр в серверные процедуры и функции. Это часто используется для передачи параметров отбора или настроек из клиентского приложения на сервер для выполнения запросов.