Время чтения: 10 минут | Уровень: Начинающие разработчики | Платформа: 8.3.25+
Представьте: вы получаете ТЗ на импорт прайса из Excel. 12 колонок, 9 справочников, 10 000 строк. Архитектор говорит: «Только БСП, никаких самописных обработчиков».
Эта статья — готовый рецепт, как настроить масштабируемый импорт, который:
- Не сломается при добавлении новой колонки
- Понятен техподдержке без вашего участия
- Проходит статический анализ без дублирования кода
- Сохраняет нервы пользователя (двухэтапная проверка)
- Чётко различает: пустое значение ≠ ошибка
Общая схема работы
Ниже описан полный цикл обработки данных от выбора файла до записи в регистр:
|
Этап |
Действие |
Результат |
|
1. Выбор файла |
Пользователь загружает Excel через интерфейс БСП |
Таблица значений с исходными данными |
|
2. Пакетный запрос |
ВыполнитьЗапросСопоставления: 18 запросов к БД |
Структура кэша: организации, контрагенты, виды цен, номенклатура |
|
3. Обработка строк |
Каждая строка обрабатывается в памяти по кэшу |
ТаблицаСопоставления с результатами |
|
4. Интерфейс БСП |
Пользователь видит результат сопоставления и правит ошибки |
Скорректированные данные |
|
5. Финальное подтверждение |
Пользователь видит точно, что попадёт в базу |
Подтверждение или отмена |
|
6. Запись |
ЗагрузитьДанные в регистр + журнал регистрации |
Данные в базе, аудиторский след |
Три сценария сопоставления
Сценарий 1: Пустая колонка в файле (бизнес-норма)
Пример: строка файла с незаполненными полями Покупатель и Магазин:
|
Организация |
Покупатель |
Магазин |
Вид цены |
Процент |
|
ООО "Ромашка" |
(пусто) |
(пусто) |
Розница |
15 |
Логика обработки:
- ЗначениеЗаполнено(Покупатель) = Ложь
- ПолучитьСсылкуПоРезультатуСопоставления() сразу возвращает Неопределено
- В список неоднозначностей НЕ попадает (это не ошибка!)
- В итоговой таблице: Покупатель = ПустаяСсылка
|
Это нормально, если бизнес-логика допускает отсутствие покупателя. |
Сценарий 2: Объекта нет в базе
Допустим, контрагент с ИНН 7701234567 не существует в базе:
|
Организация |
Покупатель (ИНН) |
Магазин |
|
ООО "Ромашка" |
7701234567 |
(пусто) |
Логика обработки:
- ЛЕВОЕ СОЕДИНЕНИЕ не находит соответствия → СтрокаРезультата = Неопределено
- СопоставленоКорректно() фиксирует отсутствие записи
- Добавляется в СписокНеоднозначностей
- В интерфейсе БСП пользователь видит: <не найдено: 7701234567>
Действия пользователя:
- Создать нового контрагента
- Исправить ИНН в файле
- Выбрать существующего из списка
Сценарий 3: Неоднозначность (несколько объектов)
В базе две позиции с названием "Футболка Nike" (разные артикулы):
|
Номенклатура |
|
Футболка Nike |
Логика обработки:
- Запрос с группировкой возвращает Количество = 2
- СопоставленоКорректно() фиксирует множественное соответствие
- Добавляется в СписокНеоднозначностей
- Пользователь видит обе позиции и выбирает правильную
|
Неоднозначность — это сигнал пользователю: «Уточни выбор». Интерфейс БСП уже умеет это показывать, наша задача — корректно наполнить список. |
Элементы объектной архитектуры в процедурном коде
Хотя 1С — процедурный язык, в решении применяются принципы ООП, которые делают код поддерживаемым:
|
Принцип |
Реализация в коде |
Выгода |
|
Инкапсуляция |
Структура настроек для каждой колонки |
Данные и правила поиска сгруппированы, внешний код не зависит от внутренней структуры |
|
Стратегия |
НастройкаПоискаПоИмениКолонки() возвращает разные алгоритмы |
Единый интерфейс обработки, разное поведение для ИНН / наименования / артикула |
|
Шаблонный метод |
ОбработатьСтрокуСопоставления() задаёт скелет алгоритма |
Изменение в одном месте влияет на все колонки, соблюдение DRY |
|
Единая ответственность |
Каждая процедура решает одну задачу |
Легко тестировать, искать ошибки, модифицировать без побочных эффектов |
Пример инкапсуляции — настройка поиска для колонки:
// Настройка поиска для колонки
Настройка = Новый Структура;
Настройка.Вставить("ТекстЗапроса", ТекстЗапроса);
Настройка.Вставить("КлючПоиска", КлючПоиска);
Настройка.Вставить("ИмяКолонкиМакета", ИмяКолонкиМакета);
Пример основной процедуры сопоставления:
//универсальный шаблон
//цель, чтобы при других доработках его не нужно было менять
//далее ее можно сделать общей для всех загрузок чуть чуть доработав, но пока такой цели не было.
Процедура СопоставитьЗагружаемыеДанные(
АдресЗагружаемыхДанных,
АдресТаблицыСопоставления,
СписокНеоднозначностей,
ПолноеИмяТабличнойЧасти,
ДополнительныеПараметры) Экспорт
ТаблицаСопоставления = ПолучитьИзВременногоХранилища(
АдресТаблицыСопоставления);
ЗагружаемыеДанные = ПолучитьИзВременногоХранилища(
АдресЗагружаемыхДанных);
Результаты = ВыполнитьЗапросСопоставления(ЗагружаемыеДанные);
Для Каждого СтрокаДанных Из ЗагружаемыеДанные Цикл
НоваяСтрока = ТаблицаСопоставления.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаДанных);
ОбработатьСтрокуСопоставления(
НоваяСтрока,
СтрокаДанных,
Результаты,
СписокНеоднозначностей);
КонецЦикла;
ПоместитьВоВременноеХранилище(
ТаблицаСопоставления, АдресТаблицыСопоставления);
КонецПроцедуры
|
Не нужно ждать, когда в 1С появится полноценная ООП-модель. Принципы можно применять уже сейчас — код станет чище и гибче. |
Интерфейс пользователя: двухэтапная проверка
Этап 1: Предварительное сопоставление
Пользователь видит «сырые» данные из файла и результаты автоматического сопоставления. Ошибки выделены цветом, неоднозначности помечены специальным значком.
Этап 2: Финальное подтверждение
Пользователь видит, что именно будет записано в базу: ссылки на объекты, точные реквизиты, итоговые суммы.
Зачем это нужно:
- Снижает когнитивную нагрузку: сначала «nайти ошибки», потом «подтвердить результат»
- Даёт возможность исправить данные до записи в регистр
- Формирует аудиторский след: что было в файле → что попало в базу
|
Двухэтапная проверка — это не «лишний клик», а страховка от дорогостоящих ошибок в данных. |
Чек-лист внедрения
Шаг 1: Скачайте шаблон в статье
Шаг 2: Запустите тестовую загрузку в типовой демо-базе
Шаг 3: Как адаптировать под свой объект — 4 точки изменений
|
Что менять |
Где в коде |
|
Список колонок файла и их типы |
ОписаниеКолонокМакетаДляЗагрузки в модуле формы |
|
Сущности для сопоставления |
ТекстЗапросаСопоставленияДанных + ВыполнитьЗапросСопоставления |
|
Настройки поиска по колонкам |
ИнициализироватьСписокКолонок + НастройкаПоискаПоИмениКолонки |
|
Обязательные поля при записи |
ОбязательныеЗначенияЗаполнены |
Всё остальное — универсальный каркас, который не трогают.
Шаг 4: Протестируйте граничные случаи
Создайте тестовый файл с 5 строками:
- [ ] Все колонки заполнены, все объекты есть в базе — ожидаем успех
- [ ] Одна колонка пустая — ожидаем: не ошибка
- [ ] Объект не найден в базе — ожидаем: попадание в неоднозначности
- [ ] Неоднозначность: несколько объектов с одинаковым названием — ожидаем: выбор пользователем
- [ ] Обязательное поле пустое — ожидаем: ошибка при финальной загрузке
Шаг 5: Документируйте для пользователей
- [ ] Создайте инструкцию: как скачать шаблон, какие колонки обязательные
- [ ] Добавьте скриншоты интерфейса с пояснениями
- [ ] Укажите контакты техподдержки для вопросов по неоднозначностям
Шаг 6: Запросите код-ревью
- [ ] Покажите обработку коллеге: понятна ли логика без ваших комментариев?
- [ ] Прогоните через встроенный анализатор: нет ли дублирования?
- [ ] Убедитесь, что все запросы параметризованы (защита от инъекций)
Готово.
У вас работает масштабируемый импорт на БСП, который:
- Принимает архитектура
- Понимает техподдержка
- Не ломается при изменениях
- Бережёт нервы пользователей
Перед применением ознакомьтесь с документацией на ИТС, а так же со статьей.
Спасибо за внимание!
P.S
Предусмотрено несколько вариантов доната с разными ценовыми опциями, чтобы каждый мог поддержать автора в соответствии со своими возможностями и уровнем вовлечённости.
Проверено на следующих конфигурациях и релизах:
- 1С:ERP Управление предприятием 2, релизы 2.5.26.93
Вступайте в нашу телеграмм-группу Инфостарт