В практике работы с 1С часто возникает задача: добавить в документ признак (флаг или «галку»), который пользователи могли бы устанавливать или снимать даже в том случае, если период уже закрыт для редактирования. Стандартные реквизиты документа в такой ситуации блокируются платформой, так как любое изменение объекта Документ привело бы к необходимости его перезаписи, что запрещено датой запрета изменения данных. В этой статье мы подробно разберем, как реализовать такую задачу правильно, сохранив целостность учета и обеспечив удобство пользователям.
Когда в системе 1С установлена дата запрета изменения данных, платформа автоматически блокирует формы документов, дата которых меньше или равна дате запрета. Свойство формы ТолькоПросмотр устанавливается в значение Истина. Даже если вы добавите новый реквизит в расширении непосредственно в объект Документ, при попытке его изменить система потребует записать сам документ. Запись документа в закрытом периоде — это операция, которая либо полностью заблокирована, либо крайне нежелательна, так как она может привести к непроизвольному пересчету итогов или изменению состояния транзакций.
Рассмотрим по шагам профессиональные способы решения этой задачи.
Это наиболее гибкий и технически правильный метод. Суть заключается в том, что мы храним значение нашей «галки» не в самом документе, а в отдельном объекте — регистре сведений, где ключом (измерением) является ссылка на наш документ.
Шаг 1. Создание регистра сведений
В конфигурации или расширении создадим новый регистр сведений (назовем его, например, ДополнительныеПризнакиДокументов):
ДокументСсылка (тип — ссылка на нужный вид документа).Галка (тип — Булево).Шаг 2. Вывод реквизита на форму документа
Для того чтобы пользователь видел этот флаг, нам нужно добавить его на форму документа. Проанализируем, как это сделать:
ФлагЗакрытогоПериода и типом Булево.Шаг 3. Программная логика работы с данными
Теперь нам нужно обеспечить чтение и запись этого значения. Разберем программный код. В модуле формы документа пропишем следующие процедуры:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Читаем значение из регистра при открытии формы
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДополнительныеПризнакиДокументов.Галка
|ИЗ
| РегистрСведений.ДополнительныеПризнакиДокументов КАК ДополнительныеПризнакиДокументов
|ГДЕ
| ДополнительныеПризнакиДокументов.ДокументСсылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
ФлагЗакрытогоПериода = Выборка.Галка;
КонецЕсли;
// Важный нюанс: если период закрыт, форма станет "ТолькоПросмотр".
// Нам нужно принудительно разрешить редактирование нашей галки.
ЭтаФорма.Элементы.ФлагЗакрытогоПериода.ТолькоПросмотр = Ложь;
КонецПроцедуры
Для записи значения при изменении флага создадим обработчик события ПриИзменении для нашего элемента формы:
&НаСервере
Процедура ЗаписатьФлагВРегистрНаСервере()
// Используем менеджер записи для независимого регистра
МенеджерЗаписи = РегистрыСведений.ДополнительныеПризнакиДокументов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ДокументСсылка = Объект.Ссылка;
МенеджерЗаписи.Галка = ФлагЗакрытогоПериода;
МенеджерЗаписи.Записать(Истина); // Записываем независимо от состояния документа
КонецПроцедуры
&НаКлиенте
Процедура ФлагЗакрытогоПериодаПриИзменении(Элемент)
ЗаписатьФлагВРегистрНаСервере();
КонецПроцедуры
Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), как, например, 1С:Бухгалтерия 3.0, вы можете решить задачу без программирования или с минимальным его участием. Механизм «Дополнительные сведения» специально предназначен для хранения информации, не влияющей на проведение документа, в отдельном регистре.
Преимущества этого метода:
ДополнительныеСведения.Чтобы настроить это, перейдите в раздел Администрирование — Общие настройки — Свойства. Добавьте новое дополнительное сведение к нужному документу с типом «Булево». Теперь в форме документа через кнопку «Еще — Дополнительные сведения» пользователь сможет управлять этой галкой.
Чтобы пользователю не приходилось открывать каждый документ для проверки флага, его нужно вывести в форму списка. Если вы использовали способ с регистром сведений, выполните следующие действия:
ДинамическийСписок, который является источником данных для таблицы.ЛЕВОЕ СОЕДИНЕНИЕ основной таблицы документов с вашим регистром сведений по полю Ссылка.Пример запроса для динамического списка:
ВЫБРАТЬ
ДокументРеализация.Ссылка,
ДокументРеализация.Дата,
ДокументРеализация.Номер,
ЕСТЬNULL(ДопРеквизиты.Галка, ЛОЖЬ) КАК ФлагПроверки
ИЗ
Документ.РеализацияТоваровУслуг КАК ДокументРеализация
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеПризнакиДокументов КАК ДопРеквизиты
ПО ДокументРеализация.Ссылка = ДопРеквизиты.ДокументСсылка
После внесения этих изменений поле ФлагПроверки можно будет вытащить на форму списка, и оно будет доступно для сортировки и группировки.
Проанализируем ситуацию с точки зрения аудита. Помните, что возможность изменения любых данных в закрытом периоде — это всегда риск. Рассмотрим правила, которых стоит придерживаться:
Документ не меняется.Таким образом, мы выяснили причину блокировки обычных реквизитов и разобрали два надежных способа обхода этой блокировки: через создание независимого регистра сведений и через штатные дополнительные сведения БСП. Выбор конкретного метода зависит от того, насколько глубоко вы готовы кастомизировать конфигурацию и какие требования предъявляются к интерфейсу системы.