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