К статье
Практический материал

Разработка и Конфигурация · 11 мин

Ошибка «Проверка мутабельных значений на заполненность не поддерживается» в 1С: что это и как исправить

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

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

Чаще всего проблему видят разработчики и внедренцы при работе с управляемыми формами: при вызове ПроверитьЗаполнение(), при использовании конструкции ЗначениеЗаполнено() над данными формы, а также при включённой автоматической проверке заполнения реквизитов, чей тип задан некорректно. Пользователь без доступа к конфигуратору самостоятельно исправить ситуацию не может — требуется правка кода или настроек объекта.

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

Что такое мутабельные значения в 1С

Мутабельными (изменяемыми) называются объекты, чьё внутреннее состояние можно менять после создания без порождения нового экземпляра. В контексте ошибки речь идёт прежде всего о данных управляемой формы: ДанныеФормыСтруктура, ДанныеФормыКоллекция, ДанныеФормыДерево и связанных с ними обёртках. Платформа хранит их особым образом, чтобы отслеживать модифицированность и синхронизировать состояние между тонким клиентом и сервером.

Из-за этого особого хранения ряд универсальных операций над такими объектами недоступен. Проверка заполнения — одна из них: механизм не знает, что считать «пустым» состоянием сложной изменяемой структуры, ведь у неё могут быть десятки вложенных полей, часть из которых заполнена, а часть нет.

К немутабельным (иммутабельным) относятся примитивные типы — строка, число, дата, булево, а также ссылки на объекты базы данных. Для них проверка заполненности определена однозначно: пустая строка, нулевое число, пустая дата, пустая ссылка. Именно поэтому ошибка никогда не возникает на простых реквизитах, но появляется на составных данных формы.

В каких сценариях возникает ошибка

Проверка заполнения реквизита формы

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

Явный вызов ПроверитьЗаполнение()

Метод ПроверитьЗаполнение() корректно работает для объектов данных (справочников, документов), но если в коде его вызывают у объекта, которым на самом деле оказались данные формы или иная изменяемая структура, возникает та же ошибка. Такое бывает при рефакторинге, когда метод объекта переносят в форму, не скорректировав логику.

Функция ЗначениеЗаполнено() над данными формы

Конструкция вида Если ЗначениеЗаполнено(Объект) Тогда ..., где Объект — реквизит формы типа «ДанныеФормыСтруктура» (типичное имя основного реквизита формы документа), в ряде контекстов также приводит к этому сообщению, потому что платформа не может определить заполненность изменяемой обёртки.

Момент появленияПри записи или проведении

Вероятна автоматическая проверка заполнения реквизита формы

Момент появленияПри выполнении своей команды

Ищите в коде ПроверитьЗаполнение() или ЗначениеЗаполнено()

Объект в ошибкеДанныеФормы...

Проверка применена к данным формы — мутабельному типу

Где смотретьСтек вызовов в конфигураторе

Остановка по ошибке покажет точную строку кода

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

Первый шаг — воспроизвести ошибку под отладчиком. Откройте конфигуратор, запустите отладку, включите остановку по ошибке (меню «Отладка» → «Остановка по ошибке») и повторите действие, которое приводит к сообщению. Платформа остановится на строке, где проверка была инициирована, а стек вызовов покажет, откуда она вызвана — из вашего кода или из стандартного обработчика записи.

Если остановка приводит в стандартный модуль, поднимитесь по стеку до первого своего метода — именно там находится точка, которую нужно исправлять. Обратите внимание на тип переменной в табло: если он начинается с «ДанныеФормы», вы нашли мутабельное значение.

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

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

Способы исправления

Проверять конкретные поля вместо целого объекта

Самый надёжный вариант — заменить проверку всего объекта на проверку конкретных полей. Вместо проверки заполненности данных формы проверяйте отдельные реквизиты: Если Не ЗначениеЗаполнено(Объект.Номенклатура) Тогда .... Каждое такое поле имеет примитивный тип или ссылку, и проверка работает корректно.

Преобразовать данные формы в значение

Если нужно проверить объект целиком, преобразуйте данные формы в реальный объект методом РеквизитФормыВЗначение("Объект") на сервере, выполните ПроверитьЗаполнение() у полученного объекта, а при необходимости верните результат обратно через ЗначениеВРеквизитФормы(). Учтите, что это серверный вызов с передачей данных — на больших объектах он ощутимо стоит по производительности.

