Как исправить ошибку «Итератор для значения не определен» при ручной корректировке движений в БГУ 2?

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет Сфера услуг, туризм и социальный сектор
← На главную

При ведении учета в конфигурации «1С:Бухгалтерия государственного учреждения 2.0» пользователи нередко сталкиваются с необходимостью вручную скорректировать проводки документа. Однако после обновления на некоторые релизы (в частности, на релиз 2.0.50.21) при попытке включить ручную корректировку и записать движения система выдает критическую ошибку: «Итератор для значения не определен». Одновременно с этим в формах документов может пропадать кнопка предварительного просмотра проводок.

Разберем детально технические причины возникновения этой неисправности, а также рассмотрим практические способы ее обхода и программного исправления.

В тексте сообщения об ошибке платформа указывает на проблемное место: модуль ОбщийМодуль.БухгалтерскиеОперацииСервер.Модуль, где происходит обход коллекции в цикле:

Для каждого ТекРеквизит Из ДополнительныеРеквизитыОперации Цикл

Почему возникает ошибка: технический анализ ситуации

Проанализируем механику работы платформы и конфигурации в этот момент. Платформа 1С:Предприятие 8 не выполняет неявного приведения типа Неопределено к пустой коллекции в синтаксической конструкции Для каждого ... Из ... Цикл. Для корректной работы цикла коллекция обязательно должна быть проинициализирована и поддерживать итерирование (например, быть массивом, таблицей значений, структурой или списком значений).

При включении флага «Ручная корректировка» штатные алгоритмы подготовки параметров типовой операции не заполняют структуру дополнительных реквизитов. В результате переменная ДополнительныеРеквизитыОперации принимает значение Неопределено. Как только управление доходит до цикла обхода неинициализированной переменной, платформа прерывает выполнение транзакции с системным исключением.

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

Что касается ситуации с исчезновением кнопки предварительного просмотра проводок, то здесь действуют штатные механизмы интерфейса:

  1. Статус проведения: кнопка предварительного просмотра доступна только у непроведенных документов. После проведения документа она закономерно заменяется на команду просмотра сформированных проводок.
  2. Обособленное формирование проводок: если в настройках параметров учета активирован флаг «Формирование проводок обособленно от документа», типовая операция настраивается в отдельном окне через панель навигации по команде Бухгалтерская операция.
  3. Пользовательские настройки: видимость элементов могла быть скрыта через меню «Еще» — «Изменить форму» (исправляется командой «Установить стандартные настройки»).

Способ 1. Оперативный обход ошибки без изменения конфигурации

Если требуется срочно внести исправление в движения документа, а правка конфигурации или обновление в текущий момент невозможны, применим штатный способ обхода через пользовательский интерфейс.

Разберем по шагам порядок действий:

  1. Перейдем в раздел «Администрирование» — «Обслуживание».
  2. Раскроем группу «История изменений».
  3. Снимем флаг «Хранить историю изменений» (либо перейдем по гиперссылке «Настройки хранения» и временно отключим версионирование для конкретного проблемного документа, выбрав вариант «Не версионировать»).
  4. Вернемся в нужный документ, откроем его движения, включим флаг ручной корректировки, внесем требуемые проводки и успешно нажмем «Записать и закрыть» — ошибка больше не возникнет.
  5. После сохранения проводок вернемся в раздел настроек и снова включим хранение истории изменений.

Способ 2. Программное исправление в общем модуле

Если информационная база снята с поддержки или находится на поддержке с возможностью редактирования, устраним дефект непосредственно в исходном коде конфигурации.

Рассмотрим алгоритм внесения изменений:

  1. Откроем базу в режиме «Конфигуратор».
  2. Найдем через дерево метаданных или глобальный поиск общий модуль БухгалтерскиеОперацииСервер.
  3. Перейдем к строке 973 (в зависимости от релиза номер строки может незначительно сдвигаться, ориентируемся на вызов функции проверки версионирования перед циклом).
  4. Найдем исходную конструкцию:

Если ПолучитьФункциональнуюОпцию("ИспользоватьВерсионированиеОбъектов") Тогда
    Для каждого ТекРеквизит Из ДополнительныеРеквизитыОперации Цикл
        ...
    КонецЦикла;
КонецЕсли;

Заменим условие в строке 973 на рекомендованное разработчиками:


Если НЕ НеЗаписыватьДополнительныеРеквизиты И ПолучитьФункциональнуюОпцию("ИспользоватьВерсионированиеОбъектов") Тогда

Проанализируем также альтернативный, более универсальный вариант доработки. Чтобы полностью исключить возникновение ошибки типа «Итератор для значения не определен» при любых нестандартных операциях, добавим явную проверку переменной на значение Неопределено:


Если ПолучитьФункциональнуюОпцию("ИспользоватьВерсионированиеОбъектов") Тогда
    Если ДополнительныеРеквизитыОперации <> Неопределено Тогда
        Для каждого ТекРеквизит Из ДополнительныеРеквизитыОперации Цикл
            // Штатная обработка реквизита
        КонецЦикла;
    КонецЕсли;
КонецЕсли;

После сохранения конфигурации базы данных ручная корректировка начнет работать в штатном режиме без необходимости отключения истории изменений.

Способ 3. Исправление через расширение конфигурации

Чтобы не снимать типовую конфигурацию с поддержки и не создавать трудностей при последующих обновлениях, решим проблему с помощью механизма расширений.

Разберем по шагам создание корректирующего расширения:

  1. В Конфигураторе перейдем в меню «Конфигурация» — «Расширения конфигурации» и добавим новое расширение (назначение — «Исправление» или «Адаптация»).
  2. Добавим в расширение общий модуль БухгалтерскиеОперацииСервер.
  3. Для процедуры, отвечающей за формирование движений и запись реквизитов операции, применим аннотацию &Вместо или &ИзменениеИКонтроль.
  4. В переопределенном коде добавим проверку НЕ НеЗаписыватьДополнительныеРеквизиты либо проверку на заполненность коллекции ДополнительныеРеквизитыОперации.
  5. Применим изменения. Теперь типовой модуль останется нетронутым, а код будет выполняться корректно.

Способ 4. Обновление релиза конфигурации

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

← На главную