При разработке в управляемых формах 1С часто возникает ситуация, когда данные необходимо получить на клиенте (например, через COMОбъект для внешнего SQL-источника), а затем передать их на сервер для записи в объект информационной базы. В этой статье мы подробно разберем, как грамотно реализовать этот механизм и почему возникают типичные ошибки при работе с файлами и соединениями на сервере.
В управляемом приложении клиент и сервер работают в разных контекстах. Клиентская часть не имеет прямого доступа к данным объекта 1С, а серверная часть, в свою очередь, может иметь ограничения в доступе к ресурсам локального компьютера пользователя. Для того чтобы заполнить реквизиты объекта, нам необходимо передать данные, полученные на клиенте, в серверную процедуру или функцию.
Самым эффективным и чистым способом является упаковка полученных данных в Структура. Этот метод позволяет передать на сервер любое количество реквизитов одним аргументом. Давайте разберем, как это реализовать по шагам:
ЗаполнитьЗначенияСвойств для быстрого переноса данных в объект.Рассмотрим пример реализации:
&НаКлиенте
Процедура ЗаполнитьДанныеПоСчетчику(Команда)
// Получаем данные (в реальности тут может быть ваш COM-объект)
ДанныеСчетчика = Новый Структура;
ДанныеСчетчика.Вставить("Адрес", "Ленина 1");
ДанныеСчетчика.Вставить("ЧислоФаз", 3);
// Вызываем серверную процедуру
ЗаписатьДанныеНаСервере(ДанныеСчетчика);
КонецПроцедуры
&НаСервере
Процедура ЗаписатьДанныеНаСервере(ДанныеСчетчика)
// Объект формы уже доступен в контексте
ЗаполнитьЗначенияСвойств(Объект, ДанныеСчетчика);
Объект.Записать();
КонецПроцедуры
Если вы столкнулись с тем, что соединение с SQL-базой через ADODB.Connection работает на клиенте, но выдает ошибку на сервере, важно понимать причину. Чаще всего дело не в программном коде, а в правах доступа и окружении.
Служба сервера 1С работает под специфической учетной записью (обычно это USR1CV8). У этой записи нет доступа к файлам, лежащим на рабочем столе текущего пользователя или в папках, куда нет прав доступа у системного пользователя. Кроме того, если ваш сервер работает на Linux, использование COMОбъект("ADODB.Connection") невозможно в принципе, так как это технология Windows.
Что нужно проверить для корректной работы на сервере:
UDL.КаталогПрограммы(). Используйте абсолютные сетевые пути с настроенными правами доступа или общие ресурсы.ConnectionPoint.udl для пользователя, под которым запущена служба сервера 1С.Если данные, которые вы передаете, являются объемными или требуют предварительной обработки, используйте ПоместитьВоВременноеХранилище. Это позволяет передать данные с клиента на сервер, сохранив их во временном хранилище, и получить адрес этого хранилища на сервере для последующего считывания. Этот механизм также полезен, когда нужно передать двоичные данные или большие массивы.
Мы проанализировали основные подходы к решению задачи. Основные выводы:
Структура или Массив.ЗаполнитьЗначенияСвойств для сокращения объема кода при переносе значений в объект.Применяя эти методы, вы сможете избежать «костылей» в архитектуре и сделать ваш код профессиональным и легко поддерживаемым.