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