Как разрешить редактирование категорий документов в 1С:УПП при закрытом периоде?

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

В процессе работы с конфигурацией 1С:Управление производственным предприятием (УПП) пользователи часто сталкиваются с ситуацией, когда период для редактирования документов уже закрыт (установлена дата запрета изменения данных), но бизнес-процессы требуют оперативного изменения аналитических признаков, таких как категории или свойства документов. Например, менеджеру необходимо пометить документ «Реализация товаров и услуг» (РТиУ) определенной категорией для целей логистики или отчетности.

По умолчанию система блокирует любые изменения в закрытом периоде, включая редактирование категорий. В этой статье мы подробно разберем, как устроен механизм категорий, почему возникает блокировка, и рассмотрим несколько практических способов обойти это ограничение без нарушения финансового учета и перепроведения документов.

Архитектура хранения категорий: почему это безопасно?

Перед тем как переходить к техническим решениям, проанализируем, где и как хранятся категории в системе:

  1. Сами категории документов и справочников не хранятся внутри самого документа-владельца. Они записываются в независимый регистр сведений РегистрСведений.КатегорииОбъектов.
  2. Для интерактивного назначения категорий используется типовая обработка КатегорииОбъекта (или аналогичная общая форма в зависимости от релиза), которая открывается при нажатии на соответствующую кнопку в форме документа или списка.
  3. Поскольку категории хранятся в независимом регистре сведений, их добавление, изменение или удаление никак не влияет на движения документа по регистрам накопления, бухгалтерии или партионного учета (включая РАУЗ). Это означает, что редактирование категорий в закрытом периоде абсолютно безопасно для финансового результата компании.

Выясним причину блокировки: при открытии формы категории программа проверяет доступность редактирования самого документа-владельца. Эта проверка обычно реализована через вызовы общих модулей (например, механизмы проверки даты запрета изменения). Если период закрыт, форма обработки принудительно открывается в режиме «Только просмотр», блокируя возможность установки флажков.

Рассмотрим подробнее три основных способа решения этой задачи.

Решение 1. Модификация типовой обработки в конфигураторе

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

  1. Откроем конфигуратор и найдем в дереве метаданных обработку КатегорииОбъекта.
  2. Перейдем к основной форме обработки и откроем ее модуль.
  3. Найдем процедуру ПриОткрытии (или ПередОткрытием).
  4. Локализуем фрагмент кода, отвечающий за проверку прав доступа и даты запрета изменения документа. Обычно он выглядит следующим образом:

// Типовой код проверки доступности объекта
Если НастройкаПравДоступа.ДокументЗакрытДляИзменения(Объект) Тогда
    ТолькоПросмотр = Истина;
КонецЕсли;
  1. Закомментируем данную проверку или принудительно установим доступность элементов управления формы. Измененный участок кода будет выглядеть так:

// Отключаем блокировку формы при закрытом периоде
ТолькоПросмотр = Ложь; 

После этого изменения пользователи смогут беспрепятственно редактировать категории любых документов, даже если они находятся в закрытом периоде. Данные будут успешно записываться в регистр сведений, не затрагивая сам документ.

Решение 2. Создание внешней обработки (без изменения конфигурации)

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

Создадим внешнюю обработку и подключим ее к документу через механизм «Дополнительные внешние обработки и печатные формы». В модуле обработки реализуем запись данных напрямую в регистр РегистрыСведений.КатегорииОбъектов.

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


Процедура ЗаписатьКатегорииОбъектаПрограммно(СсылкаНаДокумент, МассивКатегорий) Экспорт
    
    // Создаем набор записей регистра сведений с отбором по документу
    НаборЗаписей = РегистрыСведений.КатегорииОбъектов.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Объект.Установить(СсылкаНаДокумент);
    
    // Заполняем набор записей новыми значениями категорий
    Для Каждого ТекущаяКатегория Из МассивКатегорий Цикл
        НоваяЗапись = НаборЗаписей.Добавить();
        НоваяЗапись.Объект = СсылкаНаДокумент;
        НоваяЗапись.Категория = ТекущаяКатегория;
    КонецЦикла;
    
    // Используем свойство ОбменДанными.Загрузка для обхода любых проверок
    НаборЗаписей.ОбменДанными.Загрузка = Истина;
    
    Попытка
        НаборЗаписей.Записать();
        Сообщить("Категории успешно изменены в закрытом периоде!");
    Исключение
        ВызватьИсключение "Не удалось записать категории: " + ОписаниеОшибки();
    КонецПопытки;
    
КонецПроцедуры

Использование свойства ОбменДанными.Загрузка = Истина является ключевым моментом: оно сообщает платформе, что запись производится в режиме загрузки данных, благодаря чему игнорируются прикладные проверки даты запрета изменения на уровне подписок на события регистра.

Решение 3. Использование расширения конфигурации (для платформы 8.3)

Если ваша конфигурация 1С:УПП запущена на платформе 8.3 (даже в режиме совместимости), мы можем задействовать механизм расширений. Это позволит нам изменить поведение формы, не затрагивая основную конфигурацию и сохраняя простоту последующих обновлений.

Выполним следующие шаги для настройки расширения:

  1. Создадим новое расширение конфигурации в дереве метаданных.
  2. Добавим в расширение обработку КатегорииОбъекта и ее основную форму.
  3. В модуле формы расширения переопределим процедуру проверки доступности (например, ПередОткрытием), используя аннотацию &Вместо или &После.

Пример переопределения метода в расширении:


&Вместо("ОпределитьДоступностьФормы")
Процедура Расш_ОпределитьДоступностьФормы()
    // Вызываем оригинальный метод, если необходимо
    // ПродолжитьВызов();
    
    // Принудительно разрешаем редактирование формы категорий
    ЭтаФорма.ТолькоПросмотр = Ложь;
КонецПроцедуры

Важные технические нюансы при программной записи

При самостоятельной разработке механизмов изменения категорий важно помнить о двух ключевых правилах работы с регистром КатегорииОбъектов:

← На главную