Как исправить типичные ошибки при работе с перечислениями и табличными частями в 1С:Предприятие 8.3

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

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

Анализ синтаксических ошибок и опечаток в именах метаданных

Разберем ситуацию, когда при попытке проведения документа система выдает ошибку Ожидается символ '=' в строке цикла. Проанализируем типичный фрагмент кода, написанный с ошибками:


Процедура ОбработкаПроведения(Отказ, Режим)
    Движения.ОтстакиМатериалов.Записывать = Истина;
    Для Каджого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл
        Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда
            Движение = Движения.ОтстакиМатериалов.Добавить();
            // Настройка свойств движения...
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

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

Решение проблемы «Переменная не определена (ПереченьНоменклатуры)»

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

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

Работа с объектом конфигурации «Перечисления»

В рассматриваемом примере кода мы используем проверку вида номенклатуры: Если ТекСтрока.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда. Разберем, как это работает и почему это важно:

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

В коде мы обращаемся к конкретному значению через точку: Перечисления.[ИмяПеречисления].[ИмяЗначения]. Это позволяет логически разделить обработку данных. Например, услуги не должны влиять на остатки на складе, поэтому мы создаем движения по регистру только для тех строк, где вид номенклатуры соответствует значению Материал.

Автоматический расчет суммы в управляемых формах

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


&НаКлиенте
Процедура ПереченьНоменклатурыКоличествоПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.ПереченьНоменклатуры.ТекущиеДанные;
    РаботаСДокументами.РассчитатьСумму(СтрокаТабличнойЧасти);
КонецПроцедуры

Если код написан, но сумма не заполняется, проанализируем следующие моменты:

Связь события и процедуры

Просто написать процедуру в модуле недостаточно. Необходимо зайти в редактор формы, выбрать поле Количество в табличной части, открыть его палитру свойств (F4), найти вкладку События и в строке ПриИзменении выбрать вашу процедуру. Если поле пустое — код никогда не выполнится.

Настройка общего модуля

Метод РаботаСДокументами.РассчитатьСумму предполагает наличие общего модуля. Чтобы он работал корректно, должны быть соблюдены условия:

Использование отладчика для поиска ошибок

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

  1. Установим точку останова (клавиша F9) на строке РаботаСДокументами.РассчитатьСумму(СтрокаТабличнойЧасти);.
  2. В режиме "1С:Предприятие" изменим количество в строке документа.
  3. Программа должна "замереть" и переключить вас в конфигуратор. Если этого не произошло — значит, событие не привязано к элементу формы.
  4. Если программа остановилась, нажмем F11, чтобы зайти внутрь функции расчета. Проверим значения переменных Цена и Количество. Если одна из них равна 0 или Неопределено, результат умножения также будет нулевым.

Проанализируем пример функции расчета в общем модуле:


Процедура РассчитатьСумму(СтрокаТабличнойЧасти) Экспорт
    СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена;
КонецПроцедуры

Важный момент: убедитесь, что имена колонок в табличной части (Количество, Цена, Сумма) в точности совпадают с именами полей, к которым вы обращаетесь в коде через точку от СтрокаТабличнойЧасти.

Соблюдение этих правил — внимательное написание имен объектов, проверка связей событий на форме и использование отладчика — позволит вам быстро находить и устранять большинство ошибок на начальном этапе обучения разработке в 1С.

← На главную