Как изменить комментарий в документе 1С, если период уже закрыт?

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

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

В этой статье мы подробно разберем, как реализовать возможность редактирования комментариев в закрытом периоде, проанализируем риски и выберем наиболее безопасные методики работы на примере конфигураций с обычными формами (таких как Управление торговлей 10.3 или УПП 1.3).

Метод 1: Программная запись с использованием режима загрузки данных

Самый быстрый и популярный способ среди программистов 1С — это использование специального свойства объекта ОбменДанными.Загрузка. Рассмотрим подробнее, как работает этот механизм. Когда мы устанавливаем это свойство в значение Истина, платформа сигнализирует всем встроенным проверкам и подпискам на события, что запись происходит в режиме обмена (синхронизации). В этом режиме большинство проверок, включая проверку даты запрета редактирования, попросту игнорируются.

Разберем по шагам, как написать код для изменения комментария в форме списка или форме документа:


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

Важный нюанс: использование ОбменДанными.Загрузка = Истина не только обходит дату запрета, но и отключает программные проверки в модуле объекта (процедуры ПередЗаписью, ПриЗаписи). Это гарантирует, что документ не будет перепроведен и его движения по регистрам останутся неизменными. Однако стоит помнить, что если в системе включено версионирование, запись в режиме загрузки может не создать новую версию объекта в истории изменений.

Метод 2: Использование механизма дополнительных сведений

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

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

  1. Данные хранятся в отдельной таблице (регистре), а не в самом документе.
  2. Запись в независимый регистр сведений не считается редактированием документа.
  3. Дата запрета редактирования, как правило, не распространяется на запись дополнительных сведений, если это не настроено специально.
  4. Вы можете добавить сколько угодно текстовых полей для одного документа, не меняя структуру самой конфигурации.

Если в вашей конфигурации (например, старой версии УТ 10) нет механизма дополнительных сведений, мы рекомендуем создать свой собственный Регистр сведений (например, КомментарииДокументов) с измерениями ДокументСсылка и ресурсом ТекстКомментария. Пользователи смогут редактировать данные в этом регистре, а вы сможете вывести это поле прямо в форму списка через событие ПриВыводеСтроки или ПриПолученииДанных.

Метод 3: Универсальные обработки

Если правка комментария — это разовая задача для администратора, можно воспользоваться встроенными или внешними групповыми обработками. Например, в 1С:Управление торговлей 10.3 есть стандартная обработка "Групповая обработка справочников и документов".

Выясним, как применить ее для нашей задачи:

  1. Откройте обработку и выберите нужный тип документа.
  2. Настройте отбор (например, по конкретной дате или номеру).
  3. Нажмите кнопку "Настройка" и проверьте наличие флага "Выполнять в режиме обмена данными" (если ваша версия обработки это поддерживает).
  4. Выберите действие "Изменить реквизит: Комментарий" и введите новый текст.

Если стандартная обработка не позволяет обойти период, программист может использовать внешнюю обработку "Универсальные подбор и обработка объектов", где флаг ОбменДанными.Загрузка доступен в явном виде. Это позволяет массово очистить или дополнить комментарии в старых документах за несколько секунд.

Анализ рисков и последствия

Рассмотрим причины, по которым к таким операциям стоит подходить с осторожностью. Даже "безобидное" изменение комментария может иметь побочные эффекты:

1. Нарушение работы РИБ (Распределенных информационных баз). Если у вас настроен обмен данными, изменение документа в закрытом периоде приведет к тому, что этот документ снова будет зарегистрирован к обмену и отправится в другие узлы. Если в узлах-приемниках период также закрыт и там не реализован обход даты запрета при загрузке, обмен может "встать" с ошибкой.

2. Кэширование данных. При изменении объекта напрямую через SQL (что иногда практикуют экстремалы) или при специфических программных манипуляциях, пользователи могут продолжать видеть старый комментарий из-за кэша сервера приложений 1С. Использование штатного метода Записать() полностью решает эту проблему.

3. Бизнес-логика и отчеты. Выясните, не используется ли реквизит Комментарий в каких-либо важных отчетах или алгоритмах (например, поиск по ключевым словам для формирования доплат или статусов). Если логика программы завязана на текст комментария, его изменение в закрытом периоде может исказить управленческую отчетность за прошлые месяцы.

Итог: Если вам нужно дать пользователям возможность править комментарии "здесь и сейчас", используйте Метод 1 с созданием небольшой кнопки или внешней обработки. Если же вы планируете долгосрочную работу и хотите избежать проблем с закрытыми периодами в будущем, лучше один раз внедрить Метод 2 с использованием регистров сведений, оставив сами документы в покое.

← На главную