Ошибка 1С ЗУП: НаборИсправленный.Прочитать() (Ошибка при вызове метода)
Механика регистров расчета в ЗУП
Ошибка «Ошибка при вызове метода контекста (Прочитать)» (часто с упоминанием объекта НаборИсправленный) специфична для конфигураций 1С:Зарплата и Управление Персоналом (ЗУП 3.1) и ЗКГУ. Она возникает в момент проведения кадровых или расчетных документов (Отпуск, Больничный лист, Начисление зарплаты). Под капотом 1С использует сложные механизмы вытеснения видов расчета (например, Больничный вытесняет Оклад). При проведении документа-исправления, платформа пытается прочитать набор записей (НаборИсправленный.Прочитать()) из регистра расчета (например, "Начисления"), чтобы отсторнировать прошлые периоды. Сбой чтения означает, что структура данных в СУБД не совпадает с тем, что ожидает метаданные в памяти (rphost), или нарушена ссылочная целостность регистра. Бизнес-риски: блокировка начисления заработной платы сотрудникам, срыв сроков выплат.
Типовые причины сбоя метода Прочитать()
| Источник сбоя | Локализация в 1С | Описание |
|---|---|---|
| Повреждение кэша метаданных | Клиентский ПК или сервер 1С | После динамического обновления конфигурации старые структуры таблиц зависли в сеансовых данных. |
| Битые ссылки (NULL) | Регистры расчета ЗУП | В регистре есть записи с пустым (Объект не найден) измерением (Сотрудник, Подразделение), что вызывает падение SQL-запроса при чтении. |
| Нарушение структуры СУБД | Таблицы _CalcRg | Сбой индексов кластера или таблиц итогов регистра расчета на уровне MS SQL / PostgreSQL. |
Алгоритм восстановления проведения ЗУП
Сценарий 1: Глубокая очистка серверного и клиентского кэша
Это решает 80% внезапных ошибок Прочитать() после обновления релиза ЗУП.
- На клиенте: Закройте 1С. Удалите папки с GUID-именами из профиля пользователя Windows:
%LocalAppData%\1C\1cv8\%AppData%\1C\1cv8\ - На сервере (Критично!): Остановите службу Агента сервера 1С (
srv1cv83). Перейдите в каталог кластера (по умолчаниюC:\Program Files\1cv8\srvinfo\reg_1541\). - Найдите папку
snccntx(сеансовые данные) и очистите ее содержимое. - Запустите службу сервера 1С.
Сценарий 2: Тестирование и исправление (ТиИ) регистров расчета
Если чистка кэша не помогла, в базе присутствуют битые ссылки, препятствующие чтению набора.
1. Сделайте бэкап базы данных (SQL или .dt).
2. Зайдите в Конфигуратор -> Администрирование -> Тестирование и исправление.
3. Выберите ТОЛЬКО следующие пункты (для экономии времени):
- Проверка логической целостности информационной базы.
- Проверка ссылочной целостности информационной базы.
- Пересчет итогов.
4. Выберите действие: "Тестировать и исправлять" (Создавать новые объекты / Очищать ссылки).
5. Запустите ТиИ. После завершения попробуйте провести документ.Сценарий 3: Перепроведение документа-основания
Если ошибка возникает в документе "Отпуск" (Исправление), проблема кроется в исходном документе.
- Найдите первичный документ (который вы пытаетесь исправить).
- Отмените его проведение (Сделать непроведенным) и проведите заново.
- Если он не проводится, временно снимите с него вытесняющие начисления (например, очистите таблицу начислений), проведите пустой, затем перезаполните. Это перестроит набор записей в регистре.
Типовые ошибки администраторов
- Динамическое обновление (Демоническое): Ошибка
НаборИсправленный.Прочитать()— классическое следствие использования кнопки "Обновить конфигурацию БД динамически" в рабочее время. Структура регистра меняется, а старые сеансы пытаются писать в него по старым правилам, разрушая данные. В ЗУП обновляйте БД только монопольно (F7).
Частые вопросы (FAQ)
Почему 1С жалуется на НаборИсправленный, если я делаю первичный документ?
В ЗУП механизм сторнирования срабатывает автоматически. Даже первичный 'Больничный лист' анализирует прошлые периоды. Если сотрудник уже получил Оклад за эти дни, 1С неявно создает набор записей сторно ('НаборИсправленный') для вытеснения оклада.
Можно ли исправить ошибку программно (обработкой)?
Можно написать внешнюю обработку, которая выберет все записи из проблемного Регистра Расчета (с отбором по регистратору-документу), очистит набор (Набор.Очистить(); Набор.Записать();) и заново запустит проведение документа. Это удалит 'битые' записи сторно.
Влияет ли версия платформы 1С на эту ошибку?
Да. Иногда платформы 8.3.xx содержат баги транслятора запросов, которые неверно формируют SQL-запрос для метода Прочитать() при сложных вытеснениях. Если чистка кэша не помогает, проверьте багтрекер 1С (bugboard.v8.1c.ru) для вашего релиза платформы.
Как найти, на каком именно сотруднике падает проведение?
Включите Технологический журнал (ТЖ) на сервере 1С с событием DBMSSQL (или DBPOSTGRS) и EXCP. Посмотрите последний SQL-запрос перед ошибкой. В секции WHERE (или параметрах запроса) будет указан УникальныйИдентификатор (GUID) сотрудника, на котором спотыкается чтение.