Разработка и Конфигурация · 11 мин
Ошибка «Проверка мутабельных значений на заполненность не поддерживается» в 1С: что это и как исправить
Что означает ошибка «Проверка мутабельных значений на заполненность не поддерживается» в 1С, где она возникает и как исправить код проверки заполнения.
Ошибка «Проверка мутабельных значений на заполненность не поддерживается» возникает в 1С:Предприятии, когда код пытается проверить на заполненность значение, хранящееся в изменяемом (мутабельном) контейнере — чаще всего в реквизите формы типа «ДанныеФормыСтруктура», «ДанныеФормыКоллекция» или в значении, обёрнутом платформой при передаче между клиентом и сервером. Стандартный механизм проверки заполнения умеет работать с примитивными типами, ссылками и объектами данных, но не с изменяемыми структурами формы, поэтому платформа прерывает операцию с этим сообщением.
Чаще всего проблему видят разработчики и внедренцы при работе с управляемыми формами: при вызове ПроверитьЗаполнение(), при использовании конструкции ЗначениеЗаполнено() над данными формы, а также при включённой автоматической проверке заполнения реквизитов, чей тип задан некорректно. Пользователь без доступа к конфигуратору самостоятельно исправить ситуацию не может — требуется правка кода или настроек объекта.
Ниже разобрано, что такое мутабельные значения в терминах платформы, в каких сценариях возникает ошибка, как локализовать проблемное место и какие варианты исправления считаются корректными.
Что такое мутабельные значения в 1С
Мутабельными (изменяемыми) называются объекты, чьё внутреннее состояние можно менять после создания без порождения нового экземпляра. В контексте ошибки речь идёт прежде всего о данных управляемой формы: ДанныеФормыСтруктура, ДанныеФормыКоллекция, ДанныеФормыДерево и связанных с ними обёртках. Платформа хранит их особым образом, чтобы отслеживать модифицированность и синхронизировать состояние между тонким клиентом и сервером.
Из-за этого особого хранения ряд универсальных операций над такими объектами недоступен. Проверка заполнения — одна из них: механизм не знает, что считать «пустым» состоянием сложной изменяемой структуры, ведь у неё могут быть десятки вложенных полей, часть из которых заполнена, а часть нет.
К немутабельным (иммутабельным) относятся примитивные типы — строка, число, дата, булево, а также ссылки на объекты базы данных. Для них проверка заполненности определена однозначно: пустая строка, нулевое число, пустая дата, пустая ссылка. Именно поэтому ошибка никогда не возникает на простых реквизитах, но появляется на составных данных формы.
В каких сценариях возникает ошибка
Проверка заполнения реквизита формы
Самая частая ситуация — у реквизита управляемой формы включён признак «Проверять заполнение» (свойство «Проверка заполнения» установлено в «Выдавать ошибку»), а тип реквизита — составной или это реквизит, содержащий данные формы. При записи или выполнении команды платформа запускает штатную проверку, натыкается на мутабельное значение и выдаёт сообщение.
Явный вызов ПроверитьЗаполнение()
Метод ПроверитьЗаполнение() корректно работает для объектов данных (справочников, документов), но если в коде его вызывают у объекта, которым на самом деле оказались данные формы или иная изменяемая структура, возникает та же ошибка. Такое бывает при рефакторинге, когда метод объекта переносят в форму, не скорректировав логику.
Функция ЗначениеЗаполнено() над данными формы
Конструкция вида Если ЗначениеЗаполнено(Объект) Тогда ..., где Объект — реквизит формы типа «ДанныеФормыСтруктура» (типичное имя основного реквизита формы документа), в ряде контекстов также приводит к этому сообщению, потому что платформа не может определить заполненность изменяемой обёртки.
Вероятна автоматическая проверка заполнения реквизита формы
Ищите в коде ПроверитьЗаполнение() или ЗначениеЗаполнено()
Проверка применена к данным формы — мутабельному типу
Остановка по ошибке покажет точную строку кода
Как локализовать проблемное место
Первый шаг — воспроизвести ошибку под отладчиком. Откройте конфигуратор, запустите отладку, включите остановку по ошибке (меню «Отладка» → «Остановка по ошибке») и повторите действие, которое приводит к сообщению. Платформа остановится на строке, где проверка была инициирована, а стек вызовов покажет, откуда она вызвана — из вашего кода или из стандартного обработчика записи.
Если остановка приводит в стандартный модуль, поднимитесь по стеку до первого своего метода — именно там находится точка, которую нужно исправлять. Обратите внимание на тип переменной в табло: если он начинается с «ДанныеФормы», вы нашли мутабельное значение.
Когда ошибка возникает без явного вызова проверки в коде, проверьте свойства реквизитов формы: откройте форму в конфигураторе, пройдите по списку реквизитов и посмотрите, у каких установлена проверка заполнения «Выдавать ошибку» при составном или нетипичном типе значения.
- 1Включите в конфигураторе остановку по ошибке и воспроизведите проблему
- 2Посмотрите в табло тип переменной, к которой применяется проверка
- 3Если тип — ДанныеФормыСтруктура или коллекция, найдите, кто инициировал проверку: ваш код или свойства реквизита формы
- 4Проверьте у реквизитов формы свойство «Проверка заполнения»
- 5Определите, какое конкретно поле внутри структуры должно быть заполнено
Способы исправления
Проверять конкретные поля вместо целого объекта
Самый надёжный вариант — заменить проверку всего объекта на проверку конкретных полей. Вместо проверки заполненности данных формы проверяйте отдельные реквизиты: Если Не ЗначениеЗаполнено(Объект.Номенклатура) Тогда .... Каждое такое поле имеет примитивный тип или ссылку, и проверка работает корректно.
Преобразовать данные формы в значение
Если нужно проверить объект целиком, преобразуйте данные формы в реальный объект методом РеквизитФормыВЗначение("Объект") на сервере, выполните ПроверитьЗаполнение() у полученного объекта, а при необходимости верните результат обратно через ЗначениеВРеквизитФормы(). Учтите, что это серверный вызов с передачей данных — на больших объектах он ощутимо стоит по производительности.
Отключить автоматическую проверку и реализовать свою
Если ошибку вызывает штатная проверка реквизита формы, установите у реквизита «Проверка заполнения» в значение «Не проверять» и реализуйте контроль в обработчике ОбработкаПроверкиЗаполнения формы или модуля объекта, явно проверяя нужные поля и добавляя сообщения пользователю через СообщениеПользователю с привязкой к полю формы.
Сравнение вариантов исправления
Просто и быстро, работает на клиенте и сервере; не подходит, когда нужна комплексная проверка объекта
Использует штатную логику объекта; требует серверного вызова и затратна на больших данных
Полный контроль и корректные сообщения с привязкой к полям; больше кода, нужно поддерживать при изменении состава полей
Частые ошибки при исправлении
Распространённая ошибка — «заглушить» проблему, обернув проверку в попытку/исключение. Ошибка перестаёт показываться, но и реальный контроль заполнения пропадает: пользователь сможет сохранить объект с пустыми обязательными полями, что позже приведёт к сбоям в отчётах и обменах.
Вторая типичная ошибка — вызывать РеквизитФормыВЗначение в клиентском контексте. Метод доступен только на сервере, поэтому проверку нужно выносить в серверную процедуру с директивой &НаСервере, иначе появится новая ошибка компиляции или выполнения.
Третья ошибка — менять тип реквизита формы, не разобравшись в последствиях. Если реквизит является основным (например, «Объект» в форме документа), изменение его типа или удаление нарушит работу всей формы, включая стандартные команды записи и проведения.
Проверка результата после исправления
После правки повторите исходный сценарий: откройте форму, оставьте обязательное поле пустым и попытайтесь записать объект. Корректное поведение — понятное сообщение о незаполненном поле с подсветкой именно этого поля, без системной ошибки о мутабельных значениях.
Затем заполните все обязательные поля и убедитесь, что запись и проведение проходят штатно, а модифицированность формы сбрасывается. Дополнительно проверьте сценарии копирования объекта и работы через тонкий клиент и веб-клиент, если они используются, — поведение данных формы в разных клиентах может отличаться.
Как проверить результат
Сообщение о незаполненном поле с привязкой к нему
Системная ошибка о мутабельных значениях
Объект записывается, модифицированность сбрасывается
Ошибка проверки или требование перезаписи
Проверка идёт по примитивным типам и ссылкам
Проверка применяется к ДанныеФормыСтруктура
Часто задаваемые вопросы
Может ли обычный пользователь исправить эту ошибку без конфигуратора?
Нет. Ошибка связана с кодом или настройками объектов конфигурации, поэтому исправление требует доступа к конфигуратору и прав на изменение. Пользователю следует зафиксировать текст ошибки, действие, при котором она возникает, и передать информацию разработчику или специалисту поддержки.
Почему ошибка появилась после обновления конфигурации?
При обновлении могли измениться типы реквизитов форм, состав обработчиков проверки заполнения или поведение платформы. Также возможен конфликт доработок: ранее добавленный код проверки стал применяться к реквизиту, чей тип изменился на данные формы. Помогает сравнение конфигураций и отладка с остановкой по ошибке.
Чем ЗначениеЗаполнено() отличается от ПроверитьЗаполнение()?
ЗначениеЗаполнено() — функция, возвращающая булево для одного значения: она удобна для точечных условий в коде. ПроверитьЗаполнение() — метод объектов данных, который запускает комплексную проверку всех контролируемых реквизитов и формирует сообщения пользователю. Оба механизма не работают с мутабельными данными формы как единым целым.
Возникает ли ошибка в обычных формах?
Типичное проявление связано именно с управляемыми формами и их типами данных. В обычных формах реквизиты хранятся иначе, и такая обёртка не применяется. Однако похожее сообщение теоретически возможно везде, где проверка заполнения применяется к типу, для которого она не определена.
Как проверить табличную часть формы на наличие строк?
Для табличной части, представленной как ДанныеФормыКоллекция, проверяйте количество строк: Если Объект.Товары.Количество() = 0 Тогда .... Для контроля заполнения колонок перебирайте строки циклом и проверяйте каждое поле отдельно — это поддерживаемые операции, не вызывающие ошибки мутабельных значений.
Можно ли отключить проверку заполнения глобально?
Глобального безопасного отключения нет, и делать это не рекомендуется: проверка заполнения защищает целостность данных. Правильный подход — точечно управлять свойством «Проверка заполнения» у конкретных реквизитов и реализовывать собственную логику в обработчиках, где штатный механизм не подходит.
Что важно запомнить
Ошибка означает, что проверка заполнения применена к изменяемым данным формы. Локализуйте место отладчиком, замените проверку целого объекта на проверку конкретных полей или преобразуйте данные формы в значение на сервере. Не скрывайте ошибку через Попытка/Исключение — это отключает контроль данных.