При ведении учета в конфигурации «1С:Бухгалтерия государственного учреждения 2.0» пользователи нередко сталкиваются с необходимостью вручную скорректировать проводки документа. Однако после обновления на некоторые релизы (в частности, на релиз 2.0.50.21) при попытке включить ручную корректировку и записать движения система выдает критическую ошибку: «Итератор для значения не определен». Одновременно с этим в формах документов может пропадать кнопка предварительного просмотра проводок.
Разберем детально технические причины возникновения этой неисправности, а также рассмотрим практические способы ее обхода и программного исправления.
В тексте сообщения об ошибке платформа указывает на проблемное место: модуль ОбщийМодуль.БухгалтерскиеОперацииСервер.Модуль, где происходит обход коллекции в цикле:
Для каждого ТекРеквизит Из ДополнительныеРеквизитыОперации Цикл
Проанализируем механику работы платформы и конфигурации в этот момент. Платформа 1С:Предприятие 8 не выполняет неявного приведения типа Неопределено к пустой коллекции в синтаксической конструкции Для каждого ... Из ... Цикл. Для корректной работы цикла коллекция обязательно должна быть проинициализирована и поддерживать итерирование (например, быть массивом, таблицей значений, структурой или списком значений).
При включении флага «Ручная корректировка» штатные алгоритмы подготовки параметров типовой операции не заполняют структуру дополнительных реквизитов. В результате переменная ДополнительныеРеквизитыОперации принимает значение Неопределено. Как только управление доходит до цикла обхода неинициализированной переменной, платформа прерывает выполнение транзакции с системным исключением.
Выясним, почему ошибка проявляется не у всех пользователей. Сбой напрямую завязан на проверку функциональной опции ИспользоватьВерсионированиеОбъектов. Если в конфигурации активирована функциональная опция версионирования, алгоритм пытается записать дополнительные реквизиты для истории изменений. При этом опция может быть включена в общих настройках программы (раздел «Администрирование» — «Обслуживание» — «История изменений»), даже если для конкретного вида документов хранение версий индивидуально отключено в таблице настроек.
Что касается ситуации с исчезновением кнопки предварительного просмотра проводок, то здесь действуют штатные механизмы интерфейса:
Бухгалтерская операция.Если требуется срочно внести исправление в движения документа, а правка конфигурации или обновление в текущий момент невозможны, применим штатный способ обхода через пользовательский интерфейс.
Разберем по шагам порядок действий:
Если информационная база снята с поддержки или находится на поддержке с возможностью редактирования, устраним дефект непосредственно в исходном коде конфигурации.
Рассмотрим алгоритм внесения изменений:
БухгалтерскиеОперацииСервер.
Если ПолучитьФункциональнуюОпцию("ИспользоватьВерсионированиеОбъектов") Тогда
Для каждого ТекРеквизит Из ДополнительныеРеквизитыОперации Цикл
...
КонецЦикла;
КонецЕсли;
Заменим условие в строке 973 на рекомендованное разработчиками:
Если НЕ НеЗаписыватьДополнительныеРеквизиты И ПолучитьФункциональнуюОпцию("ИспользоватьВерсионированиеОбъектов") Тогда
Проанализируем также альтернативный, более универсальный вариант доработки. Чтобы полностью исключить возникновение ошибки типа «Итератор для значения не определен» при любых нестандартных операциях, добавим явную проверку переменной на значение Неопределено:
Если ПолучитьФункциональнуюОпцию("ИспользоватьВерсионированиеОбъектов") Тогда
Если ДополнительныеРеквизитыОперации <> Неопределено Тогда
Для каждого ТекРеквизит Из ДополнительныеРеквизитыОперации Цикл
// Штатная обработка реквизита
КонецЦикла;
КонецЕсли;
КонецЕсли;
После сохранения конфигурации базы данных ручная корректировка начнет работать в штатном режиме без необходимости отключения истории изменений.
Чтобы не снимать типовую конфигурацию с поддержки и не создавать трудностей при последующих обновлениях, решим проблему с помощью механизма расширений.
Разберем по шагам создание корректирующего расширения:
БухгалтерскиеОперацииСервер.&Вместо или &ИзменениеИКонтроль.НЕ НеЗаписыватьДополнительныеРеквизиты либо проверку на заполненность коллекции ДополнительныеРеквизитыОперации.Рассматриваемая ошибка признана официальным зарегистрированным багом релиза БГУ 2.0.50.21. Разработчики 1С полностью исправили данное поведение в последующих версиях конфигурации (ветка 2.0.51 и выше). Если в организации запланировано плановое обновление, оптимальным решением будет переход на актуальный релиз, где алгоритм работы с дополнительными реквизитами ручной операции уже исправлен штатно.