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