Поле не заполнено: снимаем обязательность реквизита в 1С 8.3
Содержание
Чтобы убрать обязательное поле в 1С, откройте реквизит в конфигураторе и в палитре свойств поставьте Проверка заполнения = Не проверять, затем обновите конфигурацию базы данных (F7). Если конфигурация типовая и стоит на поддержке, то же самое делается через расширение: в обработчике ОбработкаПроверкиЗаполнения реквизит удаляют из массива ПроверяемыеРеквизиты.
Типичная ситуация: бухгалтер проводит документ, а 1С отвечает Поле "Склад" не заполнено, хотя склад для этой операции не нужен. Красное подчёркивание поля, сообщение и отказ в проведении — это три проявления одной и той же проверки. Ниже разобрано, где она живёт и как её снять, не сломав обновления.
Откуда берётся обязательность поля: ищем источник проверки
Прежде чем что-то менять, выясните, кто именно требует заполнить поле. Источников четыре, и способ отключения у каждого свой.
| Источник | Как узнать | Чем снимается |
|---|---|---|
🔹 Свойство реквизита Проверка заполнения | В конфигураторе у реквизита стоит Выдавать ошибку | Конфигуратор или расширение |
| 🔹 Код в модуле объекта | Обработчик ОбработкаПроверкиЗаполнения добавляет реквизит или ставит Отказ = Истина | Правка кода или расширение |
| 🔹 Код в модуле формы | Обработчик ОбработкаПроверкиЗаполненияНаСервере или проверки перед записью | Правка формы или расширение |
| 🔹 Настройки учёта в режиме Предприятие | Поле стало обязательным после включения какой-то функции | Настройкой программы, без конфигуратора |
Быстрый способ диагностики:
- Скопируйте точный текст сообщения, например
Поле "Склад" не заполнено. - В конфигураторе откройте
Правка → Глобальный поиск(Ctrl+Shift+F) и поищите имя реквизита или кусок текста сообщения. - Если текст найден в модуле — проверка программная. Если не найден, а у реквизита стоит
Выдавать ошибку— проверка платформенная, и сообщение формирует сама платформа.
Стандартное сообщение платформы всегда строится по шаблону «Поле “<синоним реквизита>” не заполнено». Если текст другой, например «Укажите склад отгрузки», почти наверняка это код разработчика.
Можно ли убрать обязательное поле в режиме Предприятие
Прямой галочки «сделать поле необязательным» в пользовательском режиме нет. Обязательность задаётся в метаданных конфигурации, и пользователь с любыми правами её не отключит.
Но часть проверок в типовых конфигурациях включается настройками. Когда поле стало обязательным «вдруг», после изменения параметров, начните с них:
- 📌 вспомните, что меняли в разделе
Администрированиеи в настройках функциональности незадолго до появления ошибки; - 📌 проверьте учётную политику и параметры учёта: некоторые аналитики становятся обязательными, только когда по ним включён учёт;
- 📌 сравните с другой базой той же конфигурации, где поле не требуется.
Если источник не найден в настройках, значит, обязательность заложена в конфигурацию. Дальше нужен конфигуратор и права администратора.
Снимаем флаг обязательности в конфигураторе
Это основной способ для нетиповых баз и для конфигураций, снятых с поддержки.
- Сделайте выгрузку информационной базы:
Администрирование → Выгрузить информационную базув конфигураторе. Файл.dt— ваша страховка. - Откройте конфигурацию:
Конфигурация → Открыть конфигурацию. - В дереве найдите объект: справочник, документ или регистр. Раскройте ветку
Реквизитыи дважды щёлкните нужный реквизит. - В палитре свойств найдите
Проверка заполненияи выберитеНе проверять. - Сохраните и выполните
Конфигурация → Обновить конфигурацию базы данных(F7). - Пользователям, которые были в базе, нужно перезапустить 1С: изменения применяются к новым сеансам.
Стандартные реквизиты
У справочников и документов есть реквизиты, которых нет в ветке Реквизиты: Наименование, Код, Владелец, Родитель. Их свойства открываются кнопкой Стандартные реквизиты в окне редактирования объекта (закладка Данные). У каждого — та же Проверка заполнения.
Что платформа считает «незаполненным»
Флаг Выдавать ошибку проверяет только одно: значение реквизита пустое. Что такое «пусто», зависит от типа:
| Тип реквизита | Пустое значение |
|---|---|
| 🔹 Строка | Пустая строка или строка из одних пробелов |
| 🔹 Число | Ноль |
| 🔹 Дата | Пустая дата 01.01.0001 |
| 🔹 Ссылка на справочник или документ | Пустая ссылка |
Для булевых реквизитов флаг обязательности обычно не применяют: у галочки всегда есть значение, и требовать её «заполнить» бессмысленно — нужно проверять условие в коде.
Отсюда практический вывод. Если реквизит составного типа или в нём стоит значение по умолчанию, проверка может не срабатывать вовсе, хотя флаг включён. И наоборот: снятие флага не отменяет проверок на корректность, например контроля даты запрета изменения или заполнения связанных полей.
Если конфигурация на поддержке
У типовой конфигурации объекты заблокированы замком. Чтобы править их напрямую, придётся включить возможность изменения в Конфигурация → Поддержка → Настройка поддержки и перевести объект в режим «Редактируется с сохранением поддержки».
Каждое изменение типового объекта усложняет следующее обновление. При обновлении придётся сравнивать и объединять конфигурации вручную, а «маленькая правка флажка» легко теряется. Для типовых баз используйте расширение из следующего раздела.
Снимаем обязательность через расширение конфигурации
Расширения появились в платформе 8.3.6. Для этой задачи подходит любая актуальная платформа: основная конфигурация остаётся на полной поддержке, правка лежит отдельно и переживает обновления.
Механизм простой. Платформа перед проверкой заполнения передаёт в обработчик ОбработкаПроверкиЗаполнения массив ПроверяемыеРеквизиты. В нём уже лежат имена всех реквизитов с флагом Выдавать ошибку. Удалите из массива нужное имя — и платформа его не проверит.
Порядок действий:
Конфигурация → Расширения конфигурации→ кнопкаДобавить. Задайте имя, напримерНеобязательныеПоля, назначение — «Адаптация».- Откройте конфигурацию расширения. В основной конфигурации (левое дерево) найдите документ, щёлкните правой кнопкой и выберите
Добавить в расширение. - В расширении откройте модуль объекта этого документа.
- Если в типовом модуле уже есть
ОбработкаПроверкиЗаполнения, щёлкните по нему в основном модуле и выберитеДобавить в расширение→ вариантВызывать после. Если обработчика нет, создайте его в расширении через свойства объекта. - Вставьте код ниже, сохраните расширение и обновите конфигурацию базы данных.
&После("ОбработкаПроверкиЗаполнения")
Процедура НеобязательныеПоля_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Индекс = ПроверяемыеРеквизиты.Найти("Склад");
Если Индекс <> Неопределено Тогда
ПроверяемыеРеквизиты.Удалить(Индекс);
КонецЕсли;
КонецПроцедуры
Аннотация &После выбрана намеренно: сначала отработает типовой код и добавит в массив свои реквизиты, а затем расширение уберёт лишний. С &Перед типовой код может вернуть реквизит обратно.
Проверку можно снимать по условию. Например, не требовать склад только для определённого вида операции: оберните удаление в Если ВидОперации = ... Тогда. Это честнее, чем отключать проверку для всех.
Расширение не поможет, если типовой код сам выдаёт сообщение и ставит Отказ = Истина. Такие места придётся перехватывать аннотацией &Вместо или &ИзменениеИКонтроль в конкретной процедуре. Это уже работа программиста: после обновления типовой процедуры перехват нужно проверять.
Программное отключение проверки заполнения в коде
В своей конфигурации проще поправить сам модуль объекта. Тот же приём с массивом работает и без расширения.
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ВидОперации = Перечисления.ВидыОпераций.Услуги Тогда
Индекс = ПроверяемыеРеквизиты.Найти("Склад");
Если Индекс <> Неопределено Тогда
ПроверяемыеРеквизиты.Удалить(Индекс);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Здесь ВидыОпераций и Услуги — условные имена для примера, подставьте свои.
Теперь важная деталь, которую часто упускают. Платформенная проверка заполнения запускается при интерактивной записи из формы или при явном вызове метода ПроверитьЗаполнение(). Программная запись Объект.Записать() сама по себе ничего не проверяет.
Отсюда два вывода:
- 🧩 если обработка загружает документы кодом и они записываются без склада, это нормально — проверка просто не вызывалась;
- 🧩 если ваш код вызывает
ПроверитьЗаполнение()перед записью, именно он и выдаёт ошибку, и снимать нужно его или условие вокруг него.
Красное подчёркивание на форме
Подчёркивание пустого поля — визуальная подсказка. За него отвечает свойство элемента формы Автоотметка незаполненного. Если в реквизите проверку уже сняли, а подчёркивание осталось, откройте форму, выделите поле и поставьте этому свойству Нет. Само по себе подчёркивание ничего не блокирует.
Обязательные поля в табличной части
С табличными частями есть два разных уровня проверки, и их путают.
| Что проверяется | Где флаг | Что видит пользователь |
|---|---|---|
| 🔸 Табличная часть целиком | Проверка заполнения у самой табличной части | Документ нельзя записать без строк |
| 🔸 Колонка в каждой строке | Проверка заполнения у реквизита табличной части | Сообщение по каждой строке с пустой колонкой |
В массиве ПроверяемыеРеквизиты колонка записывается через точку: "Товары.Количество". Удаляется она так же, как обычный реквизит.
Частая задача — требовать колонку не во всех строках. Например, количество обязательно для товаров, но не для разовых услуг. Платформа так не умеет: флаг действует на все строки. Решение — убрать колонку из массива и проверить строки самостоятельно.
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Индекс = ПроверяемыеРеквизиты.Найти("Товары.Количество");
Если Индекс <> Неопределено Тогда
ПроверяемыеРеквизиты.Удалить(Индекс);
КонецЕсли;
Для Каждого Строка Из Товары Цикл
Если Не Строка.ЭтоУслуга И Строка.Количество = 0 Тогда
НомерСтроки = Формат(Строка.НомерСтроки, "ЧГ=0");
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = СтрШаблон("Не указано количество в строке %1", НомерСтроки);
Сообщение.Поле = СтрШаблон("Товары[%1].Количество",
Формат(Строка.НомерСтроки - 1, "ЧН=0; ЧГ=0"));
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
ЭтоУслуга — пример реквизита строки, по которому решается, нужна ли проверка. Индекс в поле Товары[N] считается с нуля, поэтому из номера строки вычитаем единицу. Формат ЧН=0 нужен, чтобы для первой строки получился 0, а не пустая строка. Благодаря полю Сообщение.Поле при щелчке по сообщению курсор встанет в нужную ячейку.
Для числовых колонок «пусто» — это ноль. Если снять проверку с количества, документ запишется с нулём в строке, и движения по регистрам могут получиться нулевыми. Снимайте проверку только там, где ноль действительно допустим.
Поле всё равно обязательное: ошибки после правки
Флаг сняли, а сообщение осталось — самая частая жалоба. Разберите симптом по таблице.
Про обмены отдельно. При загрузке данных обменом объекты пишутся программно, и проверка заполнения в этот момент не вызывается. Поэтому «обязательное поле в правилах обмена» обычно означает другое: правило не заполняет реквизит в приёмнике. Убирать обязательность в конфигурации ради этого не нужно, правильнее настроить правило переноса реквизита.