Механизм Даты запрета изменения в типовых конфигурациях 1С является частью Библиотеки стандартных подсистем (БСП). Многие разработчики сталкиваются с тем, что стандартных вариантов (таких как «Предыдущий день» или «Конец прошлого года») недостаточно для нужд бизнеса. Разберем, как расширить этот функционал и какие подходы к реализации существуют.
Важно понимать, что список вариантов, который мы видим в интерфейсе, не является простым справочником. Это программно формируемый список. Основная сложность заключается в том, что система ожидает не просто добавления строки в выпадающий список, но и наличия логики расчета даты для этой строки. За хранение самих дат отвечает регистр сведений ДатыЗапретаИзменения.
Этот метод позволяет внести изменения, не снимая конфигурацию с поддержки. Мы работаем через механизм расширений, переопределяя логику подсистемы БСП.
ДатыЗапретаИзменения).&После для процедуры, которая заполняет описание доступных вариантов.Однако простого добавления недостаточно. Вам придется дописать логику расчета даты. Рассмотрим примерный алгоритм реализации:
// Пример логики расчета даты в обработчике
Функция ПолучитьДатуЗапретаДляВарианта(Вариант, ТекущаяДата)
Если Вариант = "ПредыдущиеТриДня" Тогда
Возврат ТекущаяДата - (60 * 60 * 24 * 3);
КонецЕсли;
КонецФункции
Преимущества: сохранение целостности основной конфигурации, удобство обновления.
Недостатки: высокая сложность реализации, необходимость поддерживать код при обновлении БСП, так как структура вызовов может меняться.
Если вы хотите избежать внесения изменений в интерфейс и программные модули БСП, используйте более «чистый» с точки зрения архитектуры подход. Мы можем не менять список вариантов в форме, а просто записывать нужную нам дату прямо в регистр сведений.
Разберем процесс по шагам:
РегистрыСведенийМенеджер.ДатыЗапретаИзменения для записи данных.
// Пример записи в регистр
НаборЗаписей = РегистрыСведений.ДатыЗапретаИзменения.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Пользователь.Установить(НужныйПользователь);
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.ДатаЗапрета = ТекущаяДата() - (3 * 24 * 60 * 60);
// Заполняем остальные измерения
НаборЗаписей.Записать();
Этот метод считается более профессиональным, так как он не затрагивает интерфейс пользователя и не конфликтует с обновлениями конфигурации. Он полностью опирается на штатный функционал платформы 1С для работы с регистрами.
Анализируя ситуацию, мы приходим к выводу, что выбор зависит от ваших приоритетов:
Независимо от выбранного пути, помните: всегда старайтесь минимизировать изменение типовых модулей. Использование расширений или внешних обработок всегда предпочтительнее прямого редактирования конфигурации.