Как программно изменить названия кнопок на форме в 1С на основании данных из регистра сведений

Программист 1С v8.3 (Обычные формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

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

Постановка задачи и проектирование структуры данных

Представим ситуацию: на форме обработки РМК расположена сетка из кнопок. Нам необходимо, чтобы при открытии формы или при переключении группы товаров названия этих кнопок (их заголовки) автоматически подтягивались из регистра сведений БыстрыйВыбор. Для реализации этой задачи нам потребуется подготовить структуру данных. В регистре должны быть как минимум два важных измерения или ресурса:

  1. Номенклатура — товар, который будет выбран при нажатии.
  2. ПорядковыйНомер (или ИмяКнопки) — идентификатор, по которому мы поймем, к какому именно элементу на форме относится данная запись.

Рассмотрим важный нюанс: если мы используем числовой порядок (1, 2, 3...), имена кнопок в конфигураторе должны быть заданы соответствующим образом, например, Кнопка1, Кнопка2 и так далее. Помните, что имя элемента управления не может начинаться с цифры, поэтому использование префикса обязательно.

Подготовка запроса для получения данных

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

Проанализируем пример запроса, который собирает данные для заполнения кнопок:


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|    БыстВыбор.ПорНомер КАК ПорНомер,
|    БыстВыбор.Номенклатура.Наименование КАК Наименование,
|    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
|    БыстВыбор.Номенклатура.ОсновнаяЕдиница.Наименование КАК ЕдИзм
|ИЗ
|    РегистрСведений.БыстВыбор КАК БыстВыбор
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
|        ПО БыстВыбор.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
|ГДЕ
|    БыстВыбор.ПорНомер < 50";

Запрос.УстановитьПараметр("Период", ТекущаяДата());
Запрос.УстановитьПараметр("ТипЦен", Справочники.ТипыЦен.НайтиПоНаименованию("Розница"));

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

Использование ЛЕВОЕ СОЕДИНЕНИЕ гарантирует, что кнопка будет подписана даже в том случае, если для товара по какой-то причине не установлена цена в регистре сведений.

Алгоритм программного изменения заголовков

После получения данных нам необходимо перебрать выборку и обратиться к элементам формы. В обычных формах (v8.1, v8.2 и v8.3 в режиме совместимости) доступ к визуальным элементам осуществляется через коллекцию ЭлементыФормы. Рассмотрим пошагово, как установить заголовки.

Основная проблема, с которой сталкиваются разработчики — ошибка Поле объекта не обнаружено (Заголовок). Она возникает в двух случаях:

  1. Вы пытаетесь обратиться к элементу, которого не существует (ошибка в имени).
  2. Вы обращаетесь к элементу по индексу, который является числом, в то время как ожидается строка (имя кнопки).

Для корректного обращения мы будем формировать имя кнопки динамически. Допустим, в конфигураторе кнопки названы Кн1, Кн2 и т.д. Тогда код будет выглядеть следующим образом:


Пока Выборка.Следующий() Цикл
    // Формируем имя кнопки на основании порядкового номера из регистра
    ИмяКнопки = "Кн" + СокрЛП(Выборка.ПорНомер);
    
    // Проверяем, существует ли такой элемент на форме, чтобы избежать падения системы
    Элемент = ЭлементыФормы.Найти(ИмяКнопки);
    
    Если Элемент <> Неопределено Тогда
        // Формируем красивый заголовок: Наименование + Цена
        НовыйЗаголовок = Выборка.Наименование + Символы.ПС + Формат(Выборка.Цена, "ЧЦ=10; ЧДЦ=2") + " руб.";
        Элемент.Заголовок = НовыйЗаголовок;
    КонецЕсли;
КонецЦикла;

Обратите внимание на использование Символы.ПС (перенос строки). Это позволяет сделать интерфейс РМК более читаемым, размещая название товара и его цену друг под другом на одной кнопке.

Отладка и поиск неисправностей

Если код отрабатывает, но заголовки не меняются, или программа выдает ошибку, воспользуемся советами опытных разработчиков по отладке:

Альтернативный подход: динамическое создание кнопок

Если количество товаров в быстром выборе постоянно меняется, рисовать 50 кнопок в конфигураторе — не самое лучшее решение. Рассмотрим вариант, при котором кнопки создаются полностью программно в момент открытия формы. Это позволяет гибко настраивать интерфейс под любое разрешение экрана.

Для этого используется метод ЭлементыФормы.Добавить(). Разберем пример создания одной кнопки:


НоваяКнопка = ЭлементыФормы.Добавить(Тип("Кнопка"), "ДинамическаяКнопка_1", Истина);
НоваяКнопка.Верх = 10;
НоваяКнопка.Лево = 10;
НоваяКнопка.Ширина = 150;
НоваяКнопка.Высота = 50;
НоваяКнопка.Заголовок = "Товар из регистра";
// Назначаем обработчик нажатия
НоваяКнопка.УстановитьДействие("Нажатие", Новый Действие("КоманднаяПанельКнопкаНажатие"));

При таком подходе мы можем рассчитать координаты каждой кнопки в цикле, создавая аккуратную "сетку" (матрицу) элементов. Это высший пилотаж в разработке РМК, который делает решение универсальным для любых торговых точек.

Заключение

Мы проанализировали механизм связи данных регистра сведений и визуальных элементов формы. Главный секрет успеха заключается в правильном именовании элементов и аккуратной работе с коллекцией ЭлементыФормы. Программное управление интерфейсом не только упрощает жизнь пользователю, но и значительно снижает нагрузку на программиста при необходимости внесения изменений в ассортимент "горячих" товаров.

Важный совет: всегда проверяйте наличие элемента через метод Найти() перед обращением к его свойствам. Это убережет вашу программу от критических ошибок при случайном удалении кнопки в конфигураторе.

← На главную