Разработчики 1С часто сталкиваются с ситуацией, когда при программной записи набора записей регистра сведений возникает ошибка, хотя, казалось бы, все условия соблюдены: права пользователя установлены, а в модуле набора записей нет никаких проверок или блокировок. Давайте вместе разберем, как проанализировать эту ситуацию и найти скрытую причину ошибки.
Первое, что необходимо сделать, если в модуле самого набора записей «пусто» — это проверить Подписки на события. Часто бывает так, что разработчики конфигурации выносят логику проверки данных или бизнес-логику в отдельные объекты метаданных, чтобы не перегружать модуль объекта.
Перейдите в дерево конфигурации, откройте ветку Подписки на события и отфильтруйте их по источнику, указав ваш регистр сведений. Обратите внимание на события ПередЗаписью и ПриЗаписи. Именно там может происходить установка флага Отказ = Истина, которая и блокирует сохранение ваших данных.
Иногда права доступа на уровне конфигуратора (роли) настроены верно, но RLS (Record Level Security) блокирует конкретную запись. Это происходит, если пользователь имеет право «Изменение» на регистр в целом, но не имеет доступа к конкретным полям или связанным данным, которые меняются в процессе записи.
Проанализируйте, нет ли в регистре измерений, связанных с другими объектами, доступ к которым для данного пользователя ограничен. Даже при наличии полных прав на запись в регистр, попытка обновления записи может завершиться неудачей, если платформа обнаружит несанкционированный доступ при проверке прав на связанные объекты в ходе транзакции.
Метод Записать() у объекта РегистрСведенийНаборЗаписей крайне чувствителен к установленному отбору. Давайте посмотрим на ваш код:
мНаборЗаписейДокументаУдостоверяющегоЛичности.Отбор.Физлицо.Использование = Истина;
мНаборЗаписейДокументаУдостоверяющегоЛичности.Отбор.Физлицо.Значение = Ссылка;
мНаборЗаписейДокументаУдостоверяющегоЛичности.Отбор.Период.Использование = Истина;
мНаборЗаписейДокументаУдостоверяющегоЛичности.Отбор.Период.Значение = ДатаЗаписи;
мНаборЗаписейДокументаУдостоверяющегоЛичности.Записать(Истина);
Убедитесь, что поля, входящие в отбор, полностью соответствуют ключевым полям регистра. Если в регистре есть дополнительные измерения, которые не включены в отбор, платформа может пытаться «заместить» данные некорректно, что приведет к ошибке нарушения уникальности ключа или конфликту записей. Всегда проверяйте, все ли обязательные измерения (а для периодических регистров — и период) учтены в отборе.
Если вышеперечисленные методы не принесли результата, значит, ошибка происходит на более глубоком системном уровне. Чтобы увидеть «реальное» сообщение об ошибке, которое платформа 1С скрывает за стандартным диалоговым окном, воспользуйтесь Технологическим журналом.
logcfg.xml для записи событий EXCP (ошибки) и DBMSSQL (ошибки базы данных).Не пренебрегайте возможностями отладчика. Поставьте точку останова на строке Записать(). Нажмите F11 (Шаг со входом) — если ошибка вызывается кодом, к которому у вас есть доступ (подписка, модуль объекта, обработчик события), отладчик обязательно остановится внутри этого кода. Если после нажатия F11 отладчик просто «вылетает» с ошибкой, значит, проблема кроется либо в системных модулях, либо в механизме платформы, и тогда анализ Технологического журнала становится единственным верным решением.
Подводя итог, напомним: при работе с регистрами сведений всегда следите за тем, чтобы Отбор соответствовал структуре ключа регистра, а также помните, что пустые модули объектов не означают отсутствие логики обработки — всегда проверяйте подписки на события!