При разработке и доработке конфигураций 1С:Предприятие часто возникает задача выполнить обработку данных на сервере, используя алгоритмы, зашитые в модуле управляемой формы или вызываемые из неё. Разберем, почему прямой вызов кода формы на сервере невозможно выполнить стандартными средствами и какими способами можно реализовать требуемую бизнес-логику.
Проанализируем архитектуру клиент-серверного взаимодействия в платформах 1С:Предприятие 8.3. Объект УправляемаяФорма и все элементы пользовательского интерфейса существуют исключительно в контексте клиента. На стороне сервера — в фоновых заданиях, регламентных процедурах, HTTP-сервисах или обычных серверных модулях — интерактивный контекст отсутствует.
Из-за этого возникают следующие ограничения:
ПолучитьФорму() в серверном контексте приведет к ошибке выполнения, так как платформа не может инициализировать визуальный интерфейс без клиента.Предупреждение(), Вопрос() или ПоказатьЗначение(), не работают на сервере.ДанныеФормыСтруктура или ДанныеФормыКоллекция) и сама форма не сериализуются для передачи в фоновые задания на сервер.Если задача заключается в изменении записей регистра или реквизитов документа/справочника, правильным решением будет отказ от обращения к форме и переход на работу с прикладными объектами базы данных.
Рассмотрим пример внесения изменений в регистр сведений на сервере без участия формы. Для этого сформируем набор записей и установим необходимые отборы:
// Создаем набор записей регистра сведений
НаборЗаписей = РегистрыСведений.МойРегистрСведений.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Измерение1.Установить(ЗначениеИзмерения1);
// Заполняем записи
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Измерение1 = ЗначениеИзмерения1;
НоваяЗапись.Ресурс1 = НовоеЗначение;
// Записываем данные в базу
НаборЗаписей.Записать();
Если требуется изменить объектный документ или справочник, выполним считывание объекта по ссылке через метод ПолучитьОбъект(), изменим реквизиты и вызовем метод Записать().
Бывают ситуации, когда логика обработки вынесена в общий модуль (или закрытый модуль), требующий на вход данные, аналогичные реквизитам формы. В этом случае вместо формы передадим обычную Структура, повторяющую имена и значения реквизитов.
Посмотрим на пример подготовки данных для серверного вызова:
ПараметрыОбработки = Новый Структура;
ПараметрыОбработки.Вставить("Организация", СсылкаНаОрганизацию);
ПараметрыОбработки.Вставить("Период", ТекущаяДата());
ПараметрыОбработки.Вставить("Сумма", 10000);
// Передаем структуру в процедуру общего модуля
МойОбщийМодульСервер.ОбработатьДанные(ПараметрыОбработки);
Если конфигурация находится на поддержке и требуется перехватить или вынести логику из формы, применим механизмы расширений (файл .cfe). С помощью аннотаций &Вместо, &Перед или &После перехватим вызов процедуры и вынесем основной алгоритм расчетов в экспортную процедуру общего серверного модуля.
Выясним преимущества такого подхода: бизнес-логика отделяется от визуального интерфейса, становится доступной из любых контекстов (включая регламентные задания) и сохраняет работоспособность при обновлениях конфигурации.