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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Основные принципы работы с данными

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

Реализация заполнения табличной части

Рассмотрим алгоритм действий, который позволит нам корректно загрузить данные:

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

Посмотрим на пример реализации такого кода:


&НаКлиенте
Процедура ЗаполнитьТаблицу(Команда)
    // Очищаем текущие данные перед заполнением
    Объект.НужнаяТабличнаяЧасть.Очистить();
    
    // Вызываем серверную логику
    ЗаполнитьТЧНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТЧНаСервере()
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Контрагент", Объект.Контрагент);
    
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Регистр.Поле1 КАК Поле1,
        |   Регистр.Поле2 КАК Поле2
        |ИЗ
        |   РегистрСведений.НужныйРегистр КАК Регистр
        |ГДЕ
        |   Регистр.Контрагент = &Контрагент";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    Если Не РезультатЗапроса.Пустой() Тогда
        ТЗ = РезультатЗапроса.Выгрузить();
        Для Каждого СтрокаТЗ Из ТЗ Цикл
            НоваяСтрока = Объект.НужнаяТабличнаяЧасть.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЗ);
        КонецЦикла;
    Иначе
        Сообщить("Данные по выбранному контрагенту не найдены.");
    КонецЕсли;
КонецПроцедуры

Работа с периодами в запросе

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


Запрос.Текст = 
    "ВЫБРАТЬ
    |   Регистр.Поле1 КАК Поле1,
    |   Регистр.Поле2 КАК Поле2
    |ИЗ
    |   РегистрСведений.НужныйРегистр КАК Регистр
    |ГДЕ
    |   Регистр.Контрагент = &Контрагент
    |   И Регистр.Период МЕЖДУ &НачалоПериода И &КонецПериода";

Не забывайте устанавливать параметры &НачалоПериода и &КонецПериода перед выполнением запроса, используя метод УстановитьПараметр().

Рекомендации и советы

Для ускорения написания кода всегда используйте Конструктор запросов (вызывается через правую кнопку мыши в редакторе модулей). Он помогает безошибочно выбрать нужные поля и построить условия. Метод ЗаполнитьЗначенияСвойств() — это мощный инструмент, который автоматически переносит данные из найденных строк в строки табличной части, если имена колонок совпадают. Это значительно сокращает объем ручного кода и уменьшает вероятность опечаток.

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

← На главную