При автоматизации загрузки прайс-листов в 1С:Управление торговлей (УТ) часто возникает необходимость не просто перенести данные «как есть», но и произвести на лету определенные вычисления. Например, добавить наценку, пересчитать валюту или объединить данные из нескольких колонок. Для этих целей в популярной обработке «Загрузка данных из табличного документа» предусмотрен механизм вычисляемых выражений. Однако начинающие специалисты часто сталкиваются с тем, что их формулы либо выдают ошибку, либо работают некорректно.
В этой статье мы подробно разберем, как правильно писать выражения, избегать типичных ошибок с типами данных и обеспечивать стабильную загрузку даже «грязных» данных из файлов Excel.
Рассмотрим ситуацию: пользователь пытается прибавить 1% к значению в 17-й колонке и пишет выражение:
Результат = ТекстыЯчеек.Получить(17) + ТекстыЯчеек.Получить(17) / 100 * 1
Проанализируем причину неудачи. В контексте данной обработки параметр ТекстыЯчеек — это массив, содержащий строковые представления данных из файла. Даже если в ячейке Excel написано число 100, для системы 1С это текстовая строка "100".
При попытке выполнить сложение строк в 1С происходит их конкатенация (склеивание). Если вы напишете "50" + "10", результатом будет строка "5010", а не число 60. Более того, выполнение математических операций (деление, умножение) над строками напрямую вызовет ошибку исполнения кода.
Решение: Для выполнения расчетов необходимо всегда использовать функцию Число(), которая преобразует текст в числовой формат. Правильное выражение для наценки в 1% будет выглядеть так:
ЦенаЧислом = Число(ТекстыЯчеек.Получить(17));
Результат = ЦенаЧислом + (ЦенаЧислом / 100 * 1);
Важный технический момент, который часто упускают: в языке 1С (как и в большинстве языков программирования) обращение к элементам массива начинается с нуля. Это означает следующее:
ТекстыЯчеек.Получить(0) — это данные из 1-й колонки файла;ТекстыЯчеек.Получить(1) — это данные из 2-й колонки;ТекстыЯчеек.Получить(17) — это данные из 18-й колонки.Если ваша целевая цена находится в 17-й колонке таблицы Excel (столбец Q), то в коде вы должны использовать индекс 16. Посмотрим на примере обращения через квадратные скобки (синтаксический сахар для метода Получить):
// Обращаемся к 17-й колонке (индекс 16)
Результат = Число(ТекстыЯчеек[16]) * 1.01;
Часто функция Число() выдает ошибку преобразования, даже если в ячейке визуально находится число. Это происходит из-за невидимых символов или специфического форматирования Excel. Проанализируем самые частые причины:
Разберем универсальный способ подготовки данных. Мы рекомендуем использовать функцию СтрЗаменить() для удаления всех видов пробелов:
// Удаляем обычные пробелы и неразрывные пробелы (Символы.НПП)
ОчищенныйТекст = СтрЗаменить(ТекстЯчейки, " ", "");
ОчищенныйТекст = СтрЗаменить(ОчищенныйТекст, Символы.НПП, "");
// Заменяем запятую на точку, если это необходимо для корректного распознавания
ОчищенныйТекст = СтрЗаменить(ОчищенныйТекст, ",", ".");
Результат = Число(ОчищенныйТекст);
Механизм выражений позволяет использовать логику «если ... то ...». Например, вы хотите применить наценку только к товарам, чья базовая цена превышает 1000 рублей. Для этого удобно использовать тернарный оператор ?().
Рассмотрим пример:
БазоваяЦена = Число(СтрЗаменить(ТекстЯчейки, Символы.НПП, ""));
// Если цена > 1000, добавляем 5%, если меньше — оставляем как есть
Результат = ?(БазоваяЦена > 1000, БазоваяЦена * 1.05, БазоваяЦена);
Также можно использовать параметр Отказ для фильтрации строк. Если в выражении написать Отказ = Истина, данная строка прайса вообще не будет загружена. Это полезно, если в файле встречаются пустые строки или строки с нулевой ценой.
Выражения можно использовать не только для математики, но и для поиска ссылочных данных. Выясним, как найти единицу измерения или склад по названию из файла:
// Поиск единицы измерения по наименованию из текущей ячейки
Результат = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоНаименованию(ТекстЯчейки);
Если же логика расчета становится слишком сложной (например, наценка зависит от категории номенклатуры и текущего курса валют), рекомендуется вынести её в экспортную функцию общего модуля вашей конфигурации. Проанализируем, как это упрощает выражение в обработке:
// Вся сложная логика скрыта внутри функции общего модуля
Результат = МойОбщийМодульСервер.РассчитатьЦенуСУчетомСкидок(ТекстыЯчеек);
Важно: Обработка выполняется в контексте сервера, поэтому вызываемые функции также должны находиться в модулях с установленным флагом «Сервер».
Подведем итоги нашей совместной работы по изучению выражений в загрузке данных:
ТекстыЯчеек — это всегда строки. Используйте Число().ПустаяСтрока(ТекстЯчейки), чтобы избежать лишних ошибок в протоколе загрузки.Соблюдение этих правил позволит вам создавать гибкие и надежные алгоритмы загрузки данных, экономя время на ручной обработке прайс-листов.