В практике разработки на платформе 1С:Предприятие часто возникает ситуация, когда при попытке удалить или изменить запись в независимом периодическом регистре сведений через МенеджерЗаписи, система ведет себя непредсказуемо: значение в поле Период сбрасывается в 01.01.0001, а метод Прочитать() возвращает ложь, даже если визуально запись в базе присутствует. Разберем детально, почему это происходит и как правильно организовать работу с такими данными.
Рассмотрим исходный код, который часто становится причиной затруднений у начинающих разработчиков. Проблема обычно кроется в том, как 1С идентифицирует уникальную запись в периодическом регистре.
Процедура УдалитьЗаписьРегистра(Структура) Экспорт
Движение = РегистрыСведений.Вызовы.СоздатьМенеджерЗаписи();
Движение.Период = Структура.Запись.Период;
Движение.Оператор = Структура.Запись.Оператор;
Движение.Прочитать();
Если Движение.Выбран() Тогда
Движение.Удалить();
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию: если после выполнения Движение.Прочитать() свойство Выбран() остается в значении Ложь, это означает, что менеджер не смог найти в базе данных строку, точно соответствующую переданным параметрам. Рассмотрим основные причины такого поведения.
Для того чтобы МенеджерЗаписи успешно выполнил метод Прочитать(), необходимо заполнить значения всех измерений, для которых в конфигураторе установлен признак Основной отбор. Если в вашем регистре, помимо измерения Оператор, есть другие измерения (например, Подразделение или ТипВызова), и вы их не указали в коде, платформа не сможет однозначно определить запись.
Важно помнить: Период в периодических регистрах всегда является частью ключа записи. Если вы не передали точное значение периода, поиск не даст результата.
Это самая коварная ошибка. В 1С тип Дата всегда содержит время с точностью до секунды. Если запись в регистр была внесена в 12:00:05, а вы пытаетесь прочитать её, передав дату без времени (00:00:00), менеджер записи ее «не увидит».
Выясним, почему в отладчике может отображаться 01.01.0001. Это происходит в двух случаях:
Структура.Запись.Период передано пустое значение.Чтобы избежать этого, всегда проверяйте тип передаваемого значения. Проанализируем пример явного приведения типов:
// Убедимся, что передаем именно дату
Движение.Период = Дата(Структура.Запись.Период);
Если работа с МенеджерЗаписи вызывает сложности, или вам нужно удалить записи по определенному условию (фильтру), эффективнее использовать НаборЗаписей. Это более «низкоуровневый» и надежный способ очистки данных в независимых регистрах.
Рассмотрим алгоритм удаления записи через набор:
НаборЗаписей = РегистрыСведений.Вызовы.СоздатьНаборЗаписей();
// Устанавливаем жесткий фильтр по Периоду и Измерениям
НаборЗаписей.Отбор.Период.Установить(Структура.Запись.Период);
НаборЗаписей.Отбор.Оператор.Установить(Структура.Запись.Оператор);
// Важный момент: мы НЕ вызываем Прочитать(), а сразу записываем пустой набор
НаборЗаписей.Записать();
Как это работает? Когда мы устанавливаем отбор и вызываем метод Записать(), платформа заменяет все данные в регистре, соответствующие этому отбору, на содержимое нашего объекта НаборЗаписей. Поскольку мы ничего не добавляли в набор, он пуст, и все записи, попадающие под фильтр «Период + Оператор», будут удалены.
Иногда код написан верно, но платформа выдает ошибку, что «Период не найден в отборах». Проверим настройки регистра в конфигураторе:
РегистраСведений.Отбор.Период.Установить() для набора записей.Если МенеджерЗаписи по-прежнему не срабатывает, воспользуйтесь следующим алгоритмом действий:
ВЫБРАТЬ Период, Оператор ИЗ РегистрСведений.Вызовы ГДЕ Оператор = &Оператор
Посмотрите в результатах запроса точное время до секунды.Дата, а не Строка.Подводя итог, можно сказать, что работа с независимыми регистрами требует строгого соблюдения уникальности ключа записи, который состоит из Периода и всех измерений с основным отбором. Использование НаборЗаписей является более универсальным методом, так как позволяет избежать проблем с методом Выбран() и гарантированно очистить данные по заданному фильтру.