В типовых конфигурациях, таких как 1С:Зарплата и Управление Персоналом 3.1, разработчики часто сталкиваются с архитектурной особенностью: значительная часть бизнес-логики (особенно расчетной) сосредоточена непосредственно в модулях управляемых форм. Это создает трудности при необходимости автоматизировать действия пользователя, например, когда требуется выполнить массовый пересчет строк в документе «Увольнение списком», не заходя в расшифровку каждой отдельной строки вручную.
В данной статье мы подробно рассмотрим несколько подходов к решению этой задачи: от классической эмуляции нажатия клавиш до правильного использования механизмов платформы 1С 8.3 через расширения и параметры форм.
Проанализируем ситуацию: расчет строки происходит в отдельной вспомогательной форме, которая открывается при клике на строку основного документа. Чтобы не дублировать сложный расчетный код, мы можем программно открывать эту форму в цикле для каждой строки, передавая в нее специальный «сигнал» о необходимости автоматического выполнения действий.
Рассмотрим пошагово реализацию этого плана:
ПриОткрытии, проверяем наличие флага и запускаем процедуру расчета.Пример кода для основной формы:
&НаКлиенте
Процедура ПересчитатьВсеСтроки(Команда)
Для Каждого СтрокаТЧ Из Объект.Сотрудники Цикл
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ПрограммныйПересчет", Истина);
ПараметрыФормы.Вставить("Ключ", СтрокаТЧ.СсылкаНаСтроку); // Условный ключ связи
ОткрытьФорму("Документ.УвольнениеСписком.Форма.ФормаСтроки", ПараметрыФормы, ЭтаФорма);
КонецЦикла;
КонецПроцедуры
В модуле формы строки (в расширении) добавим обработку:
&НаКлиенте
&После("ПриОткрытии")
Процедура П_ПриОткрытии(Отказ)
Если Параметры.Свойство("ПрограммныйПересчет") И Параметры.ПрограммныйПересчет Тогда
// Вызываем штатную процедуру расчета, которая привязана к кнопке на форме
ЭтотОбъект.ВыполнитьРассчетНаФорме();
// Закрываем форму с сохранением результата
ЭтотОбъект.ЗаписатьИЗакрыть();
КонецЕсли;
КонецПроцедуры
Если процедура расчета в форме не помечена ключевым словом Экспорт, мы не сможем вызвать ее напрямую извне. Однако механизм расширений позволяет обойти это ограничение. Мы можем создать в расширении формы свою экспортную процедуру-обертку.
Выясним, как это работает: расширение имеет доступ ко всем неэкспортным переменным и процедурам модуля, который оно расширяет. Создав процедуру ПрограммныйКлик() с ключевым словом Экспорт внутри расширения формы, мы делаем ее доступной для вызова из основной формы после того, как объект формы будет получен программно.
Проанализируем пример вызова команды формы через метод платформы:
// В расширении формы строки
&НаКлиенте
Процедура П_ВыполнитьКомандуРасчета() Экспорт
// Платформенный метод вызова команды по имени
ЭтаФорма.ВыполнитьКоманду("КомандаПересчитать");
КонецПроцедуры
Этот метод считается «хардкорным» и менее надежным, но иногда он является единственным выходом, если логика формы слишком запутана или закрыта. Мы можем использовать объект Wscript.Shell для посылки клавиатурных комбинаций в активное окно 1С.
Разберем пример реализации:
Процедура ЭмулироватьНажатиеEnter()
Shell = Новый COMОбъект("Wscript.Shell");
// Посылаем нажатие клавиши Enter (код ~)
Shell.SendKeys("~");
КонецПроцедуры
Важный нюанс: Данный метод крайне чувствителен к фокусу окна. Если во время выполнения кода пользователь переключится на другое приложение, «клики» уйдут туда. Рассмотрим этот метод только как крайнюю меру для автоматизации старых участков кода.
Как отмечают опытные разработчики, даже если кажется, что весь код написан в форме, зачастую формы ЗУП используют контекстные вызовы общих модулей, таких как РасчетЗарплатыРасширенный или УчетСтраховыхВзносов.
Посмотрим на алгоритм действий для программиста:
Внимание: В ЗУП 3.1 расчет часто требует инициализации больших структур данных (контекста). Если вы решите копировать вызов из формы, убедитесь, что вы правильно подготовили все входные параметры, иначе расчет может вернуть неверные данные из-за отсутствия необходимых значений в кэше формы.
При реализации автоматизации «кликов» придерживайтесь следующих правил:
ВыполнитьКоманду() автоматически проверяет доступность команды для пользователя.Подводя итог, наиболее современным и правильным решением для ЗУП 3.1 является сочетание расширения формы и передачи параметров открытия. Это позволяет сохранить целостность типового алгоритма расчета и обеспечить пользователям желаемую скорость работы «в один клик».