Как программно установить значения в форме Информационной карты при работе регламентного задания?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

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

Анализ проблемы: Форма vs Фоновое задание

Первое и самое важное правило платформы 1С:Предприятие 8: в регламентных заданиях форм не существует. Регламентное задание выполняется на сервере в отдельном сеансе, где полностью отсутствует графический интерфейс (UI). Попытка получить форму через ПолучитьФорму() или обратиться к реквизитам ЭтаФорма внутри фонового процесса приведет к ошибке или не даст никакого результата.

Рассмотрим ситуацию автора: необходимо проставить флаг ФлагШтрихКод в информационной карте. В конфигурации "Розница" этот флаг на форме часто является вычисляемым реквизитом. Он не хранится в самой таблице справочника, а служит лишь для отображения состояния — есть ли у данной карты привязанный штрихкод в соответствующем регистре сведений.

Шаг 1: Работа с объектной моделью вместо интерфейсной

Вместо того чтобы искать способ «нажать галочку» на форме, мы должны проанализировать, какие данные в базе данных отвечают за появление этой галочки. В случае с дисконтными картами нам нужно создать сам элемент справочника ИнформационныеКарты и связанные с ним записи. Проанализируем пример кода для создания карты в регламентном задании:


// Создаем новый элемент справочника
НоваяКарта = Справочники.ИнформационныеКарты.СоздатьЭлемент();
НоваяКарта.Наименование = "Дисконтная карта №123";
НоваяКарта.ВидКарты = ВидКартыСсылка; // Указываем ссылку на вид карты
НоваяКарта.КодКарты = "123456789";

// Если в логике объекта есть проверки, зависящие от формы, 
// используем ДополнительныеСвойства
НоваяКарта.ДополнительныеСвойства.Вставить("ПропуститьПроверкуШтрихкода", Истина);

НоваяКарта.Записать();

Шаг 2: Хранение данных штрихкода в регистрах

В конфигурации "1С:Розница" информация о штрихкодах и магнитных кодах хранится в подчиненном регистре сведений (обычно РегистрСведений.Штрихкоды). Именно наличие записи в этом регистре заставляет форму карты при открытии программно устанавливать ФлагШтрихКод = Истина. Разберем, как добавить штрихкод программно:


МенеджерЗаписи = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ТекущаяДата();
МенеджерЗаписи.Владелец = НоваяКарта.Ссылка;
МенеджерЗаписи.Штрихкод = "123456789";
МенеджерЗаписи.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
МенеджерЗаписи.Записать();

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

Шаг 3: Синхронизация с уже открытыми формами

Если задача стоит иначе — обновить реквизит в форме, которая уже открыта у пользователя в данный момент, — напрямую из регламентного задания сделать это нельзя. Однако мы можем применить следующие методы:

  1. Обработчик ожидания: В самой форме можно прописать ПодключитьОбработчикОжидания, который раз в несколько минут будет проверять изменения в базе данных и обновлять экранные реквизиты.
  2. Оповещения (Система взаимодействия): Можно использовать механизм оповещений, чтобы серверное задание отправило сигнал клиенту, а клиентская форма, поймав этот сигнал, выполнила команду ЭтаФорма.Прочитать() или обновила конкретный ФлагШтрихКод.

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


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ПодключитьОбработчикОжидания("ПроверитьОбновлениеДанных", 60); // Проверка раз в минуту
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьОбновлениеДанных()
    ПроверитьНаличиеШтрихкодаНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПроверитьНаличиеШтрихкодаНаСервере()
    // Логика проверки наличия записи в регистре
    // и обновление реквизита ФлагШтрихКод
КонецПроцедуры

Выясним причину ошибки архитектуры

Проанализируем ситуацию еще раз: попытка имитировать действия пользователя («поставить флаг») вместо имитации результата («записать данные») — это ключевой тупик. При миграции через РегламентныеЗадания следует всегда работать с менеджерами объектов и наборами записей регистров.

Важные рекомендации:

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

← На главную