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