Отключить автоматическую проверку и реализовать свою

Если ошибку вызывает штатная проверка реквизита формы, установите у реквизита «Проверка заполнения» в значение «Не проверять» и реализуйте контроль в обработчике ОбработкаПроверкиЗаполнения формы или модуля объекта, явно проверяя нужные поля и добавляя сообщения пользователю через СообщениеПользователю с привязкой к полю формы.

Сравнение вариантов исправления

Проверка отдельных полей

Просто и быстро, работает на клиенте и сервере; не подходит, когда нужна комплексная проверка объекта

РеквизитФормыВЗначение + ПроверитьЗаполнение

Использует штатную логику объекта; требует серверного вызова и затратна на больших данных

Своя проверка в ОбработкаПроверкиЗаполнения

Полный контроль и корректные сообщения с привязкой к полям; больше кода, нужно поддерживать при изменении состава полей

Частые ошибки при исправлении

Распространённая ошибка — «заглушить» проблему, обернув проверку в попытку/исключение. Ошибка перестаёт показываться, но и реальный контроль заполнения пропадает: пользователь сможет сохранить объект с пустыми обязательными полями, что позже приведёт к сбоям в отчётах и обменах.

Вторая типичная ошибка — вызывать РеквизитФормыВЗначение в клиентском контексте. Метод доступен только на сервере, поэтому проверку нужно выносить в серверную процедуру с директивой &НаСервере, иначе появится новая ошибка компиляции или выполнения.

Третья ошибка — менять тип реквизита формы, не разобравшись в последствиях. Если реквизит является основным (например, «Объект» в форме документа), изменение его типа или удаление нарушит работу всей формы, включая стандартные команды записи и проведения.

Типичные ошибки
01
Обёртывание проверки в Попытка/Исключение — ошибка скрыта, но контроль заполнения фактически отключён
02
Вызов РеквизитФормыВЗначение на клиенте — метод доступен только на сервере, получите новую ошибку
03
Проверка ЗначениеЗаполнено() по целому Объекту формы вместо конкретных полей — повторное воспроизведение той же проблемы
04
Изменение типа основного реквизита формы — ломаются стандартные обработчики записи и проведения

Проверка результата после исправления

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

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

Контрольные точки

Как проверить результат

Запись с пустым обязательным полем
Норма

Сообщение о незаполненном поле с привязкой к нему

Тревожный признак

Системная ошибка о мутабельных значениях

Запись с заполненными полями
Норма

Объект записывается, модифицированность сбрасывается

Тревожный признак

Ошибка проверки или требование перезаписи

Стек вызовов под отладкой
Норма

Проверка идёт по примитивным типам и ссылкам

Тревожный признак

Проверка применяется к ДанныеФормыСтруктура

Часто задаваемые вопросы

Может ли обычный пользователь исправить эту ошибку без конфигуратора?

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

Почему ошибка появилась после обновления конфигурации?

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

Чем ЗначениеЗаполнено() отличается от ПроверитьЗаполнение()?

ЗначениеЗаполнено() — функция, возвращающая булево для одного значения: она удобна для точечных условий в коде. ПроверитьЗаполнение() — метод объектов данных, который запускает комплексную проверку всех контролируемых реквизитов и формирует сообщения пользователю. Оба механизма не работают с мутабельными данными формы как единым целым.

Возникает ли ошибка в обычных формах?

Типичное проявление связано именно с управляемыми формами и их типами данных. В обычных формах реквизиты хранятся иначе, и такая обёртка не применяется. Однако похожее сообщение теоретически возможно везде, где проверка заполнения применяется к типу, для которого она не определена.

Как проверить табличную часть формы на наличие строк?

Для табличной части, представленной как ДанныеФормыКоллекция, проверяйте количество строк: Если Объект.Товары.Количество() = 0 Тогда .... Для контроля заполнения колонок перебирайте строки циклом и проверяйте каждое поле отдельно — это поддерживаемые операции, не вызывающие ошибки мутабельных значений.

Можно ли отключить проверку заполнения глобально?

Глобального безопасного отключения нет, и делать это не рекомендуется: проверка заполнения защищает целостность данных. Правильный подход — точечно управлять свойством «Проверка заполнения» у конкретных реквизитов и реализовывать собственную логику в обработчиках, где штатный механизм не подходит.

Итог

Что важно запомнить

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