В конфигурации «1С:Управление торговлей 10.3» производственный календарь играет ключевую роль при расчете сроков оплаты, условий отсрочки по договорам в банковских или рабочих днях, а также при автоматическом резервировании заказов. Иногда при случайном или ошибочном заполнении календаря за определенный год возникает необходимость очистить внесенные данные или вернуть их к исходному состоянию.
Рассмотрим структуру хранения этих данных в системе, проанализируем возможные последствия полной очистки и разберем по шагам все доступные способы решения задачи.
В типовой конфигурации информация о праздничных, предпраздничных и рабочих днях хранится в независимом непериодическом регистре сведений РегламентированныйПроизводственныйКалендарь. Основным измерением данного регистра является поле ДатаКалендаря (тип Дата).
Особенность работы с этим объектом на платформе 1С заключается в том, что объект РегистрСведенийНаборЗаписей позволяет устанавливать отбор по измерениям только по точному совпадению (ВидСравнения.Равно). Установить отбор сразу по диапазону дат для частичной очистки на уровне набора нельзя. Для выборочного удаления строк за конкретный год применяются точечное удаление через МенеджерЗаписи или ручная интерактивная очистка.
Если календарь был заполнен неверно, полное удаление строк требуется далеко не всегда. Проанализируем альтернативный и наиболее безопасный вариант — сброс календаря к базовому пятидневному графику.
Разберем по шагам, как это выполнить:
Этот способ позволяет избежать пробелов в данных и восстанавливает типовую сетку рабочих и выходных дней.
Если требуется полностью удалить записи за выбранный год без применения средств разработки, воспользуемся стандартным списком регистра сведений.
Разберем последовательность действий:
ДатаКалендаря, указав границы требуемого периода (например, с 01.01.2017 по 31.12.2017).В случаях, когда интерактивный доступ к регистру ограничен или требуется автоматизировать процесс очистки, можно воспользоваться внешней обработкой или консолью кода. Выберем даты за нужный интервал с помощью запроса и удалим каждую запись через МенеджерЗаписи.
Посмотрим на пример программного кода:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДатаКалендаря
|ИЗ
| РегистрСведений.РегламентированныйПроизводственныйКалендарь
|ГДЕ
| ДатаКалендаря МЕЖДУ &ДатаНач И &ДатаКон";
Запрос.УстановитьПараметр("ДатаНач", '20170101');
Запрос.УстановитьПараметр("ДатаКон", '20171231');
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Менеджер = РегистрыСведений.РегламентированныйПроизводственныйКалендарь.СоздатьМенеджерЗаписи();
Менеджер.ДатаКалендаря = Выборка.ДатаКалендаря;
Менеджер.Удалить();
КонецЦикла;
Данный фрагмент выбирает все записи регистра за 2017 год и последовательно удаляет их, не затрагивая данные остальных лет.
Для групповых операций с базой данных можно использовать типовые и сервисные инструменты:
РегламентированныйПроизводственныйКалендарь по условию на поле ДатаКалендаря и выполнить операцию удаления только над отобранными объектами.Обратим внимание на важный нюанс: полное удаление записей за год оставляет систему без информации о типах дней (рабочий, праздничный, выходной). Если в информационной базе проводятся документы «Заказ покупателя» или «Заказ поставщику» с расчетом даты оплаты по рабочим или банковским дням за этот период, программа не сможет корректно рассчитать график платежей или выдаст ошибку. Поэтому после очистки рекомендуется сразу перезаполнить календарь актуальными данными.