Почему не удаляется запись независимого периодического регистра сведений и как правильно работать с полем Период

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

В практике разработки на платформе 1С:Предприятие часто возникает ситуация, когда при попытке удалить или изменить запись в независимом периодическом регистре сведений через МенеджерЗаписи, система ведет себя непредсказуемо: значение в поле Период сбрасывается в 01.01.0001, а метод Прочитать() возвращает ложь, даже если визуально запись в базе присутствует. Разберем детально, почему это происходит и как правильно организовать работу с такими данными.

Анализ проблемы с Менеджером Записи

Рассмотрим исходный код, который часто становится причиной затруднений у начинающих разработчиков. Проблема обычно кроется в том, как 1С идентифицирует уникальную запись в периодическом регистре.


Процедура УдалитьЗаписьРегистра(Структура) Экспорт
    Движение = РегистрыСведений.Вызовы.СоздатьМенеджерЗаписи();
    Движение.Период = Структура.Запись.Период;
    Движение.Оператор = Структура.Запись.Оператор;
    Движение.Прочитать();
    Если Движение.Выбран() Тогда
        Движение.Удалить();
    КонецЕсли;
КонецПроцедуры

Проанализируем ситуацию: если после выполнения Движение.Прочитать() свойство Выбран() остается в значении Ложь, это означает, что менеджер не смог найти в базе данных строку, точно соответствующую переданным параметрам. Рассмотрим основные причины такого поведения.

Причина 1: Неполный набор измерений (Основной отбор)

Для того чтобы МенеджерЗаписи успешно выполнил метод Прочитать(), необходимо заполнить значения всех измерений, для которых в конфигураторе установлен признак Основной отбор. Если в вашем регистре, помимо измерения Оператор, есть другие измерения (например, Подразделение или ТипВызова), и вы их не указали в коде, платформа не сможет однозначно определить запись.

Важно помнить: Период в периодических регистрах всегда является частью ключа записи. Если вы не передали точное значение периода, поиск не даст результата.

Причина 2: Точность времени в поле Период

Это самая коварная ошибка. В 1С тип Дата всегда содержит время с точностью до секунды. Если запись в регистр была внесена в 12:00:05, а вы пытаетесь прочитать её, передав дату без времени (00:00:00), менеджер записи ее «не увидит».

Выясним, почему в отладчике может отображаться 01.01.0001. Это происходит в двух случаях:

  1. В структуру Структура.Запись.Период передано пустое значение.
  2. Передан тип данных, который не может быть преобразован в дату (например, некорректная строка), и 1С инициализирует поле значением по умолчанию.

Чтобы избежать этого, всегда проверяйте тип передаваемого значения. Проанализируем пример явного приведения типов:


// Убедимся, что передаем именно дату
Движение.Период = Дата(Структура.Запись.Период);

Решение проблемы через Набор Записей

Если работа с МенеджерЗаписи вызывает сложности, или вам нужно удалить записи по определенному условию (фильтру), эффективнее использовать НаборЗаписей. Это более «низкоуровневый» и надежный способ очистки данных в независимых регистрах.

Рассмотрим алгоритм удаления записи через набор:


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

// Важный момент: мы НЕ вызываем Прочитать(), а сразу записываем пустой набор
НаборЗаписей.Записать(); 

Как это работает? Когда мы устанавливаем отбор и вызываем метод Записать(), платформа заменяет все данные в регистре, соответствующие этому отбору, на содержимое нашего объекта НаборЗаписей. Поскольку мы ничего не добавляли в набор, он пуст, и все записи, попадающие под фильтр «Период + Оператор», будут удалены.

Настройка регистра в конфигураторе

Иногда код написан верно, но платформа выдает ошибку, что «Период не найден в отборах». Проверим настройки регистра в конфигураторе:

  1. Откройте свойства вашего РегистраСведений.
  2. Перейдите на закладку Данные.
  3. Убедитесь, что установлена галочка Основной отбор по периоду. Без этой опции вы не сможете использовать период в методе Отбор.Период.Установить() для набора записей.

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

Если МенеджерЗаписи по-прежнему не срабатывает, воспользуйтесь следующим алгоритмом действий:

  1. Проверьте периодичность: Если у регистра стоит периодичность «В пределах дня», платформа может игнорировать время при записи, но требовать точности при чтении, если данные были занесены программно с нарушением этого правила.
  2. Используйте запрос: Чтобы точно понять, что хранится в базе, выполните запрос в консоли: ВЫБРАТЬ Период, Оператор ИЗ РегистрСведений.Вызовы ГДЕ Оператор = &Оператор Посмотрите в результатах запроса точное время до секунды.
  3. Контроль типов: Перед присвоением значения менеджеру записи, проверьте в отладчике тип переменной в структуре. Она должна иметь тип Дата, а не Строка.

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

← На главную