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

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

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

Почему ТаблицаЗначений, а не ДинамическийСписок?

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

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

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

Мы разберем процесс создания и настройки редактируемой таблицы на управляемой форме 1С 8.3 по шагам. Это позволит вам последовательно применить полученные знания в своих разработках и добиться желаемого результата.

  1. Создание реквизита формы типа "ТаблицаЗначений"

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

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

    Важно: этот реквизит будет доступен как на клиенте, так и на сервере, что дает нам полную свободу в работе с данными.

  2. Добавление элемента формы типа "Таблица"

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

    Перейдите на вкладку "Элементы" формы. Добавьте новый элемент формы. В списке доступных типов элементов выберите Таблица. Это визуальный компонент, который будет отображать данные нашего реквизита.

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

  3. Определение колонок таблицы на форме

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

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

    • Задайте ей осмысленное имя (например, Колонка1, Колонка2, Статус).
    • Укажите "Путь к данным". Этот путь должен точно соответствовать имени колонки в самой ТаблицеЗначений, которую мы будем заполнять программно. Например, если в ТЗ у нас есть колонка "НаименованиеТовара", то и путь к данным для колонки на форме должен быть "НаименованиеТовара". Это критически важно для корректного отображения данных.
    • Установите подходящий "Тип значения" (Строка, Число, Булево, Дата, СправочникСсылка.Номенклатура и т.д.). Выбор правильного типа позволит платформе корректно отображать и редактировать данные.
    • Особое внимание уделите свойству "Только просмотр". Если вы хотите, чтобы ячейки этой колонки были редактируемыми пользователем, убедитесь, что эта галка снята. По умолчанию, некоторые типы колонок или таблиц могут быть установлены в режим "Только просмотр", что заблокирует возможность редактирования. Необходимо проверить это свойство как для каждой колонки, так и для самого элемента формы Таблица.

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

Программное заполнение ТаблицыЗначений

Мы уже создали каркас таблицы на форме, теперь необходимо заполнить нашу ТаблицуЗначений данными. Это обычно делается программно на сервере при создании формы (например, в обработчике ПриСозданииНаСервере) или при выполнении какого-либо действия пользователя (например, при нажатии кнопки "Заполнить").

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


&НаКлиенте
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Инициализируем реквизит формы типа ТаблицаЗначений
    МояДинамическаяТаблица = Новый ТаблицаЗначений;

    // Определяем колонки ТаблицыЗначений
    // Важно: имена колонок здесь должны точно совпадать с "Путь к данным"
    // для соответствующих колонок в элементе формы типа "Таблица"!
    МояДинамическаяТаблица.Колонки.Добавить("Колонка1", Новый ОписаниеТипов("Строка", , , , "ДлинаСтроки = 50"));
    МояДинамическаяТаблица.Колонки.Добавить("Колонка2", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 2)));
    МояДинамическаяТаблица.Колонки.Добавить("Колонка3", Новый ОписаниеТипов("Булево"));
    МояДинамическаяТаблица.Колонки.Добавить("КолонкаСДатой", Новый ОписаниеТипов("Дата", Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)));

    // Заполняем ТаблицуЗначений произвольными данными для демонстрации
    Для Инд = 1 По 7 Цикл
        НоваяСтрока = МояДинамическаяТаблица.Добавить();
        НоваяСтрока.Колонка1 = "Значение " + Инд;
        НоваяСтрока.Колонка2 = Инд * 10.5;
        НоваяСтрока.Колонка3 = (Инд % 2 = 0);
        НоваяСтрока.КолонкаСДатой = ТекущаяДата() + (Инд * 86400); // Добавляем дни
    КонецЦикла;

    // Добавим еще одну строку, чтобы показать работу с пустыми значениями
    НоваяСтрока = МояДинамическаяТаблица.Добавить();
    НоваяСтрока.Колонка1 = "Пустая строка";
    НоваяСтрока.Колонка2 = 0;
    НоваяСтрока.Колонка3 = Ложь;
    // КолонкаСДатой останется не заполненной
КонецПроцедуры

В этом примере мы выполняем следующие действия:

После выполнения этого кода при открытии формы вы увидите заполненную таблицу со всеми настроенными колонками и данными.

Обработка события "ПриИзменении" для ячеек таблицы

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

