При импорте больших массивов информации из внешних файлов (например, отчетов поставщиков или прайс-листов в формате Excel) пользователи и разработчики часто сталкиваются с неприятной проблемой — наличием невидимых ведущих или замыкающих пробелов в текстовых полях. Внешне строки могут выглядеть абсолютно одинаково, но для платформы 1С предприятия значения " Товар", "Товар " и "Товар" — это три абсолютно разные строки.
Наличие таких невидимых пробелов приводит к дублированию элементов в справочниках (например, в справочнике Номенклатура или Контрагенты), сбоям при поиске сопоставлений и ошибкам в аналитических отчетах. Для борьбы с этой проблемой во встроенном языке 1С существует стандартная функция СокрЛП (Сократить Левые Правые), которая эффективно удаляет все незначащие пробелы в начале и в конце строки.
В этой статье мы подробно разберем, как интегрировать вызов функции СокрЛП при использовании стандартной внешней обработки «Загрузка данных из табличного документа» без необходимости изменения ее исходного кода в конфигураторе.
Прежде чем перейти к технической реализации, давайте проанализируем ситуацию и выясним основные причины появления нежелательных пробелов в файлах импорта:
Если загрузить такие данные «как есть», поиск существующих элементов по наименованию или артикулу завершится неудачей, и система создаст дубликаты карточек товаров или контрагентов, что впоследствии потребует ручной чистки базы данных.
Стандартная обработка загрузки данных обладает очень мощным и гибким функционалом, позволяющим выполнять произвольный код на встроенном языке 1С для каждого обрабатываемого поля. Нам не нужно открывать конфигуратор — все настройки выполняются непосредственно в режиме 1С:Предприятие.
Давайте разберем этот процесс по шагам:
Наименование или Артикул).В поле выражения мы можем использовать предопределенные переменные, предоставляемые обработкой. Рассмотрим основные из них:
Результат — конечное вычисляемое значение, которое в итоге будет записано в реквизит объекта. По умолчанию на входе в выражение оно содержит значение, указанное как значение по умолчанию в настройках.ТекстЯчейки — исходное текстовое значение из текущей ячейки импортируемого файла.ТекстыЯчеек — одномерный массив строк, содержащий текстовые значения всех ячеек текущей строки файла. Индексация массива начинается с нуля.ТекущиеДанные — структура, содержащая уже обработанные и подготовленные значения для других реквизитов текущей строки.ОписаниеОшибки — строковая переменная, в которую можно записать текст ошибки. Если эта переменная будет заполнена, загрузка строки прервется, а текст запишется в лог.Теперь рассмотрим варианты формул, которые можно написать в поле выражения:
Вариант А: Очистка значения текущей ячейки (классический вариант)
Если мы хотим взять текст непосредственно из ячейки файла, привязать его к реквизиту и сразу обрезать пробелы, пишем следующий код:
Результат = СокрЛП(ТекстЯчейки);
Вариант Б: Очистка предварительно вычисленного значения по умолчанию
Если для реквизита настроено заполнение значением по умолчанию и мы хотим гарантировать отсутствие пробелов в нем, используем конструкцию:
Результат = СокрЛП(Результат);
Вариант В: Получение данных из соседней колонки файла
Если при заполнении реквизита нам требуется взять данные не из текущей сопоставленной колонки, а из соседней (например, из первой колонки файла, индекс которой равен 0), мы пишем:
Результат = СокрЛП(ТекстыЯчеек[0]);
После ввода выражения нажмите кнопку подтверждения. Теперь при импорте система будет на лету вызывать встроенную функцию фильтрации для каждого элемента.
Что делать, если в загружаемом файле содержится несколько десятков колонок, и практически каждая из них (наименование, артикул, полное наименование, комментарий, адрес, телефон) может содержать нежелательные пробелы? Прописывать формулу для каждого реквизита отдельно — трудоемкая задача.
В этом случае гораздо эффективнее использовать механизмы обработки событий объекта, которые выполняются централизованно. Выполним настройку по шагам:
Объект, которая представляет собой непосредственно записываемый элемент справочника или документ.Пример кода для обработки события:
Объект.Наименование = СокрЛП(Объект.Наименование);
Объект.Артикул = СокрЛП(Объект.Артикул);
Объект.НаименованиеПолное = СокрЛП(Объект.НаименованиеПолное);
Этот способ имеет неоспоримое преимущество: код выполняется один раз непосредственно перед записью объекта в базу данных. Это гарантирует, что даже если данные были изменены какими-то другими промежуточными алгоритмами загрузки, в базу они попадут в абсолютно чистом виде.
Рассмотрим альтернативную ситуацию: вы не являетесь программистом 1С, у вас нет прав на редактирование настроек загрузки или вы боитесь допустить ошибку в кодовой части. В таком случае проблему можно решить еще до того, как данные попадут в обработку импорта — на этапе подготовки файла в табличном редакторе Microsoft Excel или непосредственно внутри встроенного текстового редактора 1С.
Если мы работаем в Microsoft Excel, воспользуемся стандартной текстовой функцией очистки:
A) создайте пустой вспомогательный столбец.=СЖПРОБЕЛЫ(A1) (если вы используете англоязычную версию Microsoft Excel, используйте формулу =TRIM(A1)).A и выберите пункт меню «Вставить как значения» (Вставка специальных значений без сохранения формул).После этой несложной процедуры файл полностью готов к загрузке через стандартную обработку 1С с параметрами по умолчанию, без необходимости написания программных скриптов.
Также не забывайте, что если табличный документ уже скопирован и открыт непосредственно в поле табличного документа обработки 1С, вы можете отредактировать ячейки прямо в нем вручную, если объем данных невелик, однако автоматические формулы в Excel или обработчики событий в 1С безусловно экономят колоссальное количество времени при работе со справочниками на тысячи позиций.
Выбирайте наиболее подходящий под ваши задачи метод и наслаждайтесь чистотой и корректностью данных в ваших информационных базах 1С!