Как в 1С правильно присвоить дробное число и работать со структурами без ошибок

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

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

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

Разделитель дробной части в 1С: Точка против Запятой

Выясним причину одной из самых распространенных синтаксических ошибок. Начинающие разработчики часто пытаются написать код следующим образом:

Объект.УслугаГВС = 182,16;

В этом выражении кроется критическая ошибка. Давайте разберем, как платформа воспринимает символы точки и запятой:

  1. В программном коде 1С: Разделителем дробной части числового литерала всегда является точка (.). Запись вида 182.16 сообщает платформе, что это единое числовое значение с плавающей точкой. Использование запятой компилятор воспримет либо как синтаксическую ошибку, либо как разделение параметров (если это происходит внутри вызова функции или инициализации коллекции), что приведет к аварийному завершению работы программы или непредсказуемому поведению.
  2. В пользовательском интерфейсе: При вводе данных на формах в поля с типом Число разделитель отображается в соответствии с региональными настройками операционной системы. Для русскоязычной локализации это обычно запятая. Однако важно четко разделять то, что видит пользователь на экране, и то, как пишется код в конфигураторе.

Таким образом, правильное присвоение дробного числа в коде всегда должно выглядеть так:

Объект.УслугаГВС = 182.16;

Тонкости работы с коллекцией Структура

Рассмотрим подробнее коллекцию Структура. Это крайне популярный тип данных, представляющий собой набор пар «Ключ-Значение». Но при работе с ним есть важные нюансы, которые необходимо знать.

В платформе 1С существует два основных способа работы со свойствами структуры: использование метода Вставить() и прямое обращение через точку. Разберем их различия.

Способ 1. Использование метода Вставить()

Это универсальный и наиболее безопасный метод. Его синтаксис:

Струк.Вставить("Тариф6", 182.16);

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

Способ 2. Обращение через точку

Многие разработчики предпочитают более лаконичный синтаксис:

Струк.Тариф6 = 182.16;

Этот способ удобен, но имеет критическое ограничение: он работает только в том случае, если ключ "Тариф6" уже был предварительно создан в структуре (например, через метод Вставить() или при инициализации структуры Новый Структура("Тариф6", 0)). Если попытаться присвоить значение через точку несуществующему ключу, система немедленно выдаст ошибку: «Поле объекта не обнаружено (Тариф6)».

Ограничения на именование ключей

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


// Ошибочный вариант! Код не скомпилируется
Струк.Вставить("6Тариф", 182.16); 

Правильным решением будет начать имя с буквы, например: Тариф6.

Анализ логической ошибки при передаче параметров в функцию

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


Объект.УслугаГВС = 182.16;
Струк.Вставить("Тариф6", ПолучитьТарифДома(Объект.УслугаГВС, 1));

В результате вычисления функции в структуре оказывается значение 0. Выясним, почему так происходит.

Здесь допущена классическая архитектурная ошибка — несоответствие типов данных (Type Mismatch). Реквизит Объект.УслугаГВС по своей логике должен содержать ссылку на элемент справочника (например, справочник Номенклатура или специализированный справочник Услуги). Функция ПолучитьТарифДома ожидает на вход именно эту ссылку, чтобы внутри себя выполнить запрос к базе данных (например, к регистру сведений цен или тарифов) и найти актуальный тариф для данной конкретной услуги.

Когда разработчик выполняет присвоение Объект.УслугаГВС = 182.16, он заменяет ссылку на число. Функция получает на вход число 182.16. При попытке выполнить запрос с этим числом вместо ссылки база данных логично возвращает пустой результат, и функция возвращает дефолтное значение — 0.

Как решить эту проблему правильно?

Нельзя смешивать саму услугу и её тариф в одном реквизите. В объекте должно быть два разных реквизита:

Правильная последовательность действий выглядит так:


// 1. Убеждаемся, что в Объект.УслугаГВС записана ссылка на услугу ГВС
// 2. Вызываем функцию расчета тарифа, передавая туда ссылку на справочник
ТарифЧислом = ПолучитьТарифДома(Объект.УслугаГВС, 1);

// 3. Записываем полученный числовой результат в структуру
Струк.Вставить("Тариф6", ТарифЧислом);

Как отлаживать подобные ситуации

Для того чтобы быстро выявлять подобные логические несоответствия, рекомендуем использовать встроенные инструменты отладки в Конфигураторе 1С. Пройдем этот процесс по шагам:

  1. Установите точку останова: Найдите строку с вызовом функции ПолучитьТарифДома и нажмите клавишу F9. На полях появится красная точка.
  2. Запустите отладку: Запустите систему в режиме "1С:Предприятие" под отладчиком и выполните действие, приводящее к выполнению этого кода. Программа остановится на выбранной строке.
  3. Проверьте типы данных: Выделите выражение Объект.УслугаГВС, нажмите комбинацию клавиш Shift + F9 (окно «Вычислить выражение»). Посмотрите, какой тип имеет эта переменная. Если вы видите тип Число вместо ожидаемого ссылочного типа (например, СправочникСсылка...), значит, где-то в коде ранее произошло ошибочное переопределение.
  4. Шаг вовнутрь (F11): Нажмите клавишу F11, чтобы зайти внутрь тела функции ПолучитьТарифДома. Пошагово проанализируйте, как обрабатывается переданный параметр, какой запрос выполняется и почему итоговый результат равен нулю.

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

← На главную