Как исправить ошибку «Не установлен отбор по регистратору» в 1С 8.3?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При проведении документа или программной записи движений разработчики часто сталкиваются с ошибкой вида: «Ошибка при вызове метода контекста (Записать): Ошибка записи! Не установлен отбор по регистратору (Регистр накопления: ИмяРегистра)». Рассмотрим подробно, почему возникают такие исключения и как правильно их устранять.

Анализ исходной ситуации

Проанализируем пример кода, при выполнении которого происходит сбой:


// Регистр ОстаткиНоменклатуры Приход
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.ОстаткиНоменклатуры.Очистить();

Для Каждого ТекСтрокаРасход Из ТабРасход Цикл
    Движение = Движения.ОстаткиНоменклатуры.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
    Движение.Период = Дата;
    Движение.Склад = ТекСтрокаРасход.Склад;
    Движение.Номенклатура = ТекСтрокаРасход.Товар;
    Движение.Количество = ТекСтрокаРасход.Количество;
КонецЦикла;

Движения.ОстаткиНоменклатуры.Записать();

При выполнении этого фрагмента платформа выводит ошибку, но указывает на совершенно другой регистр — Свободные остатки. Возникает логичный вопрос: почему ошибка касается регистра, который явным образом не фигурирует в процедуре проведения?

Причина возникновения ошибки

В платформе 1С 8.3 подчиненные регистры (все регистры накопления, регистры бухгалтерии и подчиненные регистратору регистры сведений) не могут существовать или записываться «в воздух». Каждая запись обязана иметь привязку к конкретному документу-регистратору через отбор.

Если ошибка указывается для другого регистра, разберем ключевые причины ее появления:

  1. Каскадная запись в модуле набора записей: В модуле регистра ОстаткиНоменклатуры в обработчиках событий ПередЗаписью или ПриЗаписи прописан код, который обновляет данные во вторичном регистре (в данном случае — Свободные остатки).
  2. Отсутствие документа в списке регистраторов: Текущий документ не внесен в метаданных в список разрешенных регистраторов для подчиненного регистра.
  3. Отсутствие отбора при программном создании набора записей: Если в коде используется метод СоздатьНаборЗаписей(), платформа не устанавливает отбор автоматически — его требуется задавать вручную.

Способы решения проблемы

Рассмотрим по шагам основные способы исправления ошибки в зависимости от архитектурной причины.

Способ 1. Проверка состава регистраторов в конфигураторе

Если каскадная запись в связанный регистр является штатной логикой системы, необходимо разрешить текущему документу быть регистратором для этого регистра:

  1. Откроем дерево конфигурации и найдем регистр накопления, указанный в тексте ошибки (например, Свободные остатки).
  2. Перейдем на вкладку «Регистраторы».
  3. Найдем в списке наш документ и установим напротив него флаг.
  4. Сохраним конфигурацию БД.

Способ 2. Проверка обработчиков событий в модуле регистра

Выясним, где именно происходит обращение к ведомому регистру. Для этого откроем модуль набора записей ведущего регистра ОстаткиНоменклатуры и найдем процедуру ПриЗаписи или ПередЗаписью.

Если в обработчике формируется новый набор записей для другого регистра через менеджер, убедимся, что отбор по регистратору задан явно:


// Пример правильной установки отбора при программной записи
НаборСвободныеОстатки = РегистрыНакопления.СвободныеОстатки.СоздатьНаборЗаписей();
НаборСвободныеОстатки.Отбор.Регистратор.Установить(ЭтотОбъект.Отбор.Регистратор.Значение);

// Заполняем движения и записываем набор
// ...
НаборСвободныеОстатки.Записать();

Способ 3. Проверка подписок на события

Если в модуле набора записей код отсутствует, проверим подписки на события (ПодпискаНаСобытие) с источником РегистрНакопленияНаборЗаписей.ОстаткиНоменклатуры. При записи набора записей может срабатывать обработчик подписки, который пересчитывает данные в других регистрах. В нем также необходимо контролировать наличие корректно установленного отбора по объекту Регистратор.

Рекомендации по отладке

Для быстрой локализации места, где не установился отбор, воспользуемся режимом отладки:

  1. В конфигураторе перейдем в меню Отладка -> Остановка по ошибке.
  2. Включим флаг «Останавливаться по ошибке».
  3. Запустим сеанс и повторим действие. Платформа остановит выполнение точно на строке Записать() того набора записей, у которого не заполнен отбор.
← На главную