Для каждой колонки, для которой требуется отслеживать изменения, выполните следующие действия в конфигураторе:

  1. Выберите соответствующую колонку в дереве элементов формы (разверните элемент Таблица, найдите нужную колонку).
  2. Перейдите в ее свойства.
  3. В группе событий найдите событие "ПриИзменении".
  4. Нажмите кнопку с лупой (или дважды кликните по полю) для создания обработчика события. Система предложит создать клиентскую процедуру в модуле формы.

Созданный обработчик будет иметь примерно такой вид (рассмотрим пример для колонки Колонка1 и Колонка2):


&НаКлиенте
Процедура МояДинамическаяТаблицаКолонка1ПриИзменении(Элемент)
    // В параметре "Элемент" мы получаем ссылку на элемент формы - колонку,
    // в которой произошло изменение.
    // Чтобы получить доступ к данным текущей строки, используем Элемент.ТекущиеДанные.
    // Элемент.ТекущиеДанные представляет собой объект типа "СтрокаТаблицыЗначений",
    // который связан с текущей строкой в реквизите МояДинамическаяТаблица.

    Сообщить("Изменена Колонка1 в строке № " + (Элемент.ТекущиеДанные.НомерСтроки + 1)); // НомерСтроки начинается с 0
    Сообщить("Новое значение Колонка1: " + Элемент.ТекущиеДанные.Колонка1);

    // Здесь мы можем выполнить любую логику, например, пересчет значений в других колонках
    // той же строки или других строках.
    // Например, если Колонка2 зависит от Колонка1:
    // Попытка
    //     ДлинаСтроки = СтрДлина(Элемент.ТекущиеДанные.Колонка1);
    //     Элемент.ТекущиеДанные.Колонка2 = ДлинаСтроки;
    //     Сообщить("Колонка2 теперь: " + Элемент.ТекущиеДанные.Колонка2);
    // Исключение
    //     Сообщить("Ошибка при пересчете Колонка2: " + ОписаниеОшибки());
    // КонецПопытки;

    // Чтобы получить всю ТаблицуЗначений, к которой относится строка:
    // ВсяТаблица = Элемент.Родитель.Значение; // Элемент.Родитель - это элемент формы Таблица
КонецПроцедуры

&НаКлиенте
Процедура МояДинамическаяТаблицаКолонка2ПриИзменении(Элемент)
    Сообщить("Изменена Колонка2 в строке № " + (Элемент.ТекущиеДанные.НомерСтроки + 1));
    Сообщить("Новое значение Колонка2: " + Элемент.ТекущиеДанные.Колонка2);

    // Пример условной логики: если значение стало больше 100, меняем Колонка3
    Если Элемент.ТекущиеДанные.Колонка2 > 100 Тогда
        Элемент.ТекущиеДанные.Колонка3 = Истина;
        Сообщить("Колонка3 для этой строки установлена в Истина.");
    Иначе
        Элемент.ТекущиеДанные.Колонка3 = Ложь;
        Сообщить("Колонка3 для этой строки установлена в Ложь.");
    КонецЕсли;
КонецПроцедуры

Аналогичные обработчики можно создать для каждой колонки, требующей реакции на изменение. Важно помнить, что Элемент.ТекущиеДанные предоставляет доступ к текущей строке ТаблицыЗначений, с которой связан элемент формы. Таким образом, вы можете напрямую работать с измененным значением и значениями других колонок в той же строке, а также выполнять любые проверки или пересчеты. Если вам потребуется доступ ко всей ТаблицеЗначений, к которой принадлежит текущая строка, вы можете получить ее через Элемент.Родитель.Значение.

