В процессе внедрения или перехода на новые конфигурации 1С часто возникает задача массового наполнения базы данных. Типичный сценарий: у клиента есть список из сотен ИНН контрагентов (например, выгруженный из старой CRM-системы или таблицы Excel), и необходимо быстро создать по ним полноценные карточки в новой базе 1С. При этом крайне желательно использовать встроенный сервис автоматического заполнения реквизитов по ИНН (сервис «1С:Контрагент»), чтобы не вводить адреса, КПП и наименования вручную, а также избежать дублирования информации.
Сложность заключается в том, что перед исполнителем (которым часто выступает консультант или аналитик, а не программист) стоит задача сделать это «вчера» и без привлечения дефицитных ресурсов разработки. В данной статье мы подробно разберем три различных метода решения этой задачи: от продвинутого low-code подхода с использованием BDD-сценариев автоматизации до стандартных интерактивных механизмов и классической программной обработки в несколько строк.
Этот способ идеально подходит для ИТ-консультантов и аналитиков, которые работают в современных проектах внедрения (например, на ERP или комплексных проектах), где активно применяется методология BDD (Behavior-Driven Development) и автотесты. Для реализации нам понадобится популярный инструмент автоматизации Vanessa Automation (или Vanessa-ADD), работающий в режиме Тест-Клиента.
Суть метода заключается в том, что мы создаем специальный сценарий (так называемый «фича-файл» с расширением .feature), который имитирует действия реального пользователя. Робот открывает форму создания контрагента, вводит ИНН, нажимает кнопку автозаполнения, ждет ответа от сервиса и записывает элемент. Давайте пошагово разберем, как устроен этот механизм.
Сначала мы создаем экспортный (шаблонный) сценарий, который умеет создавать одного контрагента по переданному параметру. Такой сценарий оформляется в виде отдельного файла и помечается тегом @ExportScenarios. Напишем его на понятном «человеческом» языке (языке Gherkin):
# language: ru
@ExportScenarios
Функционал: Вспомогательные сценарии для создания данных
Сценарий: Создать одного контрагента по ИНН
* ИННКонтрагента = Параметры[0]
Когда Я открываю список справочника "Контрагенты"
И Я нажимаю кнопку "Создать"
И Я ввожу текст ИННКонтрагента в поле "ИНН"
И Я нажимаю кнопку "Заполнить по ИНН"
И Я жду закрытия окна ожидания в течение 10 секунд
И Я нажимаю кнопку "Записать и закрыть"
Этот сценарий работает аналогично функции в программировании. Теперь нам нужно запустить его в цикле для всего списка ИНН, который предоставил клиент. Для этого мы создаем основной сценарий, используя конструкцию «Структура сценария» (Scenario Outline) и блок «Примеры» (Examples). Консультанту достаточно просто скопировать колонку ИНН из Excel и вставить ее прямо в таблицу примеров сценария:
# language: ru
Функционал: Массовая загрузка контрагентов
Структура сценария: Загрузка списка контрагентов из таблицы
Когда Я вызываю экспортный сценарий "Создать одного контрагента по ИНН" с параметрами:
| <ИНН> |
Примеры:
| ИНН |
| 7701234567 |
| 7802345678 |
| 5003144169 |
| 7714000111 |
При запуске этого файла через обработку Vanessa Automation, система автоматически запустит 1С в режиме тест-клиента, откроет базу и последовательно, строка за строкой, прокликает интерфейс для каждого ИНН из списка. Преимущества этого метода очевидны: нет необходимости писать код на встроенном языке 1С, обходятся все интерфейсные проверки и гарантированно отрабатывает стандартная бизнес-логика системы (включая проверку дублей, если она настроена в интерфейсе формы).
Если на проекте не используется Vanessa Automation, мы можем воспользоваться исключительно штатными инструментами современных конфигураций 1С (таких как «1С:Бухгалтерия 3.0», «1С:ERP» или «1С:Комплексная автоматизация»). Разберем этот сценарий по шагам.
ДанныеЗаполнения = РаботаСКонтрагентами.РеквизитыЮридическогоЛицаПоИНН(Объект.ИНН);
Если ДанныеЗаполнения <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(Объект, ДанныеЗаполнения);
Объект.Записать();
КонецЕсли;
Если у вас есть доступ к конфигуратору или в вашем распоряжении имеется программист 1С на 15 минут, самым быстрым техническим решением будет написание простой внешней обработки. В современных конфигурациях 1С, использующих БСП (Библиотеку стандартных подсистем), за интеграцию с сервисом ФНС отвечает общий модуль РаботаСКонтрагентами.
Давайте рассмотрим пример готовой серверной процедуры, которая принимает массив ИНН, проверяет базу на наличие дублей, обращается к веб-сервису и создает новые элементы справочника Справочники.Контрагенты:
&НаСервере
Процедура СоздатьКонтрагентовПоМассивуИНН(МассивИНН)
Для Каждого ТекИНН Из МассивИНН Цикл
// Шаг 1. Проверяем контрагента на дублирование в базе данных
СсылкаНаДубль = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ТекИНН);
Если ЗначениеЗаполнено(СсылкаНаДубль) Тогда
ЗаписьЖурналаРегистрации("МассовоеСозданиеКонтрагентов",
УровеньЖурналаРегистрации.Предупреждение, , ,
"Контрагент с ИНН " + ТекИНН + " уже существует в базе.");
Продолжить;
КонецЕсли;
// Шаг 2. Получаем структуру данных юридического лица из сервиса 1С:Контрагент
ДанныеКонтрагента = РаботаСКонтрагентами.РеквизитыЮридическогоЛицаПоИНН(ТекИНН);
Если ДанныеКонтрагента = Неопределено Тогда
ЗаписьЖурналаРегистрации("МассовоеСозданиеКонтрагентов",
УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось получить данные от ФНС по ИНН: " + ТекИНН);
Продолжить;
КонецЕсли;
// Шаг 3. Создаем новый объект и заполняем его реквизиты
НовыйОбъект = Справочники.Контрагенты.СоздатьЭлемент();
НовыйОбъект.ИНН = ТекИНН;
// Заполняем реквизиты объекта на основе структуры, полученной из веб-сервиса
ЗаполнитьЗначенияСвойств(НовыйОбъект, ДанныеКонтрагента);
// Шаг 4. Безопасная запись объекта в базу данных
Попытка
НовыйОбъект.Записать();
ЗаписьЖурналаРегистрации("МассовоеСозданиеКонтрагентов",
УровеньЖурналаРегистрации.Информация, , ,
"Успешно создан контрагент: " + НовыйОбъект.Наименование + " (ИНН " + ТекИНН + ")");
Исключение
ЗаписьЖурналаРегистрации("МассовоеСозданиеКонтрагентов",
УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка при записи контрагента с ИНН " + ТекИНН + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Этот код представляет собой законченное техническое решение. Мы анализируем каждый ИНН, защищаем базу от появления одинаковых записей, корректно обрабатываем потенциальные ошибки связи с сервером ФНС (например, если сервис временно недоступен или ИНН указан неверно) и фиксируем все результаты в Журнале регистрации, что позволяет легко проконтролировать процесс загрузки.
Выбор оптимального метода создания контрагентов зависит от доступных инструментов и ролей специалистов на проекте:
РаботаСКонтрагентами.РеквизитыЮридическогоЛицаПоИНН() (Вариант 3).