При разработке механизмов интеграции или миграции данных, например, при переносе дисконтных карт из одной базы в другую, программисты часто сталкиваются с задачей автоматического заполнения реквизитов. Распространенной ошибкой является попытка манипулировать реквизитами формы (интерфейсными элементами) напрямую из кода, который выполняется в фоновом режиме (регламентном задании). Разберем подробно, почему это невозможно и как правильно решить задачу в конфигурации 1С:Розница.
Первое и самое важное правило платформы 1С:Предприятие 8: в регламентных заданиях форм не существует. Регламентное задание выполняется на сервере в отдельном сеансе, где полностью отсутствует графический интерфейс (UI). Попытка получить форму через ПолучитьФорму() или обратиться к реквизитам ЭтаФорма внутри фонового процесса приведет к ошибке или не даст никакого результата.
Рассмотрим ситуацию автора: необходимо проставить флаг ФлагШтрихКод в информационной карте. В конфигурации "Розница" этот флаг на форме часто является вычисляемым реквизитом. Он не хранится в самой таблице справочника, а служит лишь для отображения состояния — есть ли у данной карты привязанный штрихкод в соответствующем регистре сведений.
Вместо того чтобы искать способ «нажать галочку» на форме, мы должны проанализировать, какие данные в базе данных отвечают за появление этой галочки. В случае с дисконтными картами нам нужно создать сам элемент справочника ИнформационныеКарты и связанные с ним записи. Проанализируем пример кода для создания карты в регламентном задании:
// Создаем новый элемент справочника
НоваяКарта = Справочники.ИнформационныеКарты.СоздатьЭлемент();
НоваяКарта.Наименование = "Дисконтная карта №123";
НоваяКарта.ВидКарты = ВидКартыСсылка; // Указываем ссылку на вид карты
НоваяКарта.КодКарты = "123456789";
// Если в логике объекта есть проверки, зависящие от формы,
// используем ДополнительныеСвойства
НоваяКарта.ДополнительныеСвойства.Вставить("ПропуститьПроверкуШтрихкода", Истина);
НоваяКарта.Записать();
В конфигурации "1С:Розница" информация о штрихкодах и магнитных кодах хранится в подчиненном регистре сведений (обычно РегистрСведений.Штрихкоды). Именно наличие записи в этом регистре заставляет форму карты при открытии программно устанавливать ФлагШтрихКод = Истина. Разберем, как добавить штрихкод программно:
МенеджерЗаписи = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ТекущаяДата();
МенеджерЗаписи.Владелец = НоваяКарта.Ссылка;
МенеджерЗаписи.Штрихкод = "123456789";
МенеджерЗаписи.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
МенеджерЗаписи.Записать();
После того как регламентное задание создаст запись в регистре, любой пользователь, открыв форму этой карты, увидит установленный флаг, так как в процедуре формы ПриЧтенииНаСервере или ПриСозданииНаСервере сработает стандартный код конфигурации, проверяющий наличие штрихкода в базе.
Если задача стоит иначе — обновить реквизит в форме, которая уже открыта у пользователя в данный момент, — напрямую из регламентного задания сделать это нельзя. Однако мы можем применить следующие методы:
ПодключитьОбработчикОжидания, который раз в несколько минут будет проверять изменения в базе данных и обновлять экранные реквизиты.ЭтаФорма.Прочитать() или обновила конкретный ФлагШтрихКод.Пример использования обработчика ожидания в модуле формы:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОжидания("ПроверитьОбновлениеДанных", 60); // Проверка раз в минуту
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьОбновлениеДанных()
ПроверитьНаличиеШтрихкодаНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПроверитьНаличиеШтрихкодаНаСервере()
// Логика проверки наличия записи в регистре
// и обновление реквизита ФлагШтрихКод
КонецПроцедуры
Проанализируем ситуацию еще раз: попытка имитировать действия пользователя («поставить флаг») вместо имитации результата («записать данные») — это ключевой тупик. При миграции через РегламентныеЗадания следует всегда работать с менеджерами объектов и наборами записей регистров.
Важные рекомендации:
МодульМенеджера или ОбщийМодуль с флагом "Сервер", чтобы он был доступен без контекста формы.ДополнительныеСвойства объекта для передачи параметров, которые в обычном режиме работы передаются из формы в объект при записи.Таким образом, для решения задачи автора необходимо отказаться от идеи поиска формы. Вместо этого нужно программно создавать записи в регистре сведений штрихкодов, указывая владельцем созданную карту. Это обеспечит корректное отображение всех флагов при последующем открытии формы пользователем.