Когда мы работаем с платформой 1С:Предприятие 7.7, часто возникает необходимость интерактивно реагировать на действия пользователя. Одной из таких задач является изменение пометок на элементах списка значений, которое должно немедленно отражаться на других элементах или запускать определенную логику, не дожидаясь нажатия клавиши Enter. Стандартный элемент управления СписокЗначений в 1С 7.7 не предоставляет события, которое срабатывает непосредственно при установке или снятии флажка. Процедуры, привязанные к этому элементу, обычно выполняются только после завершения редактирования элемента, что может быть неудобно для динамических форм. В этой статье мы рассмотрим несколько эффективных обходных путей, которые помогут нам реализовать желаемую интерактивность и заставить форму немедленно реагировать на действия пользователя.
Этот метод является одним из наиболее распространенных способов имитации события изменения элемента в 1С 7.7. Он основывается на механизме пересчета формул на форме, который происходит при любом ее обновлении, включая установку или снятие пометки в элементе СписокЗначений. Рассмотрим подробнее, как мы можем его реализовать, чтобы добиться мгновенной реакции.
Первым шагом нам необходимо добавить на форму отчета новый элемент управления типа "Текст". Этот элемент может быть невидимым для пользователя, то есть он может быть размещен за пределами видимой области формы, иметь нулевые размеры или быть помещен за другим элементом, который его полностью перекрывает. Его основная задача — служить "триггером" для нашей функции, принуждая 1С к ее вызову при обновлении формы.
Для созданного текстового элемента мы открываем его свойства и переходим на вкладку "Дополнительно". Здесь нас интересует поле "Формула". В этом поле мы указываем имя экспортной процедуры, которая будет располагаться в глобальном модуле (или в модуле формы, если она там определена и доступна). Например, мы можем назвать нашу процедуру ОбработатьИзменениеСписка(). Ключевой момент здесь в том, что функция должна быть экспортной (с ключевым словом Export), чтобы быть доступной из формулы. Каждый раз, когда происходит изменение на форме (например, установка галочки в списке), 1С проверяет все элементы с формулами и при необходимости пересчитывает их. Это и приведет к вызову нашей функции.
Это критически важный шаг для корректной работы метода. В редакторе формы, в режиме настройки порядка обхода элементов, нам необходимо убедиться, что наш текстовый элемент с формулой идет после элемента СписокЗначений. Это гарантирует, что к моменту вызова нашей функции в списке значений уже будет зафиксирована новая пометка, и мы сможем корректно ее проанализировать. Если порядок обхода будет неправильным, функция может быть вызвана до того, как изменения в списке будут полностью применены, что приведет к некорректной работе логики или ошибкам.
В глобальном модуле (или модуле отчета) мы создаем процедуру, имя которой мы указали в формуле. Внутри этой процедуры мы получаем контекст формы, чтобы иметь доступ ко всем ее реквизитам, включая наш СписокЗначений. Далее мы можем написать любую логику, которая нам необходима: проверять текущие пометки, изменять пометки других элементов списка, обновлять другие поля формы и т.д. Важно помнить, что функция, указанная в формуле текстового поля, должна возвращать строковое значение. Если нам не нужно отображать никакого текста, мы можем просто вернуть пустую строку.
Рассмотрим пример кода, который демонстрирует, как мы можем анализировать пометки в списке и реагировать на них. Предположим, что наш элемент СписокЗначений на форме называется МойСписок.
// Процедура, вызываемая из формулы на форме
Процедура ОбработатьИзменениеСписка() Экспорт
// Получаем контекст формы, чтобы иметь доступ к ее реквизитам.
// Это стандартный способ получения контекста формы в 1С 7.7,
// позволяющий обращаться к элементам формы по их именам.
Конт = "";
Форма.ПолучитьКонтекст(Конт);
// Проверяем, отмечен ли первый элемент списка.
// Функция Пометка() для СписокЗначений возвращает 1, если элемент помечен,
// и 0, если пометка снята. Номера элементов списка начинаются с 1.
Если Конт.МойСписок.Пометка(1) = 1 Тогда
// Если первый элемент отмечен, мы хотим снять пометки со всех остальных
// элементов списка. Это может быть полезно для реализации выбора "только один".
Для i = 2 По Конт.МойСписок.РазмерСписка() Цикл
// Используем Пометка(номер_элемента, значение_пометки) для изменения состояния.
// 0 - снять пометку, 1 - установить пометку.
Конт.МойСписок.Пометка(i, 0); // Снимаем пометку
КонецЦикла;
Иначе
// Если первый элемент снят, мы можем определить другую логику.
// Например, если снять пометку с первого элемента, то все остальные
// элементы могут быть автоматически помечены или, наоборот, сняты.
// Допустим, мы хотим, чтобы если первый элемент НЕ помечен,
// то и ни один другой не должен быть помечен, чтобы избежать неоднозначности.
Для i = 2 По Конт.МойСписок.РазмерСписка() Цикл
Конт.МойСписок.Пометка(i, 0); // Снимаем пометку
КонецЦикла;
КонецЕсли;
// Функция, вызванная из формулы текстового поля,
// всегда должна вернуть строковое значение.
// Если нам не нужно отображать какой-либо текст, мы просто возвращаем пустую строку.
Возврат "";
КонецПроцедуры
Этот метод, хотя и прост в реализации, основывается на специфичном механизме обновления формы, который не всегда является очевидным. Однако он эффективно решает задачу мгновенной реакции на изменение флажков без использования сложных или внешних компонентов, являясь стандартным обходным путем в 1С 7.7.
Предложенный на форуме подход замены стандартного элемента СписокЗначений на ТаблицуЗначений является более мощным и гибким решением, особенно когда нам требуется расширенное управление поведением "флажков" и других интерактивных элементов. Этот метод требует несколько больше начальной настройки, но в итоге предоставляет нам полный контроль над отображением и обработкой пользовательских действий, что может быть критично для сложных отчетов и форм. Разберем его по шагам.
Вместо элемента СписокЗначений мы создаем на форме элемент управления типа "ТаблицаЗначений". Это позволит нам работать с данными в табличном виде и иметь более детальный контроль над каждой строкой и колонкой, открывая широкие возможности для кастомизации.
Программно мы добавляем в эту таблицу как минимум две колонки:
Значение). Тип этой колонки может быть любым, в зависимости от наших данных (строка, число, дата и т.д.).Пометка). Критически важно, чтобы тип этой колонки был "Число". Мы будем использовать числовые значения (например, 1 или 2) для обозначения состояния флажка, которые будут соответствовать номерам пиктограмм.Для визуализации флажков нам потребуется элемент "Картинка". Мы добавляем этот элемент на форму и загружаем в него два изображения:
Эти изображения будут иметь порядковые номера в элементе "Картинка", начиная с 1. Например, пустой квадратик будет пиктограммой №1, а квадратик с галочкой — пиктограммой №2. Это соответствие мы будем использовать в коде.
ВыводитьПиктограммы():
Для колонки нашей ТаблицыЗначений, которую мы используем для хранения состояния флажка (например, Пометка), мы применяем метод ВыводитьПиктограммы(). Этот метод позволяет указать, что в данной колонке вместо числового значения должны отображаться пиктограммы из указанного элемента "Картинка".
В коде мы будем устанавливать значение этой колонки в 1 (если хотим отобразить пустой квадрат) или 2 (если хотим отобразить квадрат с галочкой). Таким образом, меняя числовое значение в колонке Пометка, мы будем динамически изменять визуальное представление флажка. Это обеспечивает гибкость и наглядность.
Пример программного создания колонок и привязки пиктограмм (обычно это делается при инициализации формы или таблицы, например, в процедуре ПриОткрытии() формы):
// В модуле формы или глобальном модуле при инициализации ТаблицыЗначений
// Предполагаем, что у нас есть элемент "ТаблицаЗначений" с именем МояТаблица
// и элемент "Картинка" с именем ПиктограммыФлажков.
// Важно: в элементе ПиктограммыФлажков:
// Пиктограмма(1) = изображение пустого квадрата
// Пиктограмма(2) = изображение квадрата с галочкой
// Получаем контекст формы для доступа к элементам
Конт = "";
Форма.ПолучитьКонтекст(Конт);
// Добавляем колонки в таблицу значений.
// Если таблица уже была создана в конфигураторе, эти шаги не нужны,
// но важен тип колонки "Пометка" - Число.
Конт.МояТаблица.НоваяКолонка("Пометка", "Число");
Конт.МояТаблица.НоваяКолонка("Значение", "Строка"); // Например, текстовое значение элемента
// Указываем, что колонка "Пометка" должна выводить пиктограммы
// из элемента "ПиктограммыФлажков".
// Значения в колонке (1, 2) будут соответствовать пиктограммам 1 и 2
// из элемента "ПиктограммыФлажков".
Конт.МояТаблица.Колонки.Пометка.ВыводитьПиктограммы("ПиктограммыФлажков");
// Пример заполнения таблицы данными.
// Мы очищаем таблицу, чтобы избежать дублирования при повторном открытии.
Конт.МояТаблица.Очистить();
// Добавляем первую строку: не помечено (пиктограмма №1)
Конт.МояТаблица.НоваяСтрока();
Конт.МояТаблица.Пометка = 1; // Соответствует пиктограмме №1 (пустой квадрат)
Конт.МояТаблица.Значение = "Элемент 1";
// Добавляем вторую строку: помечено (пиктограмма №2)
Конт.МояТаблица.НоваяСтрока();
Конт.МояТаблица.Пометка = 2; // Соответствует пиктограмме №2 (галочка)
Конт.МояТаблица.Значение = "Элемент 2";
// Добавляем третью строку: не помечено
Конт.МояТаблица.НоваяСтрока();
Конт.МояТаблица.Пометка = 1;
Конт.МояТаблица.Значение = "Элемент 3";
Для ТаблицыЗначений в 1С 7.7, как и для СпискаЗначений, нет прямого события "изменение флажка". Однако мы можем обрабатывать событие выбора ячейки или строки. Когда пользователь кликает на ячейку в колонке с "флажком", мы можем перехватить это действие с помощью обработчика ПриАктивизацииЯчейки() (или ПриАктивизацииСтроки()) таблицы.
В этой процедуре мы определяем, по какой строке и колонке был произведен клик. Если это наша колонка "Пометка", мы программно меняем значение в числовой колонке (например, с 1 на 2 или с 2 на 1) и немедленно вызываем процедуру обновления всей таблицы или перерисовки формы, чтобы изменения отобразились. Это обеспечивает мгновенную реакцию.
Важный нюанс: Стандартные средства 1С 7.7 могут не всегда обеспечивать мгновенный перехват клика именно по ячейке для изменения ее значения без дополнительных действий. Часто для полноценной интерактивности с таблицами значений, где требуется изменение данных по клику, используются внешние компоненты, которые предоставляют более богатый набор событий. Без них, возможно, потребуется дополнительное действие пользователя (например, нажатие кнопки "Применить" или активация поля) или мы можем имитировать это через комбинацию событий, что делает решение менее элегантным. Тем не менее, метод с текстовым полем и формулой (Метод 1) может быть использован в связке, чтобы спровоцировать перерисовку формы после изменения значения в таблице.
Пример частичной реализации логики в обработчике ПриАктивизацииЯчейки:
Процедура МояТаблицаПриАктивизацииЯчейки(Контекст, ИмяКолонки)
// Получаем контекст формы
Конт = "";
Форма.ПолучитьКонтекст(Конт);
// Проверяем, что была активизирована наша колонка "Пометка"
Если ИмяКолонки = "Пометка" Тогда
// Получаем текущую строку таблицы.
// Здесь важно понимать, что ТекущаяСтрока будет содержать объект типа "СтрокаТаблицыЗначений".
ТекущаяСтрока = Конт.МояТаблица.ПолучитьСтроку();
Если ТекущаяСтрока <> Неопределено Тогда
// Меняем значение пометки.
// Если было 1 (пустой квадрат), делаем 2 (галочка);
// Если было 2 (галочка), делаем 1 (пустой квадрат).
Если ТекущаяСтрока.Пометка = 1 Тогда
ТекущаяСтрока.Пометка = 2;
ИначеЕсли ТекущаяСтрока.Пометка = 2 Тогда
ТекущаяСтрока.Пометка = 1;
КонецЕсли;
// Теперь, когда мы изменили значение в текущей строке,
// нам необходимо обновить отображение таблицы и, возможно,
// запустить логику, которая меняет пометки других элементов.
// Если у нас есть процедура типа ОбработатьИзменениеСписка() из Метода 1,
// мы можем вызвать ее, чтобы она проанализировала новые пометки в таблице
// и обновила другие элементы формы.
// Важно: для мгновенного визуального обновления может потребоваться
// перерисовка формы или конкретного элемента.
// В 1С 7.7 это часто достигается через Форма.Показать() или
// через вызов функции, связанной с формулой на форме (Метод 1), которая
// принуждает к перерисовке формы после изменения данных.
// Для непосредственного обновления таблицы можно попробовать:
// Конт.МояТаблица.Обновить(); // Не всегда срабатывает моментально в 7.7 без дополнительных действий.
// Поэтому связка с методом формулы или использование FormEx более надежны.
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот метод предоставляет гораздо больше возможностей для кастомизации и управления, чем стандартный СписокЗначений. Мы можем добавлять дополнительные колонки с информацией, кнопки внутри ячеек, изменять стили строк и многое другое, что недоступно в стандартном элементе. Это делает его мощным инструментом для разработки сложных интерактивных форм.
Для решения задач, требующих расширенной интерактивности и более тонкого управления элементами формы, часто прибегают к использованию внешних компонент. Одной из наиболее известных и широко используемых компонент для 1С 7.7 является FormEx. Она значительно расширяет стандартные возможности платформы, предоставляя доступ к дополнительным событиям и методам управления.
FormEx значительно расширяет набор событий, доступных для стандартных элементов управления формы. С ее помощью мы можем "подписываться" на такие события, как клик мышью по элементу СписокЗначений, определить точные координаты клика, узнать, по какой строке или даже по какой части строки был произведен клик. Это позволяет нам реализовать мгновенную и точную реакцию на действия пользователя, что невозможно стандартными средствами платформы 1С 7.7.
С FormEx мы могли бы отловить событие, например, OnCellClick для таблиц или специфичные события для СписокЗначений, которые срабатывают в момент нажатия мышью. В обработчике этого события мы бы получили информацию о выбранной строке и могли бы немедленно изменить пометку, обновить другие элементы или выполнить любую другую логику. Это делает интерфейс гораздо более отзывчивым и удобным для пользователя, так как не требуется никаких дополнительных действий, кроме самого клика.
FormEx мы можем реализовать самые сложные интерактивные сценарии, значительно улучшая пользовательский опыт.Таким образом, если наша задача требует максимальной гибкости, мгновенной реакции и мы готовы к дополнительным административным затратам на развертывание и поддержку, использование FormEx будет предпочтительным выбором. В противном случае, методы с текстовым полем с формулой или заменой на таблицу значений предоставляют жизнеспособные альтернативы без внешних зависимостей, хотя и с определенными ограничениями.
Мы рассмотрели несколько подходов к решению задачи мгновенной реакции на изменение флажков в элементе СписокЗначений на форме отчета в 1С 7.7. Каждый из методов имеет свои особенности, преимущества и недостатки, и выбор конкретного решения зависит от специфики проекта и требований к интерактивности:
СписокЗначений. Мы можем полностью кастомизировать внешний вид и поведение "флажков", добавлять другие интерактивные элементы и реализовывать более сложную логику. Это хороший выбор, когда требуется расширенная табличная функциональность, но стоит учитывать, что стандартные события ТаблицыЗначений в 1С 7.7 могут потребовать дополнительных усилий (возможно, в связке с Методом 1) для обеспечения мгновенной реакции на клик.Выбор конкретного метода будет зависеть от наших требований к интерактивности, сложности требуемой логики, готовности к использованию внешних компонент и общего контекста проекта. Важно тщательно проанализировать каждый вариант и выбрать тот, который наилучшим образом соответствует нашим потребностям, обеспечивая при этом стабильность, производительность и удобство использования нашей системы.
Надеемся, что представленные решения помогут вам эффективно работать с формами в 1С 7.7 и создавать более удобные и отзывчивые пользовательские интерфейсы.