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

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Проблема программного изменения размера окна и ее решение

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

Движок платформы 1С 7.7 накладывает жесткие ограничения на минимальный размер окна формы. Он не позволяет сделать окно меньше, чем координаты самого нижнего и самого правого элементов диалога (кнопок, надписей, табличной части), заданных в Конфигураторе. Платформа защищает интерфейс от «обрезания» элементов управления. Даже если мы программно вызываем метод сжатия окна до $10 \times 10$ пикселей, форма сожмется только до границ крайних кнопок или табличной части.

Чтобы обойти это ограничение и получить возможность сворачивать окно до абсолютно любых размеров (например, до размеров одной кнопки «Развернуть» в левом верхнем углу), нам необходимо временно «сдвинуть» или скрыть все мешающие элементы управления. Рассмотрим, как это сделать по шагам с помощью объекта АтрибутФормы из библиотеки FormEx.

Проанализируем алгоритм свертывания формы:

  1. Создаем объект управления атрибутами формы.
  2. Находим самый крупный или крайний элемент (например, МногострочнаяЧасть) и временно переносим его координаты в левый верхний угол (координаты 0, 0) либо делаем его невидимым.
  3. Используем объект Окна для уменьшения размеров формы до нужных нам габаритов.
  4. При обратном разворачивании восстанавливаем исходные координаты элементов и размеры окна.

Посмотрим на практический пример реализации процедуры свертывания окна формы:


Процедура кнСвернуть()
    // Создаем объект для управления координатами и свойствами элементов диалога
    АтрФ = СоздатьОбъект("АтрибутФормы");
    
    // Захватываем табличную часть (многострочную часть) документа/справочника
    АтрФ.УстановитьАтрибут(Форма, "МногострочнаяЧасть");
    
    // Временно сдвигаем ее в левый верхний угол и сжимаем до минимального размера
    АтрФ.УстановитьКоординаты(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), мы можем настроить колонку как «выбираемую».

Для этого выполним следующие шаги:

  1. В свойствах колонки табличной части в Конфигураторе установим флаг «Кнопка выбора» (в коде это можно регулировать методом Форма.ИмяКолонки.Редактирование(0)). Это заблокирует прямой ввод текста и превратит ячейку в поле выбора.
  2. В модуле формы перехватим стандартное событие предопределенной процедуры ПриНачалеВыбораЗначения().

Проанализируем пример кода для этого сценария:


Процедура ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандОбр)
    // Проверяем, что выбор инициирован в нужной нам колонке табличной части
    Если ИдентЭлемДиалога = "Нетто" Тогда
        // Отключаем стандартный диалог выбора 1С
        ФлагСтандОбр = 0;
        
        // Открываем модальную форму для расчета веса нетто
        ТекущееНетто = Нетто;
        Если ОткрытьФормуМодально("Обработка.КалькуляторВеса", ТекущееНетто) = 1 Тогда
            // Присваиваем результат расчета реквизиту табличной части
            Нетто = ТекущееНетто;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

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

Применение компоненты Йоксель для сложных табличных документов

В тех случаях, когда возможностей стандартной табличной части 1С 7.7 категорически не хватает для реализации сложного интерактивного дизайна, отличным решением станет использование внешней компоненты Йоксель (Yoksel).

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

← На главную