При изучении разработки на платформе 1С:Предприятие 8.3 начинающие специалисты часто сталкиваются с каскадом ошибок, которые на первый взгляд кажутся магическими. Однако большинство из них связано с тремя факторами: невнимательностью при наборе имен объектов, нарушением синтаксиса встроенного языка и отсутствием связи между программным кодом и интерфейсными событиями. В этой статье мы подробно разберем, как устранить ошибки при проведении документа, работающего с регистрами накопления и перечислениями.
Разберем ситуацию, когда при попытке проведения документа система выдает ошибку Ожидается символ '=' в строке цикла. Проанализируем типичный фрагмент кода, написанный с ошибками:
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ОтстакиМатериалов.Записывать = Истина;
Для Каджого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл
Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда
Движение = Движения.ОтстакиМатериалов.Добавить();
// Настройка свойств движения...
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Первое, на что стоит обратить внимание — это оператор цикла. В языке 1С ключевое слово пишется как Для Каждого. Опечатка Каджого заставляет компилятор думать, что вы пытаетесь объявить переменную или выполнить присваивание, поэтому он ожидает символ =.
Вторая критическая проблема — несоответствие имен объектов метаданных. В коде указано Движения.ОтстакиМатериалов. В русском языке слово пишется как "Остатки". Если в дереве конфигурации ваш регистр накопления назван правильно (ОстаткиМатериалов), то обращение к нему через Отстаки вызовет ошибку "Поле объекта не обнаружено". Важно: всегда проверяйте написание имен в окне свойств объекта в конфигураторе. 1С чувствительна к каждой букве, хотя и нечувствительна к регистру.
Представим, что вы исправили опечатки, но возникла новая ошибка: Переменная не определена (ПереченьНоменклатуры). Это происходит в строке Для Каждого ТекСтрока Из ПереченьНоменклатуры Цикл. Рассмотрим причины возникновения этой ситуации:
ОбработкаПроведения) все табличные части документа доступны напрямую по их именам. Если вы следуете учебнику и пишете ПереченьНоменклатуры, а в своем документе назвали таблицу СоставУслуг или Материалы, система не сможет найти коллекцию данных. Проверьте вкладку "Данные" вашего документа в конфигураторе.ОбработкаПроведения основная причина — именно несовпадение имен в метаданных и коде.В рассматриваемом примере кода мы используем проверку вида номенклатуры: Если ТекСтрока.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда. Разберем, как это работает и почему это важно:
Объект Перечисления используется для хранения фиксированного набора значений, которые не меняются в процессе работы программы (например: Виды номенклатуры: Товар, Услуга, Материал). В отличие от справочников, элементы перечисления нельзя создать в режиме "1С:Предприятие".
В коде мы обращаемся к конкретному значению через точку: Перечисления.[ИмяПеречисления].[ИмяЗначения]. Это позволяет логически разделить обработку данных. Например, услуги не должны влиять на остатки на складе, поэтому мы создаем движения по регистру только для тех строк, где вид номенклатуры соответствует значению Материал.
Часто после исправления ошибок проведения разработчик замечает, что на форме документа перестала считаться сумма при изменении количества или цены. Рассмотрим типичный код в модуле формы:
&НаКлиенте
Процедура ПереченьНоменклатурыКоличествоПриИзменении(Элемент)
СтрокаТабличнойЧасти = Элементы.ПереченьНоменклатуры.ТекущиеДанные;
РаботаСДокументами.РассчитатьСумму(СтрокаТабличнойЧасти);
КонецПроцедуры
Если код написан, но сумма не заполняется, проанализируем следующие моменты:
Просто написать процедуру в модуле недостаточно. Необходимо зайти в редактор формы, выбрать поле Количество в табличной части, открыть его палитру свойств (F4), найти вкладку События и в строке ПриИзменении выбрать вашу процедуру. Если поле пустое — код никогда не выполнится.
Метод РаботаСДокументами.РассчитатьСумму предполагает наличие общего модуля. Чтобы он работал корректно, должны быть соблюдены условия:
РаботаСДокументами установлены флажки Клиент (управляемое приложение) и Сервер.РассчитатьСумму перед словом Процедура стоит ключевое слово Экспорт.Если сумма все равно не считается, воспользуемся отладчиком. Это самый эффективный способ понять, что происходит внутри программы. Выполним следующие шаги:
РаботаСДокументами.РассчитатьСумму(СтрокаТабличнойЧасти);.Цена и Количество. Если одна из них равна 0 или Неопределено, результат умножения также будет нулевым.Проанализируем пример функции расчета в общем модуле:
Процедура РассчитатьСумму(СтрокаТабличнойЧасти) Экспорт
СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена;
КонецПроцедуры
Важный момент: убедитесь, что имена колонок в табличной части (Количество, Цена, Сумма) в точности совпадают с именами полей, к которым вы обращаетесь в коде через точку от СтрокаТабличнойЧасти.
Соблюдение этих правил — внимательное написание имен объектов, проверка связей событий на форме и использование отладчика — позволит вам быстро находить и устранять большинство ошибок на начальном этапе обучения разработке в 1С.