Разработка интерфейсов в среде 1С:Предприятие 7.7 часто ставит перед программистами сложные задачи, особенно когда речь идет о нестандартных сценариях использования. Например, при адаптации конфигурации под сенсорные экраны (тачскрины), терминалы сбора данных (ТСД) или планшеты возникает необходимость динамически изменять размеры окон (сворачивать формы до размеров одной управляющей кнопки) или перехватывать клики по ячейкам табличной части для вызова виртуальной клавиатуры. В этой статье мы подробно разберем, как решить эти проблемы с помощью популярной внешней компоненты FormEx.
При попытке уменьшить форму стандартным методом Окна.РазмерОкна() разработчики часто сталкиваются с тем, что окно «залипает» и отказывается сжиматься меньше определенных размеров. Выясним причину этого поведения.
Движок платформы 1С 7.7 накладывает жесткие ограничения на минимальный размер окна формы. Он не позволяет сделать окно меньше, чем координаты самого нижнего и самого правого элементов диалога (кнопок, надписей, табличной части), заданных в Конфигураторе. Платформа защищает интерфейс от «обрезания» элементов управления. Даже если мы программно вызываем метод сжатия окна до $10 \times 10$ пикселей, форма сожмется только до границ крайних кнопок или табличной части.
Чтобы обойти это ограничение и получить возможность сворачивать окно до абсолютно любых размеров (например, до размеров одной кнопки «Развернуть» в левом верхнем углу), нам необходимо временно «сдвинуть» или скрыть все мешающие элементы управления. Рассмотрим, как это сделать по шагам с помощью объекта АтрибутФормы из библиотеки FormEx.
Проанализируем алгоритм свертывания формы:
МногострочнаяЧасть) и временно переносим его координаты в левый верхний угол (координаты 0, 0) либо делаем его невидимым.Окна для уменьшения размеров формы до нужных нам габаритов.Посмотрим на практический пример реализации процедуры свертывания окна формы:
Процедура кнСвернуть()
// Создаем объект для управления координатами и свойствами элементов диалога
АтрФ = СоздатьОбъект("АтрибутФормы");
// Захватываем табличную часть (многострочную часть) документа/справочника
АтрФ.УстановитьАтрибут(Форма, "МногострочнаяЧасть");
// Временно сдвигаем ее в левый верхний угол и сжимаем до минимального размера
АтрФ.УстановитьКоординаты(0, 0, 1, 1);
// Скрываем другие мешающие элементы диалога, если это необходимо
Форма.КнопкаЗаписать.Видимость(0);
Форма.КнопкаПровести.Видимость(0);
// Теперь программно уменьшаем само окно формы до размеров кнопки свертывания
Окна = СоздатьОбъект("Окна");
Окна.РазмерОкна(Форма, 120, 50);
// Делаем видимой кнопку «Развернуть», которая останется на крошечном окне
Форма.кнРазвернуть.Видимость(1);
КонецПроцедуры
Для восстановления исходного состояния формы нам потребуется обратная процедура, которая вернет координаты табличной части и сделает видимыми скрытые элементы управления:
Процедура кнРазвернуть()
// Возвращаем исходные размеры окну формы
Окна = СоздатьОбъект("Окна");
Окна.РазмерОкна(Форма, 800, 600); // Укажите ваши стандартные размеры формы
// Восстанавливаем координаты табличной части
АтрФ = СоздатьОбъект("АтрибутФормы");
АтрФ.УстановитьАтрибут(Форма, "МногострочнаяЧасть");
АтрФ.УстановитьКоординаты(10, 80, 780, 500); // Исходные координаты элемента
// Возвращаем видимость кнопкам
Форма.КнопкаЗаписать.Видимость(1);
Форма.КнопкаПровести.Видимость(1);
// Скрываем кнопку развертывания
Форма.кнРазвернуть.Видимость(0);
КонецПроцедуры
Важное замечание: Чтобы избежать ручного прописывания координат для каждого элемента при изменении размеров окна, рекомендуется использовать встроенный в FormEx механизм автоматических привязок (класс Привязки или Anchor). Он позволяет зафиксировать поведение элементов при масштабировании формы.
Другая частая задача — определение того, какая именно ячейка табличной части была активирована пользователем (например, двойным кликом мыши). Штатное событие ПриНачалеРедактированияСтроки() сообщает системе только о том, что была активирована строка целиком, но не указывает конкретную колонку.
Для решения этой задачи мы можем использовать предопределенный метод контекста формы ТекущаяКолонка() или АктивныйЭлемент() непосредственно внутри процедуры начала редактирования строки. Разберем этот механизм подробнее.
Критически важное условие: Для того чтобы методы ТекущаяКолонка() или АктивныйЭлемент() корректно возвращали название колонки табличной части, у этой колонки в Конфигураторе обязательно должен быть заполнен Идентификатор в свойствах колонки многострочной части. Если идентификатор пуст, система вернет пустое значение.
Рассмотрим пример кода, который определяет, по какому именно реквизиту строки кликнул пользователь, и выводит соответствующее диалоговое окно (например, для ввода веса или количества товара):
Процедура ПриНачалеРедактированияСтроки()
// Получаем идентификатор активной колонки табличной части
ИмяАктивнойКолонки = Форма.ТекущаяКолонка();
Если ИмяАктивнойКолонки = "Брутто" Тогда
// Отменяем стандартное текстовое редактирование ячейки в ТЧ
СтатусВозврата(0);
// Вызываем собственное модальное окно (например, виртуальную клавиатуру)
ЗначениеВвода = 0;
Если ОткрытьФормуМодально("Обработка.ВводЧисла", ЗначениеВвода) = 1 Тогда
// Записываем полученное значение в реквизит текущей строки ТЧ
Брутто = ЗначениеВвода;
КонецЕсли;
ИначеЕсли ИмяАктивнойКолонки = "Количество" Тогда
СтатусВозврата(0);
ЗначениеВвода = 0;
Если ОткрытьФормуМодально("Обработка.ВводЧисла", ЗначениеВвода) = 1 Тогда
Количество = ЗначениеВвода;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Если нам нужно полностью исключить стандартный ввод текста с клавиатуры в определенные ячейки и открывать форму ввода сразу по двойному клику мыши (или по нажатию Enter), мы можем настроить колонку как «выбираемую».
Для этого выполним следующие шаги:
Форма.ИмяКолонки.Редактирование(0)). Это заблокирует прямой ввод текста и превратит ячейку в поле выбора.ПриНачалеВыбораЗначения().Проанализируем пример кода для этого сценария:
Процедура ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандОбр)
// Проверяем, что выбор инициирован в нужной нам колонке табличной части
Если ИдентЭлемДиалога = "Нетто" Тогда
// Отключаем стандартный диалог выбора 1С
ФлагСтандОбр = 0;
// Открываем модальную форму для расчета веса нетто
ТекущееНетто = Нетто;
Если ОткрытьФормуМодально("Обработка.КалькуляторВеса", ТекущееНетто) = 1 Тогда
// Присваиваем результат расчета реквизиту табличной части
Нетто = ТекущееНетто;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот способ является наиболее стабильным и красивым для разработки интерфейсов под тачскрины. Он полностью исключает появление стандартного курсора ввода и системных клавиатур операционной системы Windows, заменяя их на ваши кастомизированные крупные экранные кнопки.
В тех случаях, когда возможностей стандартной табличной части 1С 7.7 категорически не хватает для реализации сложного интерактивного дизайна, отличным решением станет использование внешней компоненты Йоксель (Yoksel).
Она позволяет внедрять полноценные электронные таблицы прямо на форму 1С как элемент управления. С помощью Йокселя мы можем гибко отслеживать любые события мыши: клики по ячейкам, наведение курсора, выделение областей. При этом ячейки могут содержать сложные элементы оформления, картинки, крупные кнопки и шрифты любого размера, что делает его незаменимым инструментом автоматизации рабочих мест кладовщиков и операторов производства.