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

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

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

Подготовка реквизитов формы и объявление переменных

Первым шагом в решении задачи является корректная настройка самой формы. В конструкторе форм необходимо добавить новый реквизит и установить его тип в ТаблицаЗначений. Без этого шага любые попытки присвоить данные приведут к ошибке выполнения кода.

Структура колонок таблицы значений должна соответствовать (или быть совместимой) с полями, которые вы планируете выбрать из базы данных. Если в запросе вы выбираете поле "Номенклатура.Наименование", то в таблице значений должна быть колонка с аналогичным или приводимым типом. Несовпадение типов часто вызывает трудности при отладке.

В модуле формы, обычно в процедуре ПриСозданииНаСервере или в обработчике кнопки, необходимо объявить переменные. Вам понадобятся объект Запрос, результат его выполнения ВыборкаЗапроса и сама строка таблицы значений. Использование строгих типов переменных помогает платформе оптимизировать код.

💡

Используйте автозаполнение колонок таблицы значений, нажав кнопку "Авто" в палитре свойств формы, чтобы быстро создать структуру, соответствующую объекту.

Особое внимание стоит уделить именам колонок. Если вы планируете обращаться к ним в коде, лучше использовать латинские имена без пробелов, даже если заголовок колонки для пользователя будет на русском языке. Это упрощает написание кода и снижает риск опечаток.

Формирование запроса и получение выборки

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

Параметры запроса должны быть корректно установлены перед его выполнением. Если выборка зависит от текущего документа или значения в поле формы, убедитесь, что эти параметры переданы. Пустой результат запроса — частая причина, по которой таблица остается незаполненной.

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ

| Номенклатура.Ссылка КАК Номенклатура,

| Номенклатура.Наименование КАК Наименование,

| ОстаткиТоваров.ОстатокКАК Остаток

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваров

| ПО Номенклатура.Ссылка = ОстаткиТоваров.Номенклатура";

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();

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

Оптимизация больших выборок

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

Алгоритм заполнения таблицы значений циклом

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

Внутри цикла Пока Выборка.Следующий() происходит основная магия преобразования данных. Вы обращаетесь к полям выборки по именам, указанным в секции ВЫБРАТЬ запроса, и присваиваете их значениям полей новой строки таблицы.

  • 📌 Создайте новую строку таблицы значений, используя метод ТаблицаЗначений.Добавить().
  • 📌 Присвойте значения полям новой строки из текущей строки выборки запроса.
  • 📌 При необходимости выполните дополнительные вычисления или форматирование данных перед записью.
  • 📌 Убедитесь, что типы данных совместимы, чтобы избежать ошибок приведения типов.

Пример кода выглядит следующим образом: мы создаем переменную НоваяСтрока, добавляем её в коллекцию, а затем заполняем. Этот подход гарантирует, что все строки будут добавлены последовательно и в правильном порядке.

Пока Выборка.Следующий() Цикл

НоваяСтрока = ТаблицаТоваров.Добавить();

НоваяСтрока.Номенклатура = Выборка.Номенклатура;

НоваяСтрока.Наименование = Выборка.Наименование;

НоваяСтрока.Остаток = Выборка.Остаток;

КонецЦикла;

💡

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

Прямое копирование данных и работа с ВыгрузкойРезультата

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

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

Метод Скорость Гибкость Требования
Цикл с добавлением Средняя Высокая Минимальные
Прямая выгрузка Высокая Низкая Полное совпадение структуры
Загрузка из JSON/XML Низкая Средняя Предварительная сериализация
Построчное чтение Низкая Высокая Сложная логика валидации

Если имена колонок в запросе и в форме отличаются, прямое присваивание не сработает корректно. В таком случае придется либо переименовать поля в запросе с помощью оператора КАК, либо вернуться к циклическому методу заполнения.

📊 Какой метод заполнения вы используете чаще?
Цикл с добавлением
Прямая выгрузка
Загрузка из внешней таблицы
Использую готовые обработки

Настройка свойств таблицы и взаимодействие с пользователем

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

Если таблица предназначена только для отображения результатов запроса, имеет смысл запретить редактирование. Однако, если пользователь должен иметь возможность скорректировать количество или выбрать конкретные позиции, следует настроить соответствующие колонки как редактируемые.

⚠️ Внимание: Изменение данных в таблице значений формы не сохраняет их автоматически в базу данных. Вам необходимо написать отдельный обработчик события (например, кнопки "Записать" или "Провести"), который перенесет данные из таблицы значений в регистры или табличную часть документа.

Для улучшения восприятия информации можно использовать условное оформление. Например, выделять строки с нулевым остатком красным цветом или подсвечивать выбранные позиции. Это делается через настройки условного оформления в конструкторе форм или программно.

Также полезно настроить сортировку по умолчанию. Если данные получены из запроса без явного указания порядка (УПОРЯДОЧИТЬ ПО), они могут отображаться в произвольном порядке. Явная сортировка улучшает пользовательский опыт.

Обработка событий и обновление данных

Часто требуется обновлять таблицу значений динамически, например, при изменении периода отчета или контрагента в шапке формы. Для этого логику заполнения запросом выносят в отдельную процедуру, которая вызывается по событию ПриИзменении соответствующего реквизита.

Перед повторным заполнением таблицу значений необходимо очищать, иначе новые данные добавятся к старым, создав дубликаты. Для этого используется метод ТаблицаЗначений.Очистить(). Без этой простой операции интерфейс быстро превратится в хаос.

☑️ Алгоритм динамического обновления

Выполнено: 0 / 5

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

Как очистить таблицу значений перед новым заполнением?

Для очистки используется метод Очистить() объекта таблицы значений. Пример: ЭлементыФормы.ТаблицаТоваров.Значение.Очистить();. Это удаляет все строки, но сохраняет структуру колонок.

Можно ли заполнять таблицу значений на клиенте?

Да, если данные уже находятся в памяти клиента (например, выгружены ранее). Однако выполнение запроса к базе данных возможно только на сервере. Поэтому стандартная схема: запрос на сервере -> выгрузка -> передача на клиент -> отображение.

Что делать, если запрос возвращает слишком много строк?

Если строк тысячи, интерфейс может "подвиснуть". Рекомендуется использовать постраничную выводку (виртуальные таблицы) или ограничивать выборку в запросе (например, "ТОПО 100" или по конкретному периоду), а также отключать автоматическое обновление оформления во время загрузки.

Как передать таблицу значений в печатную форму?

Таблицу значений можно напрямую передать в макет табличного документа. Используйте метод Заполнить() области макета, передав туда объект таблицы значений, и колонки заполнятся автоматически.

Почему данные не видны в таблице после выполнения кода?

Проверьте, что вы записываете данные в правильный объект. Если вы работаете с формой, убедитесь, что изменили значение реквизита формы (Объект.Таблица или Элементы.Таблица.Значение), а не локальной переменной, которая исчезнет после завершения процедуры.