Важные нюансы и дополнительные возможности

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

  1. Свойство "Только просмотр"

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

    Иногда разработчики забывают снять галку с элемента формы "Таблица" в целом, даже если колонки настроены как редактируемые. Убедитесь, что вы проверили оба уровня настроек.

  2. Продвинутые сценарии и альтернативы

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

    Например:

    • ДинамическийСписок: Если данные можно представить запросом к базе данных (даже если это временная таблица или сложный запрос), ДинамическийСписок предоставит гораздо больше встроенных возможностей по работе с данными. Он оптимизирован для больших объемов и поддерживает серверные запросы.
    • ПолеHTMLДокумента с таблицей на JavaScript: Это очень специфическое и сложное решение, требующее значительных трудозатрат на разработку. Оно может быть оправдано только в крайне редких случаях, когда стандартные средства 1С не дают необходимой интерактивности или визуализации (например, интерактивные диаграммы в таблице или очень сложные пользовательские элементы управления). Однако это значительно усложняет поддержку и разработку.

    Для большинства же задач, связанных с отображением и редактированием произвольных "быстрых" данных, не привязанных к объектам БД, решение с ТаблицейЗначений через реквизит формы является наиболее эффективным, простым в реализации и поддержке.

  3. Проверка введенных данных

    Помимо события ПриИзменении для колонки, вы также можете использовать событие ПриОкончанииРедактирования для всей таблицы на форме. Это событие срабатывает, когда пользователь закончил редактирование ячейки (например, нажал Enter или перешел к другой ячейке), но до того, как фокус окончательно покинул эту ячейку.

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

    Пример обработчика ПриОкончанииРедактирования:

    
    &НаКлиенте
    Процедура МояДинамическаяТаблицаПриОкончанииРедактирования(Элемент, НоваяСтрока, ИмяКолонки, Отказ)
        // Элемент - это сам элемент формы Таблица
        // НоваяСтрока - строка ТаблицыЗначений, которая была изменена
        // ИмяКолонки - имя колонки, в которой произошло изменение
        // Отказ (Булево) - установите Истина, чтобы отменить окончание редактирования
        // и оставить фокус в текущей ячейке (например, при ошибке ввода)
    
        Если ИмяКолонки = "Колонка2" И НоваяСтрока.Колонка2 < 0 Тогда
            Сообщить("Значение в Колонке2 не может быть отрицательным!");
            Отказ = Истина; // Отменяем окончание редактирования, оставляем курсор в ячейке
        КонецЕсли;
    КонецПроцедуры
    
  4. Добавление и удаление строк

    Для добавления и удаления строк из ТаблицыЗначений на форме мы можем использовать стандартные методы объекта ТаблицаЗначений. Обычно эти действия привязываются к кнопкам на форме.

    
    &НаКлиенте
    Процедура ДобавитьСтроку(Команда)
        // Получаем ТаблицуЗначений из реквизита формы
        ТекущаяТаблица = МояДинамическаяТаблица;
        НоваяСтрока = ТекущаяТаблица.Добавить();
        // Можно сразу задать значения по умолчанию для новой строки
        НоваяСтрока.Колонка1 = "Новая запись";
        НоваяСтрока.Колонка2 = 0;
        НоваяСтрока.Колонка3 = Ложь;
    
        // Чтобы новая строка сразу отобразилась и на нее установился фокус
        Элементы.МояДинамическаяТаблица.ТекущаяСтрока = НоваяСтрока;
    КонецПроцедуры
    
    &НаКлиенте
    Процедура УдалитьВыделенныеСтроки(Команда)
        Если Элементы.МояДинамическаяТаблица.ТекущиеДанные <> Неопределено Тогда
            // Получаем ТаблицуЗначений из реквизита формы
            ТекущаяТаблица = МояДинамическаяТаблица;
            // Получаем текущую строку, которую хотим удалить
            СтрокаДляУдаления = Элементы.МояДинамическаяТаблица.ТекущиеДанные;
            ТекущаяТаблица.Удалить(СтрокаДляУдаления);
        Иначе
            Сообщить("Выберите строку для удаления.", СтатусСообщения.Внимание);
        КонецЕсли;
    КонецПроцедуры
    
  5. Сброс или очистка таблицы

    Если вам потребуется полностью очистить ТаблицуЗначений на форме, это можно сделать несколькими способами:

    • Вызвать метод Очистить() у существующего объекта ТаблицаЗначений.
    • Присвоить реквизиту формы новый пустой объект ТаблицаЗначений.
    
    &НаКлиенте
    Процедура ОчиститьТаблицу(Команда)
        // Вариант 1: Очистить существующий объект
        МояДинамическаяТаблица.Очистить();
        Сообщить("Таблица очищена (вариант 1).");
    
        // Вариант 2: Присвоить новый пустой объект
        // МояДинамическаяТаблица = Новый ТаблицаЗначений;
        // Сообщить("Таблица очищена (вариант 2).");
    КонецПроцедуры
    

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

Заключение

Вывод и редактирование ТаблицыЗначений на управляемой форме 1С 8.3 — это стандартная и достаточно простая задача, если следовать описанному алгоритму. Мы подробно рассмотрели основные шаги: создание реквизита формы, привязку элемента формы Таблица, настройку колонок, программное заполнение и, что особенно ценно, реализацию обработчиков события ПриИзменении для интерактивной работы с данными.

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

← На главную