Как реализовать загрузку контрагентов из Excel в 1С:УТ 11 с поиском по ИНН, раскраской строк и созданием партнеров?

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

Разработка внешней обработки для импорта данных из внешних файлов — одна из классических задач для начинающего разработчика 1С. Однако при работе с современными конфигурациями (такими как Управление торговлей 11, ERP или Комплексная автоматизация) возникает ряд нюансов, связанных с архитектурой данных и особенностями управляемых форм. Рассмотрим подробно, как правильно организовать загрузку, проверку и визуальное оформление данных.

Разбор типичной ошибки: данные против элементов формы

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

В исходном коде использовалась конструкция:

ЭтаФорма.Элементы.ТЧ_ДанныеНайденКонтрагент = Истина;

Эта команда пытается изменить свойство элемента управления (колонки) целиком на всей форме, а не значение в конкретной ячейке текущей строки. Выясним причину: программа просто не понимает, в какой именно строке нужно поставить «галку».

Правильный подход заключается в обращении к переменной, содержащей данные конкретной строки, полученной в цикле Для Каждого:


Для Каждого СтрокаДанных Из Объект.ТЧ_Данные Цикл
    // ... логика поиска ...
    Если КонтрагентНайден Тогда
        СтрокаДанных.НайденКонтрагент = Истина;
    КонецЕсли;
КонецЦикла;

Оптимизация поиска: от циклов к запросам

Одной из главных проблем производительности является выполнение запроса или поиска методом Найти() внутри цикла. Если в файле Excel 1000 строк, программа сделает 1000 обращений к базе данных, что существенно замедлит работу. Разберем по шагам, как сделать это правильно с помощью запроса к таблице значений.

Сначала подготовим типизированную таблицу значений:


ТЗ_ДляПоиска = Новый ТаблицаЗначений;
ТЗ_ДляПоиска.Колонки.Добавить("ИНН", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(12)));

Для Каждого Строка Из Объект.ТЧ_Данные Цикл
    НоваяСтрока = ТЗ_ДляПоиска.Добавить();
    НоваяСтрока.ИНН = Строка.ИНН;
КонецЦикла;

Теперь передадим эту таблицу в запрос. Это позволит системе одним «выстрелом» сопоставить все данные из файла с данными в базе. Проанализируем пример такого запроса:


Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ТЗ_ИНН.ИНН КАК ИНН_ИзФайла
    |ПОМЕСТИТЬ ВТ_ДанныеФайла
    |ИЗ
    |	&ТЗ_ДляПоиска КАК ТЗ_ИНН
    |;
    |
    |ВЫБРАТЬ
    |	ВТ_ДанныеФайла.ИНН_ИзФайла,
    |	Контрагенты.Ссылка КАК Ссылка
    |ИЗ
    |	ВТ_ДанныеФайла КАК ВТ_ДанныеФайла
    |		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
    |		ПО ВТ_ДанныеФайла.ИНН_ИзФайла = Контрагенты.ИНН";

Запрос.УстановитьПараметр("ТЗ_ДляПоиска", ТЗ_ДляПоиска);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();

После выполнения такого запроса мы получим таблицу, где напротив каждого ИНН будет либо ссылка на найденного контрагента, либо NULL, если он не найден. Это максимально быстрый способ проверки.

Очистка данных и проблемы преобразования типов

При чтении данных из Excel часто возникают ошибки вида «Преобразование значения к типу Число не может быть выполнено». Посмотрим на причину: Excel может добавлять невидимые символы, такие как неразрывный пробел (код 160), который часто используется как разделитель тысяч.

Важный момент: ИНН и КПП в 1С всегда должны быть строками. Если преобразовывать их в число, ведущие нули (например, в ИНН Москвы) пропадут. Выясним, как правильно очистить строку:


ЧистыйИНН = СокрЛП(СтрокаИзExcel);
// Удаляем неразрывные пробелы
ЧистыйИНН = СтрЗаменить(ЧистыйИНН, Символы.НПП, "");
// Удаляем обычные пробелы
ЧистыйИНН = СтрЗаменить(ЧистыйИНН, " ", "");

Именно такую «чистую» строку нужно записывать в реквизиты объекта и использовать для поиска.

Визуальное оформление: красим строки в красный цвет

Многие начинающие разработчики пытаются программно менять цвет каждой ячейки в цикле. В управляемом приложении (УФ) это считается плохим тоном и работает неэффективно. Рассмотрим механизм Условного оформления.

Вам не нужно писать код для покраски в процедуре загрузки. Вместо этого настроим правила отображения на самой форме:

  1. Перейдем в свойства формы, вкладка «Условное оформление».
  2. Добавим новый элемент.
  3. В «Оформлении» выберем Цвет фона — розовый или красный.
  4. В «Условии» укажем: Объект.ТЧ_Данные.НайденКонтрагент Равно Ложь.
  5. В «Оформляемых полях» выберем всю строку или конкретные колонки.

Теперь, как только в коде вы установите СтрокаДанных.НайденКонтрагент = Ложь, система автоматически подкрасит строку на экране пользователя.

Архитектура УТ 11: Партнеры, Контрагенты и Менеджеры

Особенность конфигурации Управление торговлей 11 заключается в разделении партнеров (управленческий учет) и контрагентов (юридические лица). Проанализируем ситуацию: если вы просто создадите контрагента, вы не найдете у него полей «Основной менеджер» или «Адрес» в привычном виде.

Важные правила загрузки в УТ 11:

Работа с контактной информацией через БСП

В современных конфигурациях адрес — это не просто строка, а запись в табличной части КонтактнаяИнформация. Для работы с ней лучше использовать функции Библиотеки Стандартных Подсистем (БСП). Рассмотрим пример записи фактического адреса:


// Используем программный интерфейс БСП
ВидАдреса = Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента;
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(НовыйКонтрагент, СтрокаДанных.ФактическийАдрес, ВидАдреса, ТипыКонтактнойИнформации.Адрес);

Такой подход гарантирует, что адрес будет правильно распознан системой и корректно отобразится в карточке контрагента.

Подводя итог, разберем общую последовательность действий при загрузке: очищаем данные из Excel (убираем пробелы, проверяем типы), заполняем табличную часть на форме, запускаем массовую проверку через запрос к ТЗ, по результатам проверки устанавливаем флаги «Найдено», а для новых записей — программно создаем связку «Партнер + Контрагент», используя механизмы БСП для заполнения контактной информации.

← На главную