Имя: Пароль:
1C
1С v8
Проверка заполнения по условию
0 kogotaz
 
17.05.26
17:03
Управляемая форма констант. Константы: Поле1 (булево), Поле2 (строка).
Почему не работает код? В Поле1 ставлю "истина", Поле2 не заполняю. Дает записать форму.

&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
    Если НаборКонстант.Поле1 Тогда
        ПроверяемыеРеквизиты.Добавить("Поле2");
    КонецЕсли;
КонецПроцедуры
1 kogotaz
 
17.05.26
19:11
Понимаю, что вопрос глупый, но что-то не могу разобраться
2 evorle145
 
17.05.26
20:13
Основная причина: неверное имя процедуры. В 1С имя обработчика должно точно совпадать с именем события платформы. Директива &НаСервере указывается отдельно, но добавлять НаСервере в само имя процедуры нельзя. Платформа просто не находит обработчик ОбработкаПроверкиЗаполнения и не вызывает ваш код.
✅ Правильный вариант:
1c
123456
🔍 Почему это происходит:
Платформа 1С ищет обработчик по строгому имени: ОбработкаПроверкиЗаполнения.
Суффикс НаСервере в имени процедуры (ОбработкаПроверкиЗаполненияНаСервере) нарушает привязку события. Код существует, но никогда не выполняется.
🛠 Если после исправления всё ещё не работает, проверьте:
Подписка на событие
Откройте свойства формы → раздел События → убедитесь, что в строке ОбработкаПроверкиЗаполнения выбран ваш обработчик (после переименования обычно подставляется автоматически).
Ручная установка Отказ (fallback)
В некоторых конфигурациях или старых релизах платформа может не отрабатывать ПроверяемыеРеквизиты для констант автоматически. Тогда добавьте явную проверку:
1c
12345678
Значения NULL у булевых констант
По умолчанию булевы константы имеют значение NULL (неопределено), а не Ложь. Условие Если НаборКонстант.Поле1 Тогда сработает корректно, но явное сравнение = Истина надёжнее и читаемее.
Имя реквизита
Убедитесь, что "Поле2" точно совпадает с именем в дереве метаданных (регистр не важен, но пробелы или дополнительные символы могут нарушить проверку).
3 Amra
 
17.05.26
20:18
(2) Садись, кол. Ты бы хоть СП бы открыл
4 Fish
 
гуру
18.05.26
08:57
(3) Это же явно ответ от ИИ.
5 kogotaz
 
18.05.26
09:46
У ИИ я и сам мог бы спросить, но он не знает.
Я просто не понимаю, если я добавляю реквизит в ПроверяемыеРеквизиты, почему форма пропускает незаполненное поле?
6 ass1c
 
18.05.26
09:58
(0) Подзабыл че то немного, но возможно, стоит проверить у формы флаг:
Проверять заполнение автоматически и установить его в Истина.
Вроде есть взаимосвязь если не путаю.
7 Garykom
 
гуру
18.05.26
10:04
(6) Это если нет процедуры со своим кодом
8 RomanYS
 
18.05.26
10:24
(0) Судя по описанию добавлять надо не "Поле2", а "НаборКонстант.Поле2".
НО! Проверил - ни фига не работает, проверки вторичных свойств реквизитов формы не происходит.
Поэтому просто проверяй кодом и давай отказ
9 Fish
 
гуру
18.05.26
10:25
(7) Из СП:
"Вызывается расширением формы при необходимости проверки заполнения реквизитов при записи в форме, а также при выполнении метода ПроверитьЗаполнение.
Для вызова проверки заполнения системой необходимо, чтобы у формы (с которой происходит работа) было установлено свойство ПроверятьЗаполнениеАвтоматически. В этом случае вначале будет вызван данный обработчик, а затем, если в списке проверяемых реквизитов присутствует реквизит <Объект>, обработчик ОбработкаПроверкиЗаполнения() модуля объекта."
10 Garykom
 
гуру
18.05.26
10:25
(8) В типовых давно все проверки только кодом, даже первичных
11 Garykom
 
гуру
18.05.26
10:28
(9) Ну я почти это и написал, в своем коде смотря что с реквизитами проверяемыми сделали
12 RomanYS
 
18.05.26
10:32
(10) Что в целом логично: если флажков в метаданных недостаточно и ты уже создал процедуру, то почему не выдать отказ и нормальное описание ошибки.
Ну и насчет "все" ты сильно не прав, см. счетчик на скрине
13 Garykom
 
гуру
18.05.26
10:54
(12) Согласен, много проверок системных осталось в типовых
Судя по корректировкам кодом массива проверяемых реквизитов
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан