Ошибка 1С: Ошибка при вызове метода контекста (Записать) — Решение
- Сбой при сохранении элементов справочников, документов или наборов записей регистров.
- Текст сбоя:
{ОбщийМодуль(Строка)}: Ошибка при вызове метода контекста (Записать): Не удалось записать: "ИмяОбъекта"!. - Вторичные ошибки: Нарушение уникальности кода/номера, Ошибка контроля прав RLS или Отказ в обработчике ПередЗаписью.
1. Причины падения метода Записать()
Метод Объект.Записать() запускает комплексную транзакцию записи, включающую валидацию данных, триггеры СУБД, проверку прав доступа и пользовательские события модулей. Сбой вызывают:
- Дублирование уникального номера документа или кода справочника;
- Установка флага
Отказ = Истинав обработчиках событийПередЗаписьюилиПриЗаписи; - Попытка записи в закрытый период (граница запрета изменения данных);
- Взаимная блокировка данных (Deadlock) в параллельных сеансах СУБД.
2. Методы решения типовых сбоев
Сбой 1: Нарушение уникальности номера/кода
Если сбилась автонумерация, выполните перенумерацию или обновите номер перед записью:
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокументОбъект.УстановитьНовыйНомер(); // Автоматически генерирует следующий свободный номер
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);Сбой 2: Анализ отказа в обработчиках событий
Откройте МодульОбъекта и МодульНабораЗаписей и найдите проверки, взводящие переменную Отказ:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если Не ЗначениеЗаполнено(Организация) Тогда
Отказ = Истина; // Если Организация пуста — Записать() завершится ошибкой!
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Поле 'Организация' не заполнено!";
Сообщение.Сообщить();
Возврат;
КонецЕсли;
КонецПроцедурыСбой 3: Запись набора записей регистров с очисткой
НаборЗаписей = РегистрыНакопления.ОстаткиНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);
// Обязательно прочитать набор перед модификацией:
НаборЗаписей.Прочитать();
// Модификация...
НаборЗаписей.Записать(Истина); // Истина = замещать существующие записи Частые вопросы (FAQ)
В чем разница между режимами записи РежимЗаписиДокумента.Запись и Проведение?
Режим 'Запись' сохраняет документ в информационной базе без формирования движений по регистрам. Режим 'Проведение' дополнительно вызывает обработчик 'ОбработкаПроведения' и формирует движения в регистрах.
Почему метод Записать() падает с ошибкой 'Запись заблокирована'?
Данный объект в текущий момент времени заблокирован другим сеансом или параллельной транзакцией. Настройте повторные попытки блокировки или увеличьте таймаут ожидания.
Как записать объект в обход проверок прав RLS?
Выполняйте операцию в привилегированном общем модуле или используйте конструкцию 'УстановитьПривилегированныйРежим(Истина)' на сервере.
Почему нельзя вызывать Записать() внутри транзакции проведения другого объекта?
Прямая запись сторонних объектов внутри обработчика проведения может приводить к взаимным блокировкам (Deadlocks) и нарушению принципа атомарности транзакции проведения.