Перейти к содержимому

Мутабельные значения 1с что это

  • автор:

Мутабельные значения 1с что это

Иногда в технической документации встречается понятие «мутабельный тип». Например, в описании функции ЗначениеЗаполнено (ValueIsFilled) мы встречаем:
Функция проверяет, отличается ли переданное значение от значения по умолчанию того же типа.
Не работает с мутабельными значениями. При передаче мутабельного значения функция вызывает исключение.

И возникает вопрос, а что такое «мутабельное значение»?

Мутабельный тип (от англ. Mutable — изменчивый) — сложный тип данных (как правило — объекты), который после своего создания допускает изменение своих свойств.

Общий модуль

Общие модули содержат общие алгоритмы, которые могут вызываться из других модулей.

  • доступен только раздел описания процедур и функций (нельзя описывать переменные и программы).
  • режимы компиляции определяются опциями общего модуля
    • не требуется указывать директивы компиляции вначале процедур и функций, и хотя они не вызывают ошибок компиляции, использование директив &НаСервереБезКонтекста и &НаКлиентеНаСервереБезКонтекста сделает процедуру или функцию недоступной для любых серверных вызовов.
    • управлять компиляцией отдельных фрагментов модуля следует инструкциями препроцессора #ЕСЛИ #ИНАЧЕ #КОНЕЦЕСЛИ

    Опции Общего модуля

    • Глобальный — объявленные в модуле экспортные методы будут доступны за пределами модуля напрямую без указания имени модуля, глобальный модуль компилируется при старте системы, поэтому увеличивает время старта системы.
    • Опции компиляции и доступности
      • Клиент (управляемое приложение) — модуль будет скомпилирован и доступен на Клиенте
      • Сервер — модуль будет скомпилирован и доступен на Сервере
      • Внешнее соединение — модуль будет скомпилирован и доступен при Внешнем соединении
      • Вызов сервера — делает экспортные процедуры и функции доступными для вызова из модулей исполняемых на Клиенте, предполагает возможность двунаправленного XDTO преобразования параметров и возвращаемых значений (см. подробней Передача параметров и возвращаемых значений ниже).
      • Привилегированный — применим только к модулям на Сервере, отменяет контроль доступа к объектам данных, что существенно увеличивает скорость выполнения, особенно при горизонтальном разграничении доступа к записям таблицы.
      • Повторное использование возвращаемых значений — позволяет ускорить выполнение функций неглобального общего модуля путем оптимизации XDTO преобразования параметров повторяющихся вызовов.

      Вызов метода общего модуля

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

      Пример косвенного вызова метода общего модуля:

      Модуль объекта

      Основное назначение модуля — обрабатывать события записи объекта где и как бы оно не возникло, в т.ч. программно, а также расширять набор методов объекта.

      • присутствует у Справочников, Документов, Отчетов, Обработок, ПВХ
        • отсутствует у Констант, Перечислений, Журналов, Внешних источников данных
        • у Регистров аналогичную роль выполняет Модуль Записи
        • переменные объявленные как Экспорт доступны у объекта как реквизиты <объект>.<Переменная>, но в отличие от реквизита она не сохраняется при записи
        • процедуры и функции описанные как Экспорт доступны у объекта как методы <объект>.<Процедура>(<параметры>)
          • по неизвестной причине доступ к переменным и методам у Обработок не действует

          Примеры

          Пример описания переменной, конструктора объекта, экспортной функции и пример вызова:

          Модуль менеджера

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

          • присутствует у Справочников, Документов, Журналов, Перечислений, Отчетов, Обработок, ПВХ, Регистров, Бизнес-процессов, Задач
            • отсутствует у Внешних источников данных
            • доступность обеспечивается только из модулей на Сервере
            • могут при необходимости получить объект или ссылку в параметре вызова

            Примеры

            Пример описания статической экспортной функции и ее вызов из другого модуля , где эти типы доступны (на Сервере). :

            Модуль менеджера значения

            Основное назначение модуля — обрабатывать события записи константы.

            Модуль формы

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

            • компиляция по умолчанию выполняется на Сервере, но отдельные фрагменты модуля могут устанавливать другую область компиляции директивами компиляции
            • НаКлиенте
              • реквизиты объекта формы доступны через Объект.<Реквизит>
              • реквизиты формы доступны непосредственно по имени <Реквизит>
              • элементы формы доступны через Элементы.<Элемент>
              • статические переменные существуют только на время обработки события формы, а затем удаляются
              • реквизиты объекта формы доступны через Объект.<Реквизит>
              • реквизиты формы доступны непосредственно по имени <Реквизит>
              • элементы формы на Сервере недоступны
              • статические переменные существуют только на время вызова метода на Сервере, а затем удаляются
              • данные реквизитов при каждом вызове НаКлиенте->НаСервере и возврате НаСервере->НаКлиенте все (целиком в полном объеме) проходят через XDTO сериализацию
              • доступные методы реквизитов на Клиенте и на Сервере отличаются

              Модуль набора записей

              Модуль команды

              Временный динамический модуль

              Временный динамический модуль создается платформой при использовании оператора Выполнить() :

              • временный модуль создается и компилируется в контексте текущего модуля и процедуры
                • модулю доступны все объекты доступные в текущем модуле (включая элементы, реквизиты и объект формы, модули и объекты конфигурации)
                • модулю доступны все параметры и локальные переменные текущей процедуры
                • декларация переменной оператором Перем вызовет ошибку
                • ошибка без обработки исключения вызовет сообщение аналогичное обычной ошибке в модуле и прерывание выполнения
                • ошибка в обработчике исключения имеет возможность получить описание ошибки через ИнформацияОбОшибке()
                  • текст описания ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) содержит больше сведений, но в менее удобной форме

                  Разделы модулей

                  • объявления переменных (кроме общих модулей)
                  • процедур и функций
                  • основной программы (кроме общих модулей)

                  Директивы компиляции и выполнения

                  Пять директив определяют область исполнения функций и процедур. Их следует применять только в коде модулей управляемых форм и в коде модулей команд, в остальных модулях рекомендуется применять инструкции препроцессора.

                  • директива должна предшествовать каждому определению в модуле
                  • по умолчанию действует директива &НаСервере
                  • директива &НаСервереБезКонтекста имеет смысл только в формах (чей контекст директива подразумевает)
                  • определение в общем модуле с директивой &НаСервере в общем модуле имеет
                  • директива &НаСервереНаКлиенте применяется только в коде модулей команд
                  • приведенный в таблице порядок директив соответствует иерархии доступности, так функции и процедуры определенные с некоторой директивой имеют доступ к процедурам и функциям определенным с той же директивой, либо с любой директивой следующей ниже, но не имеют доступа к определенным с предшествующей директивой
                    • определениям с директивой &НаКлиенте доступны все определения на Клиенте и все определения на Сервере, для которых предусмотрен серверный вызов
                    • определениям с директивой &НаКлиентеНаСервереБезКонтекста доступны определения только с такой же директивой

                    Инструкции препроцессора

                    Инструкции препроцессора управляют включением и исключением фрагментов модуля прежде чем он будет скомпилирован для выполнения, все инструкции препроцессора и исключенные ими фрагменты кода отсутствуют в коде передаваемом компилятору модуля.

                    Предусмотрены четыре инструкции

                    • #Если <Логическое выражение> Тогда
                    • #ИначеЕсли <Логическое выражение> Тогда
                    • #Иначе
                    • #КонецЕсли
                    • <Логическое выражение> = [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора>]…]
                    • <Символ препроцессора> = <НаКлиенте | НаСервере | ТолстыйКлиентОбычноеПриложение | ТолстыйКлиентУправляемоеПриложение | Клиент | Сервер | ВнешнееСоединение >
                      <Булева операция> =

                    Области

                    Области дают возможность выделять произвольные области кода, группировать и сворачивать их в окне редактора модуля и служат только для облегчения работы разработчика над исходным кодом большого объема. Инструкции определения Области относятся к препроцессору, хотя они не влияют ни на работу препроцессора, ни на дальнейшую компиляцию модуля, поскольку перед компиляцией они полностью исключаются из кода.

                    Области выделяются с помощью двух инструкций препроцессора #Область и #КонецОбласти :

                    • <имя области> должно соответствовать общим требованиям к именам переменных (не может начинаться с цифры, содержать пробелы, знаки и символы и т.п.).
                    • области могут быть вложены друг в друга или в другие группируемые конструкции языка.
                    • это возможно, но 1С не рекомендует разрывать областями отдельные грамматические конструкции, выражения, а также объявления и места вызова процедур и функций:
                    Области типовых конфигураций 1С:
                    • Модуль объекта
                      • ПрограммныйИнтерфейс
                      • ОбработчикиСобытий
                      • СлужебныеПроцедурыИФункции
                        • ИнициализацияИЗаполнение
                        • Прочее
                        • ПрограммныйИнтерфейс
                        • ОбработчикиСобытий
                        • СлужебныеПроцедурыИФункции
                          • СлужебныйПрограммныйИнтерфейс
                            • Обеспечение
                            • НаправленияДеятельности
                            • Проведение
                            • Отчеты
                            • Печать
                            • ШаблоныСообщений
                            • Прочее
                            • ТекущиеДела
                            • ОбновлениеИнформационнойБазы
                            • ФормированиеГиперссылкиВЖурналеДокументыПродажи
                            • Назначения
                            • ОписаниеПеременных
                            • ОбработчикиСобытийФормы
                            • ОбработчикиСобытийЭлементовШапкиФормы
                            • ОбработчикиСобытий
                            • ОбработчикиСобытийЭлементовТаблицыФормыТовары
                            • ОбработчикиКомандФормы
                            • СлужебныеПроцедурыИФункции

                            Предопределенные Объекты конфигурации

                            В модулях используются объекты данных с предопределенными именами

                            ЭтаФорма
                            • Используется в модуле формы в процедурах &НаКлиенте и &НаСервере для обращения к элементам формы и реквизитам
                            • Пример обращения к элементу формы через объект Элементы: ЭтаФорма.Элементы.НомерВерсии.Заголовок = ‘My God!’;
                            • Пример обращения к реквизиту формы: ЭтаФорма.ТекстОбъявления=’Hello!’;
                            • В модуле формы ключевое слово ЭтаФорма необязательно и допускается: Элементы.НомерВерсии.Заголовок = ‘My God!’;
                            • Описанные выше способы применимы только к простым типам
                            • Для сложных типов (ТаблицаЗначений, ДеревоЗначений) обращение приводит к объекту типа ДанныеФормыКоллекция
                            • Для получения значения объекта формы сложного типа применяется метод: <переменная>=РеквизитФормыВЗначение(<ИмяРеквизита>);
                            • Для установки значения объекта формы сложного типа применяется: ЗначениеВРеквизитФормы(<Значение>, <ИмяРеквизита>);
                            • Функции РеквизитФормыВЗначение() и ЗначениеВРеквизитФормы() доступны только на Сервере.
                            Объект
                            • Является именем основного реквизита управляемой формы, который хранит данные ИБ открытые в управляемой форме, например: Объект.Ссылка;
                            • Имя реквизита Объект может быть изменено, но делать это не принято.
                            • Полный формат: ЭтаФорма.Объект.Ссылка;
                            ЭтотОбъект
                            • Указывает на объект формы для доступа к реквизитам формы
                            • Допускает только чтение
                            • Доступен для Сервер, Толстый клиент, Внешнее соединение
                            Запись

                            В модуле записи регистра.

                            Элементы

                            Коллекция Элементы В модуле формы НаКлиенте содержит все элементы формы

                            • Элементы.<имя элемента>
                            • Элементы(«<имя элемента>»)
                            • ?Получить значение элемента ни свойством, ни методом нельзя

                            Аннотации расширения модулей

                            Три аннотации позволяют определить перехват порядка вызова типовых методов новыми методами.

                            • &Перед — перехватчик будет выполнен до того, как начнётся выполнение типового метода.
                            • &После — перехватчик будет выполнен после того, как выполнится типовой метод.
                            • &Вместо — реализует возможность полного перекрытия типового метода (типовой метод вообще не будет выполнен)
                              • в методе-перехватчике в произвольном месте можно вызвать типовой метод вызовом ПродолжитьВызов().

                              Источник: Расширение модулей //wonderland.v8.1c.ru

                              Объекты модулей

                              Модули конфигурации являются объектами, процедуры и функции тоже.

                              Передача параметров и возвращаемых значений

                              Для характеристики типов значений в 1С используется понятие мутабельность (от англ. Mutable — изменчивый), которое нуждается в разъяснении. Немутабельными типами являются простые типы (Число, Строка, Дата, Булево, Цвет, Ссылка), для которых определены пустые значения. Мутабельными типами являются сложные типы (Структура, Массив, СписокЗначений, ТаблицаЗначений, ДеревоЗначений, Объект, Форма и т.п.), свойства которых могут быть изменены после создания, а проверка на пустое значение лишена смысла.

                              Ошибка передачи мутабельного значения

                              Настроен автоматический обмен между УТ и Розницей. При передачи документов из Розницы в УТ, УТ запускается в режиме COM-соединения. После обмена имеются предупреждения «Попытка передачи с клиента на сервер мутабельного значения» и документы с таким предупреждением не проводятся, хотя вручную их можно провести. Т. е. я так понимаю, проблема возникает из-за COM-соединения.

                              Как быть в таком случае?

                              (0) ну что-то дорабатывали внутри УТ и криво доработали. Не учли COM-соединение

                              (1) Конфу не дорабатывал.

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

                              (2) Ошибка вылезает из-за передачи в процедуру структуры, но в справке написано, возможен обмен с сервером.

                              (3) внутри структуры у вас мутабельное значение. ДокументОбъект скорее всего.

                              В свойствах модуля, где находится вызываемая процедура, поставил галку «Вызов сервера» — ошибка больше не возникает.

                              +(5) и еще галку «Внешнее соединение».

                              (5) (6) и как это связано?

                              на сколько помню через ком передача возможна примитивных типов: число, дата, строка, булево.

                              все остальное формируется на другой стороне.

                              если передавать объект, форму и т.п. — выползет как раз вот такая ошибка.

                              (8) Подтвержаю инфу. Через ком передается только примитивные типы данных. Так же пердается Неопределено.

                              (7) Ну COM-соединение — это же вроде внешнее соединение.

                              TurboConf — расширение возможностей Конфигуратора 1С

                              ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку «Обновить» в браузере.

                              Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
                              Но вы можете создать новую ветку и вам обязательно ответят!
                              Каждый час на Волшебном форуме бывает более 2000 человек.

                              1. Что собой представляет мутабельные значения в 1С?

                              2. Как проверить заполненные мутабельные значения в 1С?

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

                              1. Что собой представляет мутабельные значения в 1С?

                              Для начала сделаем определение мутабельного типа в рамках языка программирования 1С и попытаемся понять, чем же он отличается от других типов.

                              Мутабельный тип (в переводе с английского Mutable – изменчивый) – это сложный тип данных в 1С, который может менять свои свойства уже после создания.

                              К мутабельным типам в языке программирования 1С относятся:

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

                              Простые (примитивные) типы:

                              Ссылка является сложным типом, который, однако, мы не можем изменить непосредственно. Для этого требуется получение объекта через конструкцию Ссылка.ПолучитьОбъект().

                              Предопределенным типом является цвет.

                              С описанием типов разобрались. Следующий вопрос, который, думаю, заинтересует многих – как же проверить заполненность мутабельных значений в 1С.

                              2. Как проверить заполненные мутабельные значения в 1С?

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

                              Зачастую ошибки подобного толка касаются таких типов как формы и элементы форм, списки значений (таблица, список, дерево), COM- объекты и т.д.

                              Для решения данной проблемы целесообразно проверять тип данных перед проверкой его заполненности, если заранее мы его не знаем. Зачастую это происходит при написании обменов данными.

                              Для проверки типа данных 1С мы можем использовать конструкцию типа:

                              проверки типа данных 1С

                              В данном случае 1С проанализирует первое условие, и если типы совпадут, дальнейшее условие отработано не будет.

                              В некоторых случаях целесообразно сделать проверку на примитивные типы, для этого заранее создадим массив примитивных типов:

                              создадим массив примитивных типов

                              Далее последует проверка:

                              проверка на примитивные типы

                              Специалист компании ООО «Кодерлайн»

                              Кулажевский Сергей Дмитриевич

                              Описание ошибки
                              При попытке сформировать результат отчета при работе с СКД в консоли разработчика, когда активна строка с пользовательскими настройками, возникает ошибка следующего содержания:

                              Попытка передачи с клиента на сервер мутабельного значения 1-го параметра метода XMLТекст ().
                              : ИТК_КонсольРазработчикаДанныеКлиент.ИзменитьПоле(ЭтотОбъект, Строка, «Текст», ИТК_СКДВызовСервера.XMLТекст(КомпоновщикНастроек.ПользовательскиеНастройки));
                              : СохранитьИзмененныеДанныеСтроки();
                              : ЗагрузитьДанныеВКомпоновщикНастроек(ПолныеДанныеСКД(ТекущаяСтрока));
                              : ОбновитьЭлементыФормы();

                              по причине:
                              Попытка передачи с клиента на сервер мутабельного значения 1-го параметра метода XMLТекст ().

                              Сценарий воспроизведения
                              Шаги по воспроизведению:

                              1. Открыть консоль разработчика.
                              2. Добавить в дерево данных «Схему компоновки данных».
                              3. Добавить в подчинение новой СКД «Пользовательскую настройку СКД».
                              4. Выделив строку пользовательских настроек в дереве данных нажать в главном меню кнопку «Выполнить».
                              5. Появится окно с сообщение об ошибке, текст которого приведен выше.

                              Окружение:

                              Infostart Toolkit 1.6.3

                              Платформа: 8.3.16.1876 (Linux x86-64)
                              Режим БД: клиент-серверный

                              Конфигурация:
                              1С:ERP. Управление холдингом (3.0.4.4)
                              Основной режим запуска: Управляемое приложение
                              Режим совместимости: Версия8_3_14
                              Версия БСП: 3.1.3.264

                              Клиент:
                              ОС: Windows x86-64 (Microsoft Windows 10 version 10.0 (Build 17763))
                              Язык: ru
                              Режим запуска: Управляемое приложение

                              При загрузке выдает сообщение «Попытка передачи мутабельного значения 1-го параметра метода СерверОбновитьПользователей». Клиент-серверный вариант. скорее всего из-за строчки «МассивПользователейОнЛайн = ПолучитьСоединенияИнформационнойБазы;» Строчка выполняется в привеллигрованном модуле. В файлом варианте работает. (Есстесно) Как лечить? Хочется, что бы функция определения подключенных пользователей работала и в серверном и файловом варианте..

                              я не уверен что именно здесь…. но наверно..

                              #Если клиент тогда #КонецЕсли

                              Да.. имеенно здесь ошибка… Но теперь другого рода: «Попытка вызова функции , возвращающей мутабельной значение». Что такое мутабельное значение??

                              имеено так и сделал: #Если Клиент Тогда АктивныеПользователи = ПолучитьАктивныхПользователейКлиент; #ИначеЕсли Сервер Тогда это в общем модуле 1, (стоят галки — кдиент, сервер, внешнее соединение) Функции ПолучитьАктивныхПользователейКлиент, ПолучитьАктивныхПользователейСервер в другом модуле (галки — сервер, привелигированный).

                              изменяемое значение — нельзя на сервере

                              + например, такое значение нельзя написать при объявлении функции как значение по умолчанию, типа

                              В общем: у тебя в функции на сервер передаётся объект, который на сервере не может быть инициализирован.

                              Хм… мне впринципе в привелигированном модуле надо выполнить только

                              возьми функцию в

                              + ПолучитьСоединенияИнформационнойБазы;, а все остальное запихнуть в обычный??

                              какую. ПолучитьАктивныхПользователейКлиент ?? она выполняется в модуле у которого только «Сервер». Он разве будет выполнять на клиенте??

                              вычислить в общем то не сложно где ошибка.. достаточно после каждого действия что нить воткнуть и при вылете посмотреть ..

                              + какая хрен разница где ты список пользователей получишь

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

                              Все равно ошибка… вывод- НЕ РАБОТАЕТ ИЗНАЧАЛЬНО!=((

                              На какой строке ошибка случается, можешь по-человечески указать? И описание параметров функции, при вызове которой ругается.

                              Млин.. что тут не понятного… она одна…. Вопрос возник следующий — как можно определить в каком варианте запущена баз в «файловом» или «клиент-серверном»?

                              Объект «Массив» допускает обмен с сервером, так что попробуй:

                              + Должно работать и на сервере, и на клиенте…

                              Не работает в привилигированном модуле при работе в варианте клиент-сервер. Это факт! Сделал вот так: ……В том же модуле: Функция ПолучитьАктивныхПользователейКлиентСервер

                              И где в указанной строке то, на что указывает ошибка? «Попытка передачи мутабельного значения 1-го параметра метода СерверОбновитьПользователей», а конкретнее: 1. где первый параметр? 2. где метод СерверОбновитьПользователей?

                              1) ну как видишь, функция без параметров. 2) см и . В жаловалась на функцию «ПолучитьАктивныхПользователейКлиент». (СерверОбновитьПользователей — это название старой функции в модуле.. уже не восстановлю)..

                              М-да. Почему тогда вот это работает на клиент/сервере у меня в модуле приложения в процедуре «ПередНачаломРаботыСистемы»:

                              у тя у всех пользователей стоят права «Административные функции» и «Активные пользователи»?? У меня, тока у меня.

                              добавил пользователям право «Активные пользователи». и сделал как в .

                              1с мутабельные значения что это

                              Иногда в технической документации встречается понятие “мутабельный тип”. Например, в описании функции ЗначениеЗаполнено (ValueIsFilled) мы встречаем:
                              Функция проверяет, отличается ли переданное значение от значения по умолчанию того же типа.
                              Не работает с мутабельными значениями. При передаче мутабельного значения функция вызывает исключение.

                              И возникает вопрос, а что такое “мутабельное значение”?

                              Мутабельный тип (от англ. Mutable – изменчевый) – сложный тип данных (как правило – объекты), которые после своего создания допускают изменение своих свойств.

                              Ошибка возникает при попытке использования функции ЗначениеЗаполнено() для проверки заполнения объекта агрегатного типа.

                              К таким объектам относятся программные объекты типа:

                              1. СправочникОбъект, СправочникСписок, СправочникВыборка, ДокументОбъект, ДокументСписок, ДокументВыборка и т.п.;
                              2. ОбработкаОбъект, ОтчетОбъект и т.п.
                              3. ТабличныйДокумент, ТекстовыйДокумент, ДиаграммаГанта и т.п.;

                              Указанные объекты поддерживают только сравнение со значением Неопределено :

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

                              СПРАВКА:

                              Мутабельный тип (англ. 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: Клиент- серверные вызовы: //v8book.ru/public/86838/

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

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

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

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

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

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

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

                              Проверка мутабельных значений на заполненность

                              Данная ошибка характерна для 1С 8 версии, преимущественно проявлялась при переходе с версии 8.1. Раньше в типовых конфигурациях была встроенная глобальная функция НеЗаполнено(), которая умела проверять более продумано, но не медленнее и не так универсально. Замена ее на встроенную провоцировало такие ошибки.

                              Сейчас ошибка возникает, когда переменной неопределенного(произвольного) типа, присваивается значение, которое невозможно проверить на заполненность.

                              Полное сообщение ошибки:

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

                              Причина этой ошибки кроется в некорректном типе переменных:

                              • Имя общего модуля (в моём случае совпадало с именем переменной)
                              • Форма
                              • Элементы формы
                              • ТаблицаЗначений, СписокЗначений, ДеревоЗначений
                              • Com-объект
                              • Другие сложные типы, не связанные с данными системы кроме примитивных (дата, строка, число)

                              Исправление ошибки

                              Заключается изменении программного кода для отсутствии такой проверки:

                              • отсутствие такого типа для данной переменной
                              • добавление дополнительной проверки на тип: например

                              Если ТипЗнч(МояПеременная)<>Тип(«ОбщийМодуль») и ЗначениеЗаполнено(МояПеременная) Тогда

                              Люди глупо доверчивы… Вся реклама мира основана на трех принципах: «Хорошо, много и даром». Поэтому можно давать скверно, мало и дорого.

                              — Александр Грин

                              Почему в файловой базе работает, а в клиент-серверной возникает ошибка «Попытка передачи с клиента на сервер мутабельного значения 1-го параметра. »?

                              1С 8.3, УПП 1.3 (обычное приложение), база клиент-серверная.
                              Имеется подписка на событие Обработка проведения документа Требование-накладная. Обработчик данной подписки находится в общем модуле.
                              При проведении документа Требование-накладная возникает следующая ошибка:
                              5cb625e1d2bc2968172994.png
                              , которая отсутствовала в файловом варианте данной базы.
                              Как её исправить?
                              Ошибка появляется до начала выполнения тела процедуры:
                              5cb6282dc7401818975602.png

                              • Вопрос задан более трёх лет назад
                              • 2873 просмотра
                              • Facebook
                              • Вконтакте
                              • Twitter

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

                              2) При программировании на платформе 1С при работе с базой данных мы работаем или с Ссылками, или с полученными с их помощью Объектами. Ссылка отличается от Объекта своей неизменностью — это просто адрес с указанием типа данных и уникального идентификатора. Но Объект в отличии от Ссылки можно изменить и записать назад в базу по адресу этой Ссылки. Думаю это тоже понятно.

                              3) Что вы пытаетесь сделать? У вас локально в памяти есть измененный Объект (в переменной Источник) и вы хотите передать его на сервер для дальнейшей параллельной обработки и тут и там. К сожалению мы работаем не на квантовых компьютерах и потому эффект запутанности нам недоступен. Мы можем править Объект или локально, или на сервере. Но не одновременно в двух местах!

                              Итого. Судя по тексту вашей процедуры, вам вообще Источник передавать не нужно — передавайте сразу ДокументОснования. Но если предполагается, что на сервере Объект нужно изменить, то а) запишите его локально, б) передайте на него Ссылку, в) на сервере прочитайте по Cсылке, г) после изменения на сервере запишите Объект в базу, д) после возвращения потока управления на клиент, прочитайте Объект из базы по Ссылке.

                              1с мутабельные значения что это

                              Иногда в технической документации встречается понятие «мутабельный тип». Например, в описании функции ЗначениеЗаполнено (ValueIsFilled) мы встречаем:
                              Функция проверяет, отличается ли переданное значение от значения по умолчанию того же типа.
                              Не работает с мутабельными значениями. При передаче мутабельного значения функция вызывает исключение.

                              И возникает вопрос, а что такое «мутабельное значение»?

                              Мутабельный тип (от англ. Mutable — изменчивый) — сложный тип данных (как правило — объекты), который после своего создания допускает изменение своих свойств.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *