При работе с внешними обработками в 1С часто возникает задача автоматизировать ввод данных, которые пользователь вынужден заполнять вручную при каждом запуске. Рассмотрим ситуацию, когда необходимо, чтобы при открытии формы сразу устанавливалось определенное время (например, 00:00:10) и автоматически активировался флаг включения расписания. Это особенно актуально для задач автоматической установки даты запрета изменения данных после перезагрузки сервера или сеанса пользователя.
Для того чтобы код сработал в момент появления окна обработки на экране, нам необходимо использовать специализированные процедуры — обработчики событий формы. В системе 1С:Предприятие 8 (особенно в обычных формах) для этих целей чаще всего применяются ПередОткрытием или ПриОткрытии. Разберем, в чем их принципиальная разница:
Для нашей задачи оптимально использовать ПередОткрытием, так как мы хотим подготовить значения реквизитов до того, как пользователь их увидит.
Проанализируем программный код, который позволяет установить время 00:00:10. В 1С тип данных Дата всегда содержит и дату, и время. Если нам нужно задать только время в рамках текущего дня, мы используем функцию НачалоДня() и прибавляем к ней нужное количество секунд.
Рассмотрим пример кода, который нужно разместить в модуле формы:
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
// Устанавливаем время: начало текущего дня + 10 секунд
ВремяУстановкиЗапрета = НачалоДня(ТекущаяДата()) + 10;
// Включаем флажок расписания программно
ВключитьРасписание = Истина;
// Вызываем обработчик, который запустит таймер ожидания
ВключитьРасписаниеПриИзменении(Неопределено);
КонецПроцедуры
В данном фрагменте мы выполняем три важных действия: присваиваем значение реквизиту ВремяУстановкиЗапрета, устанавливаем булево значение Истина для флажка ВключитьРасписание и принудительно вызываем процедуру, которая обычно срабатывает при ручном нажатии на флажок. Это необходимо для того, чтобы система «подцепила» изменения и запустила ПодключитьОбработчикОжидания.
Часто начинающие специалисты допускают ошибку, пытаясь описать одну процедуру внутри другой. Проанализируем, почему код из обсуждения выдавал ошибку. В языке 1С запрещена вложенность процедур. Код должен иметь четкую структуру, где каждая процедура начинается с ключевого слова Процедура и заканчивается КонецПроцедуры.
Неправильно:
Процедура Основная()
Процедура ПередОткрытием() // ОШИБКА! Вложенность недопустима
// код
КонецПроцедуры
КонецПроцедуры
Правильно: Все процедуры должны располагаться последовательно одна за другой. Если вы хотите, чтобы при открытии формы выполнялись действия, вы просто добавляете новую процедуру в модуль или находите существующую ПередОткрытием и дополняете её тело нужными строками.
Выясним причину, по которой недостаточно просто установить галочку в коде. В типовых обработках включение расписания часто завязано на метод ПодключитьОбработчикОжидания(). Этот метод заставляет программу с определенной периодичностью проверять условие (в нашем случае — совпало ли текущее время со временем установки запрета). Чтобы это заработало автоматически при открытии, мы должны убедиться, что процедура ВключитьРасписаниеПриИзменении вызывается программно.
Проанализируем, как это выглядит в связке:
Процедура ВключитьРасписаниеПриИзменении(Элемент)
Если ВключитьРасписание = Истина Тогда
// Запускаем проверку каждую секунду
ПодключитьОбработчикОжидания("УстановитьРазрешенныйПериод", 1);
Иначе
ОтключитьОбработчикОжидания("УстановитьРазрешенныйПериод");
КонецЕсли;
КонецПроцедуры
Обратите внимание: если мы просто напишем ВключитьРасписание = Истина в процедуре ПередОткрытием, визуально галочка поставится, но сам механизм «ожидания» не запустится, так как событие ПриИзменении отрабатывает только при интерактивном действии пользователя (клике мышкой). Поэтому прямой вызов процедуры из кода обязателен.
Существует еще один способ установить значения по умолчанию, который упоминали участники обсуждения — написание кода в самом низу модуля формы вне всяких процедур. Этот код исполняется один раз в момент инициализации модуля. Однако, использование предопределенных процедур события формы (ПередОткрытием) считается более «чистым» и профессиональным стилем разработки, так как позволяет управлять логикой в зависимости от параметров открытия.
Хотя предложенное решение полностью исправляет работу конкретной внешней обработки, важно понимать контекст современных систем 1С. Использование обработчиков ожидания в открытой форме требует, чтобы сеанс пользователя был постоянно запущен, а компьютер не уходил в спящий режим.
Если ваша конфигурация построена на базе БСП (Библиотеки стандартных подсистем), рекомендуем рассмотреть возможность переноса данного функционала в Регламентные задания. Это позволит серверу 1С самостоятельно, без участия интерфейса и открытых окон, менять дату запрета изменения данных в строго заданное время. Это более надежный промышленный подход, исключающий человеческий фактор и необходимость «залазить на комп и включать заново», о чем беспокоился автор темы.
Итоговый алгоритм действий для внесения правок:
ПередОткрытием (или создать её через панель свойств формы).ВремяУстановкиЗапрета и ВключитьРасписание.ВключитьРасписаниеПриИзменении(Неопределено).Эти простые изменения позволят сэкономить время на ежедневном обслуживании базы данных и обеспечат своевременную блокировку периодов для редактирования.