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

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

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

Постановка задачи и создание базовых объектов

Представим ситуацию: нам необходимо создать справочник Пользователи, в котором, помимо стандартных данных (ФИО, пол, дата рождения), будет отображаться поле «Получает». Это поле должно рассчитываться как произведение индивидуальной «Ставки» пользователя на общую константу «Оклад», заданную для всей системы.

Для начала разберем создание константы. В дереве конфигурации создадим объект Константы с именем Оклад. Тип данных укажем как Число с длиной 15 и точностью 2 знака после запятой. Это позволит нам хранить денежные значения. Далее создадим справочник Пользователи и добавим в него реквизиты: Пол (перечисление), ДатаРождения (Дата), Должность (Строка) и Ставка (Число).

Настройка динамического списка с произвольным запросом

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

Проанализируем шаги по настройке запроса:

  1. Создаем новую форму списка для справочника Пользователи.
  2. Выбираем основной реквизит формы Список (тип ДинамическийСписок).
  3. В свойствах реквизита устанавливаем флаг Произвольный запрос.
  4. Нажимаем «Открыть» в строке настройки запроса и переходим в конструктор.

В тексте запроса нам нужно умножить поле таблицы на параметр. Рассмотрим пример такого запроса:


ВЫБРАТЬ
    СправочникПользователи.Ссылка КАК Ссылка,
    СправочникПользователи.Наименование КАК ФИО,
    СправочникПользователи.Пол КАК Пол,
    СправочникПользователи.ДатаРождения КАК ДатаРождения,
    СправочникПользователи.Должность КАК Должность,
    СправочникПользователи.Ставка КАК Ставка,
    СправочникПользователи.Ставка * &Оклад КАК Получает
ИЗ
    Справочник.Пользователи КАК СправочникПользователи

Здесь &Оклад — это параметр запроса, который мы будем заполнять программно. Использование параметров — это наиболее правильный и производительный метод интеграции значений констант в списки.

Программная установка параметров динамического списка

После того как запрос написан, система «увидит» новое поле Получает, но оно будет пустым или вызовет ошибку, пока мы не передадим в запрос значение параметра. Выясним причину, почему это нужно делать на сервере: обращение к константам требует доступа к базе данных.

Разберем код, который необходимо разместить в модуле формы списка в процедуре ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Получаем текущее значение константы из базы данных
    ЗначениеОклада = Константы.Оклад.Получить();
    
    // Устанавливаем значение параметра в динамический список
    Список.Параметры.УстановитьЗначениеПараметра("Оклад", ЗначениеОклада);
    
КонецПроцедуры

Этот метод гарантирует, что при открытии формы список сразу получит актуальное значение оклада и корректно рассчитает суммы для всех строк.

Разбор ошибок: ТекущаяСтрока и типы данных

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

Важно понимать, что ТекущаяСтрока в динамическом списке — это не текстовая строка, а Ссылка на объект (например, СправочникСсылка.Пользователи). Если вам нужно получить данные текущего пользователя, вы должны работать с ней как со ссылкой или получать данные через Элементы.Список.ТекущиеДанные.

Если же ваша задача — фильтровать один список по выбору в другом (связанные списки), используйте передачу ссылки целиком:


&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
    
    ТекущийПользователь = Элементы.Список.ТекущаяСтрока;
    
    Если ТекущийПользователь <> Неопределено Тогда
        // Пример установки отбора или параметра для другого списка
        // ВторойСписок.Параметры.УстановитьЗначениеПараметра("ПользовательОтбор", ТекущийПользователь);
    КонецЕсли;
    
КонецПроцедуры

Вывод данных в пользовательский интерфейс

Чтобы созданный справочник и расчетная форма стали доступны в режиме «1С:Предприятие», необходимо выполнить два условия:

  1. Включение в командный интерфейс: Справочник должен быть включен в состав хотя бы одной подсистемы, у которой активна галочка «Включать в командный интерфейс».
  2. Назначение основной формы: В окне редактирования объекта «Справочник Пользователи» на закладке «Формы» нужно убедиться, что созданная вами форма выбрана в поле «Основная форма списка». В противном случае система создаст стандартную форму, где не будет вашего расчетного поля.

Оптимизация работы в учебной версии

Поскольку работа ведется в учебной версии, мы должны учитывать ограничения платформы. Использование расчетных полей непосредственно в SQL-запросе (через произвольный запрос динамического списка) — это самый эффективный путь. Вычисления производятся силами СУБД, и на клиент передаются уже готовые цифры. Это позволяет списку работать быстро даже при наличии сотен записей.

Посмотрим на пример того, как НЕ стоит делать: не пытайтесь рассчитывать поле «Получает» в цикле при выводе строки. Это создаст колоссальную нагрузку на систему. Всегда отдавайте предпочтение механизмам системы компоновки данных, на которых базируются современные динамические списки.

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

← На главную