Разработка внешней обработки для импорта данных из внешних файлов — одна из классических задач для начинающего разработчика 1С. Однако при работе с современными конфигурациями (такими как Управление торговлей 11, ERP или Комплексная автоматизация) возникает ряд нюансов, связанных с архитектурой данных и особенностями управляемых форм. Рассмотрим подробно, как правильно организовать загрузку, проверку и визуальное оформление данных.
Проанализируем ситуацию, когда флаг в табличной части (ТЧ) не устанавливается, хотя код выполняется. Ошибка часто кроется в попытке обратиться к визуальному элементу формы вместо строки данных. Рассмотрим разницу:
В исходном коде использовалась конструкция:
ЭтаФорма.Элементы.ТЧ_ДанныеНайденКонтрагент = Истина;
Эта команда пытается изменить свойство элемента управления (колонки) целиком на всей форме, а не значение в конкретной ячейке текущей строки. Выясним причину: программа просто не понимает, в какой именно строке нужно поставить «галку».
Правильный подход заключается в обращении к переменной, содержащей данные конкретной строки, полученной в цикле Для Каждого:
Для Каждого СтрокаДанных Из Объект.ТЧ_Данные Цикл
// ... логика поиска ...
Если КонтрагентНайден Тогда
СтрокаДанных.НайденКонтрагент = Истина;
КонецЕсли;
КонецЦикла;
Одной из главных проблем производительности является выполнение запроса или поиска методом Найти() внутри цикла. Если в файле Excel 1000 строк, программа сделает 1000 обращений к базе данных, что существенно замедлит работу. Разберем по шагам, как сделать это правильно с помощью запроса к таблице значений.
Сначала подготовим типизированную таблицу значений:
ТЗ_ДляПоиска = Новый ТаблицаЗначений;
ТЗ_ДляПоиска.Колонки.Добавить("ИНН", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(12)));
Для Каждого Строка Из Объект.ТЧ_Данные Цикл
НоваяСтрока = ТЗ_ДляПоиска.Добавить();
НоваяСтрока.ИНН = Строка.ИНН;
КонецЦикла;
Теперь передадим эту таблицу в запрос. Это позволит системе одним «выстрелом» сопоставить все данные из файла с данными в базе. Проанализируем пример такого запроса:
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст =
"ВЫБРАТЬ
| ТЗ_ИНН.ИНН КАК ИНН_ИзФайла
|ПОМЕСТИТЬ ВТ_ДанныеФайла
|ИЗ
| &ТЗ_ДляПоиска КАК ТЗ_ИНН
|;
|
|ВЫБРАТЬ
| ВТ_ДанныеФайла.ИНН_ИзФайла,
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| ВТ_ДанныеФайла КАК ВТ_ДанныеФайла
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
| ПО ВТ_ДанныеФайла.ИНН_ИзФайла = Контрагенты.ИНН";
Запрос.УстановитьПараметр("ТЗ_ДляПоиска", ТЗ_ДляПоиска);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
После выполнения такого запроса мы получим таблицу, где напротив каждого ИНН будет либо ссылка на найденного контрагента, либо NULL, если он не найден. Это максимально быстрый способ проверки.
При чтении данных из Excel часто возникают ошибки вида «Преобразование значения к типу Число не может быть выполнено». Посмотрим на причину: Excel может добавлять невидимые символы, такие как неразрывный пробел (код 160), который часто используется как разделитель тысяч.
Важный момент: ИНН и КПП в 1С всегда должны быть строками. Если преобразовывать их в число, ведущие нули (например, в ИНН Москвы) пропадут. Выясним, как правильно очистить строку:
ЧистыйИНН = СокрЛП(СтрокаИзExcel);
// Удаляем неразрывные пробелы
ЧистыйИНН = СтрЗаменить(ЧистыйИНН, Символы.НПП, "");
// Удаляем обычные пробелы
ЧистыйИНН = СтрЗаменить(ЧистыйИНН, " ", "");
Именно такую «чистую» строку нужно записывать в реквизиты объекта и использовать для поиска.
Многие начинающие разработчики пытаются программно менять цвет каждой ячейки в цикле. В управляемом приложении (УФ) это считается плохим тоном и работает неэффективно. Рассмотрим механизм Условного оформления.
Вам не нужно писать код для покраски в процедуре загрузки. Вместо этого настроим правила отображения на самой форме:
Цвет фона — розовый или красный.Объект.ТЧ_Данные.НайденКонтрагент Равно Ложь.Теперь, как только в коде вы установите СтрокаДанных.НайденКонтрагент = Ложь, система автоматически подкрасит строку на экране пользователя.
Особенность конфигурации Управление торговлей 11 заключается в разделении партнеров (управленческий учет) и контрагентов (юридические лица). Проанализируем ситуацию: если вы просто создадите контрагента, вы не найдете у него полей «Основной менеджер» или «Адрес» в привычном виде.
Важные правила загрузки в УТ 11:
ОсновнойМенеджер.Партнер которого записывается ссылка на созданного ранее партнера.В современных конфигурациях адрес — это не просто строка, а запись в табличной части КонтактнаяИнформация. Для работы с ней лучше использовать функции Библиотеки Стандартных Подсистем (БСП). Рассмотрим пример записи фактического адреса:
// Используем программный интерфейс БСП
ВидАдреса = Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента;
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(НовыйКонтрагент, СтрокаДанных.ФактическийАдрес, ВидАдреса, ТипыКонтактнойИнформации.Адрес);
Такой подход гарантирует, что адрес будет правильно распознан системой и корректно отобразится в карточке контрагента.
Подводя итог, разберем общую последовательность действий при загрузке: очищаем данные из Excel (убираем пробелы, проверяем типы), заполняем табличную часть на форме, запускаем массовую проверку через запрос к ТЗ, по результатам проверки устанавливаем флаги «Найдено», а для новых записей — программно создаем связку «Партнер + Контрагент», используя механизмы БСП для заполнения контактной информации.