Как передать на сервер мутабельное значение

14.08.15

Разработка - Универсальные функции

Перевод выполнения кода с клиента на сервер. Метод для ленивых и торопящихся.

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

СПРАВКА:

Мутабельный тип (англ. Mutable type) - сложный тип данных в объектно-ориентированном программировании, значения которого (как правило - объекты) после своего создания допускают изменение своих свойств.
1С: Подробнее о типах данных 1С:Предприятие: http://v8.1c.ru/overview/CommonCommTypes.htm
1С: XML-сериализация, механизм (XML Serialization, Mechanism): http://v8.1c.ru/overview/Term_000000318.htm
tanka495: Клиент- серверные вызовы: //infostart.ru/public/86838/

 

Допустим, в нашем случае имеется проблема - нужно передать структуру. Структура эта изменяется функцией, в которую передается как параметр, плюс ко всему, 1С считает этот тип мутабельным по определению. И, чтобы уж совсем соответствовать реальной задаче, передаваемая структура, после изменения в функции, приобретает гигантский размер, т.к. в своем составе содержит поле, в которое помещается колоссальный результат запроса.

Решаем эту проблему через помещение  структуры во временное хранилище.

 

Конкретный пример:

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

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

Функция ПолучитьЗаписиКнигиПродаж(СписокСчетовФактур, СтруктураПараметров) Экспорт
    
    // Переводим выполнение функции на сервер   // GtG  //  22.04.2015 12:00:46 
    АдресМЗначения=ПоместитьВоВременноеХранилище(Неопределено);
    ПоместитьВоВременноеХранилище(СтруктураПараметров,АдресМЗначения);

    Возврат АС_УЧЕТ_НДС.ПолучитьЗаписиКнигиПродаж_серверная(СписокСчетовФактур,АдресМЗначения);
    
    //---------------<Отключено совсем>---------------------------// GtG // 22.04.2015 14:18:05
    ..... тут идет километр родного 1с-овского кода
 КонецФункции

    
Далее, в чисто серверный модуль (в конкретном случае АС_УЧЕТ_НДС)  копируем исходную процедуру (модифицируем функционал при желании).

 

Функция ПолучитьЗаписиКнигиПокупок_Серверная(СписокСчетовФактур, АдресМутабельногоЗначенияВоВременномХранилище) Экспорт

    СтруктураПараметров = ПолучитьИзВременногоХранилища(АдресМутабельногоЗначенияВоВременномХранилище);
   ...далее идет текст исходной функции
КонецФункции

Если в ходе работы процедуры/функции на сервере передаваемое мутабельное значение должно быть изменено - помещаем его во временное хранилище по тому же адресу АдресМутабельногоЗначенияВоВременномХранилище и после выполнения функции/процедуры в исходном модуле считываем из временного хранилища.

Вступайте в нашу телеграмм-группу Инфостарт

мутабельное значение сервер

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4245    Abysswalker    11    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    7868    DeerCven    15    

62

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    53398    dimanich70    84    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7719    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    67942    atdonya    31    

72

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9684    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Гость 14.08.15 17:28
Структура эта изменяется функцией, в которую передается как параметр, плюс ко всему, 1С считает этот тип мутабельным по определению.


Синтакс-помощник
Структура (Structure)
Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Возможен обмен с сервером.
HystriX; Skyeng; Yashazz; dj_serega; siddy; proGAll; serg_gres; dmpas; +8 Ответить
2. karpik666 4277 16.08.15 13:41 Сейчас в теме
1. Начнем с того, что мутабельный тип ни при каких условиях не должны передаваться на сервер, на это и мутабельный тип, что если он все таки будет передаваться, то он может быть в это время изменен. И данные будут не актуальными. Такие ошибки обычно делают новички, но это является как раз ошибкой.
2. "Много букф" в статье, а по сути, чтобы передать с клиента на сервер большой объем данных используйте функцию "ПоместитьВоВременноеХранилище". И в коде не совсем понятно зачем использовано 2 раза "поместитьВоВременноеХранилище", когда можно было обойтись одним.
slonjaka; +1 Ответить
3. Evilgrym 195 17.08.15 13:21 Сейчас в теме
(2) karpik666, ну , корабель теориии обычно разбивается вдрызг о скалы практики.
4. cepeleva-ludmila 69 18.08.15 09:50 Сейчас в теме
а можно передать значение через строку
Функция ПолучитьЗаписиКнигиПродаж(СписокСчетовФактур, СтруктураПараметров) Экспорт
    
    // Переводим выполнение функции на сервер   // GtG  //  22.04.2015 12:00:46 

   СтрокаМутабельныхПараметров = ЗначениеВстрокуВнутр(СтруктураПараметров);

    Возврат АС_УЧЕТ_НДС.ПолучитьЗаписиКнигиПродаж_серверная(СтрокаМутабельныхПараметров );
    
    //---------------<Отключено совсем>---------------------------// GtG // 22.04.2015 14:18:05
    ..... тут идет километр родного 1с-овского кода
 КонецФункции
    
Показать

Далее, в чисто серверный модуль (в конкретном случае АС_УЧЕТ_НДС) копируем исходную процедуру (модифицируем функционал при желании).



Функция ПолучитьЗаписиКнигиПокупок_Серверная(СтрокаМутабельныхПараметров ) Экспорт

СтруктураПараметров = ЗначениеИзСтрокиВнутр(СтрокаМутабельныхПараметров );
...далее идет текст исходной функции
КонецФункции
9. pvlunegov 160 27.01.20 14:21 Сейчас в теме
(4) В вашем способе передачи данных с клиента на сервер будет гоняться:
Структура с таблицей, содержащей тысячи строк
В этом случае, через узкие каналы связи, через интернет между Клиентом и сервером будет гоняться данные в мегабайты.

В случае помещения этих данных в файл на диске (временное хранилище = данные храняться в кеш-файлах)
Данные не будут гоняться при каждом вызове функции или процедуры.
Данные будут 1 раз помещены в кеш-файл.
При необходимости, кеш файл будет актуализироваться до новой версии.

Эти операции гораздо оптимизированнее, так как поддержка данных в кеш-файлах поддерживается со стороны платформы.
5. cepeleva-ludmila 69 18.08.15 09:50 Сейчас в теме
Я конечно понимаю что это не правильно с точки зрения 1с, но это выход
6. Evilgrym 195 18.08.15 19:13 Сейчас в теме
(5) cepeleva-ludmila, но далее идет вход через выход в виде результата запроса в 230тысячстрок, который нет желания обрабатывать самому и нужно подпихнуть в стандартный 1свский код. При этом нужно обойтись минимумом дописок. Максимум в пару тройку строк.
8. cepeleva-ludmila 69 01.09.15 10:25 Сейчас в теме
(6) и результат то стандартный 1с объект результат запроса получаешь и обходишь
7. WKBAPKA 216 19.08.15 15:44 Сейчас в теме
можно еще фиксированной структурой перенести, не?
10. voleg2 14.09.21 10:34 Сейчас в теме
Для отправки сообщения требуется регистрация/авторизация