Как правильно использовать выражения для расчета цен при загрузке данных из Excel в 1С:Управление торговлей

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

При автоматизации загрузки прайс-листов в 1С:Управление торговлей (УТ) часто возникает необходимость не просто перенести данные «как есть», но и произвести на лету определенные вычисления. Например, добавить наценку, пересчитать валюту или объединить данные из нескольких колонок. Для этих целей в популярной обработке «Загрузка данных из табличного документа» предусмотрен механизм вычисляемых выражений. Однако начинающие специалисты часто сталкиваются с тем, что их формулы либо выдают ошибку, либо работают некорректно.

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

Разбор основной ошибки: почему 50 + 10 превращается в 5010

Рассмотрим ситуацию: пользователь пытается прибавить 1% к значению в 17-й колонке и пишет выражение:

Результат = ТекстыЯчеек.Получить(17) + ТекстыЯчеек.Получить(17) / 100 * 1

Проанализируем причину неудачи. В контексте данной обработки параметр ТекстыЯчеек — это массив, содержащий строковые представления данных из файла. Даже если в ячейке Excel написано число 100, для системы 1С это текстовая строка "100".

При попытке выполнить сложение строк в 1С происходит их конкатенация (склеивание). Если вы напишете "50" + "10", результатом будет строка "5010", а не число 60. Более того, выполнение математических операций (деление, умножение) над строками напрямую вызовет ошибку исполнения кода.

Решение: Для выполнения расчетов необходимо всегда использовать функцию Число(), которая преобразует текст в числовой формат. Правильное выражение для наценки в 1% будет выглядеть так:


ЦенаЧислом = Число(ТекстыЯчеек.Получить(17));
Результат = ЦенаЧислом + (ЦенаЧислом / 100 * 1);

Нюансы индексации колонок (нулевой индекс)

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

Если ваша целевая цена находится в 17-й колонке таблицы Excel (столбец Q), то в коде вы должны использовать индекс 16. Посмотрим на примере обращения через квадратные скобки (синтаксический сахар для метода Получить):


// Обращаемся к 17-й колонке (индекс 16)
Результат = Число(ТекстыЯчеек[16]) * 1.01; 

Очистка «грязных» данных из файлов Excel

Часто функция Число() выдает ошибку преобразования, даже если в ячейке визуально находится число. Это происходит из-за невидимых символов или специфического форматирования Excel. Проанализируем самые частые причины:

  1. Неразрывные пробелы: Часто встречаются при выгрузке данных из веб-сайтов или других учетных систем. Обычный пробел (код 32) и неразрывный пробел (код 160) — это разные символы для 1С.
  2. Разделители групп разрядов: Если в ячейке написано "1 500,00", наличие пробела между тысячами и сотнями сделает строку «нечисловой».
  3. Символы валют и лишний текст: Обозначения вроде "руб.", "грн." или "шт." должны быть удалены перед расчетом.

Разберем универсальный способ подготовки данных. Мы рекомендуем использовать функцию СтрЗаменить() для удаления всех видов пробелов:


// Удаляем обычные пробелы и неразрывные пробелы (Символы.НПП)
ОчищенныйТекст = СтрЗаменить(ТекстЯчейки, " ", "");
ОчищенныйТекст = СтрЗаменить(ОчищенныйТекст, Символы.НПП, "");
// Заменяем запятую на точку, если это необходимо для корректного распознавания
ОчищенныйТекст = СтрЗаменить(ОчищенныйТекст, ",", ".");

Результат = Число(ОчищенныйТекст);

Использование логических условий (Тернарный оператор)

Механизм выражений позволяет использовать логику «если ... то ...». Например, вы хотите применить наценку только к товарам, чья базовая цена превышает 1000 рублей. Для этого удобно использовать тернарный оператор ?().

Рассмотрим пример:


БазоваяЦена = Число(СтрЗаменить(ТекстЯчейки, Символы.НПП, ""));
// Если цена > 1000, добавляем 5%, если меньше — оставляем как есть
Результат = ?(БазоваяЦена > 1000, БазоваяЦена * 1.05, БазоваяЦена);

Также можно использовать параметр Отказ для фильтрации строк. Если в выражении написать Отказ = Истина, данная строка прайса вообще не будет загружена. Это полезно, если в файле встречаются пустые строки или строки с нулевой ценой.

Расширенные возможности: Поиск объектов и внешние модули

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


// Поиск единицы измерения по наименованию из текущей ячейки
Результат = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоНаименованию(ТекстЯчейки);

Если же логика расчета становится слишком сложной (например, наценка зависит от категории номенклатуры и текущего курса валют), рекомендуется вынести её в экспортную функцию общего модуля вашей конфигурации. Проанализируем, как это упрощает выражение в обработке:


// Вся сложная логика скрыта внутри функции общего модуля
Результат = МойОбщийМодульСервер.РассчитатьЦенуСУчетомСкидок(ТекстыЯчеек);

Важно: Обработка выполняется в контексте сервера, поэтому вызываемые функции также должны находиться в модулях с установленным флагом «Сервер».

Итоги и рекомендации

Подведем итоги нашей совместной работы по изучению выражений в загрузке данных:

  1. Всегда преобразуйте типы: Данные из ТекстыЯчеек — это всегда строки. Используйте Число().
  2. Следите за индексами: Помните про правило «минус один» (17-я колонка = индекс 16).
  3. Чистите данные: Удаляйте пробелы и неразрывные символы перед вычислениями.
  4. Проверяйте на пустоту: Перед преобразованием в число полезно проверить ПустаяСтрока(ТекстЯчейки), чтобы избежать лишних ошибок в протоколе загрузки.

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

← На главную