При переходе на новые конфигурации 1С, такие как «1С:Комплексная автоматизация 2», «1С:ERP Управление предприятием» или «1С:Управление торговлей 11», пользователи часто сталкиваются с необходимостью массового переноса данных из внешних источников. Одной из наиболее трудоемких задач является заполнение пользовательских полей, которые в системе реализованы как дополнительные реквизиты. Например, когда нам нужно загрузить базу из 5 000 партнеров со специфическими аналитическими разрезами: формат торговой точки, территория торгового представителя, подразделение или канал продаж.
В этой статье мы подробно разберем, как устроен механизм дополнительных реквизитов в 1С, рассмотрим штатные инструменты импорта данных из файлов Excel, выясним причины возможных сбоев и предложим альтернативные программные решения.
Прежде чем приступать к загрузке, давайте разберем внутреннюю архитектуру системы 1С. Это поможет нам понять, почему стандартные методы импорта иногда вызывают затруднения.
В отличие от типовых реквизитов (таких как Наименование, ИНН или Телефон), которые физически присутствуют в виде отдельных колонок в таблице справочника базы данных, дополнительные реквизиты хранятся иначе. В системе реализован механизм динамических свойств на базе Библиотеки стандартных подсистем (БСП). У каждого партнера в базе данных существует подчиненная табличная часть с именем ДополнительныеРеквизиты. Каждая строка этой таблицы состоит из двух основных полей:
ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения (например, свойство «Канал продаж»).Справочники.ЗначенияСвойствОбъектов (например, значение «Опт» или «Розница»).Когда мы пытаемся загрузить таблицу Excel, где в одной строке сопоставлены партнер и несколько его дополнительных реквизитов в виде отдельных колонок, программа должна выполнить сложную трансформацию: найти партнера, зайти в его табличную часть, найти или создать строку с нужным свойством и записать туда соответствующее значение.
Современные версии 1С:КА 2 и 1С:ERP содержат мощный встроенный инструмент, который умеет работать с дополнительными реквизитами напрямую. Давайте рассмотрим алгоритм работы с ним по шагам.
Наименование или Код) и колонки с названиями ваших дополнительных реквизитов: Территория ТП, Формат ТТ, Канал продаж.Важный нюанс: Если тип вашего дополнительного реквизита настроен как «Дополнительное значение» (ссылка на список), то при загрузке новых текстовых данных 1С попытается сопоставить их с существующими элементами. Чтобы система автоматически создавала новые значения свойств (например, если в базе еще нет региона «Север», указанного в Excel), в настройках сопоставления колонки обязательно установите флажок Создавать новые.
Иногда пользователи сталкиваются с ситуацией, когда часть реквизитов загружается успешно, а два или три поля остаются незаполненными. Давайте проанализируем основные причины этой проблемы:
Пользователь, Организация, Контрагент), то простое текстовое сопоставление может не сработать. В Excel должны быть указаны точные названия или ИНН объектов, уже существующих в информационной базе.Если среди ваших 5 000 партнеров многие имеют одинаковые значения дополнительных свойств (например, у 2 000 клиентов канал продаж — «Дистрибуция», а у остальных — «Розничные сети»), нет необходимости загружать их построчно. Мы можем использовать стандартную обработку Групповое изменение реквизитов.
Рассмотрим этот процесс подробнее:
Для разработчиков и опытных администраторов самым надежным и гибким решением является использование универсальной обработки «Загрузка данных из табличного документа» (доступна на диске ИТС или портале 1С). Этот инструмент позволяет написать локальный код на встроенном языке 1С непосредственно в момент записи объекта.
Давайте разберем, как написать алгоритм, который будет считывать данные из Excel и принудительно записывать их в табличную часть дополнительных реквизитов партнера.
В настройках обработки перейдем на вкладку «События» и в поле При записи объекта вставим следующий код:
// Очищаем старые значения дополнительных реквизитов, если требуется полная перезапись
Объект.ДополнительныеРеквизиты.Очистить();
// 1. Обработка реквизита "Канал продаж"
ТекСвойствоКанал = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Канал продаж");
Если ЗначениеЗаполнено(ТекСвойствоКанал) Тогда
// Предположим, что в Excel колонка с каналом продаж идет под номером 4 (индекс 3 в массиве ТекстыЯчеек)
ЗначениеИзExcel = ТекстыЯчеек[3];
Если ЗначениеЗаполнено(ЗначениеИзExcel) Тогда
// Ищем существующее значение в подчиненном справочнике
НайденоЗначение = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(ЗначениеИзExcel, Истина, , ТекСвойствоКанал);
// Если значения нет в базе, создаем его программно
Если Не ЗначениеЗаполнено(НайденоЗначение) Тогда
НовоеЗначение = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент();
НовоеЗначение.Владелец = ТекСвойствоКанал;
НовоеЗначение.Наименование = ЗначениеИзExcel;
НовоеЗначение.Записать();
НайденоЗначение = НовоеЗначение.Ссылка;
КонецЕсли;
// Добавляем строку в табличную часть партнера
НоваяСтрока = Объект.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = ТекСвойствоКанал;
НоваяСтрока.Значение = НайденоЗначение;
КонецЕсли;
КонецЕсли;
// 2. Обработка реквизита "Формат ТТ"
ТекСвойствоФормат = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Формат ТТ");
Если ЗначениеЗаполнено(ТекСвойствоФормат) Тогда
// Колонка с форматом торговой точки идет под номером 5 (индекс 4)
ЗначениеИзExcelФормат = ТекстыЯчеек[4];
Если ЗначениеЗаполнено(ValueИзExcelФормат) Тогда
НайденоЗначениеФормат = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(ЗначениеИзExcelФормат, Истина, , ТекСвойствоФормат);
Если Не ЗначениеЗаполнено(НайденоЗначениеФормат) Тогда
НовоеЗначение = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент();
НовоеЗначение.Владелец = ТекСвойствоФормат;
НовоеЗначение.Наименование = ЗначениеИзExcelФормат;
НовоеЗначение.Записать();
НайденоЗначениеФормат = НовоеЗначение.Ссылка;
КонецЕсли;
НоваяСтрока = Объект.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = ТекСвойствоФормат;
НоваяСтрока.Значение = НайденоЗначениеФормат;
КонецЕсли;
КонецЕсли;
// Фиксируем изменения в базе данных
Объект.Записать();
Этот код выполняет следующие важные действия:
ТекстыЯчеек начинается с нуля).ЗначенияСвойствОбъектов с отбором по владельцу (конкретному свойству). Если такого значения нет (например, новый формат магазина), система автоматически создает его, чтобы избежать ошибок сопоставления.ДополнительныеРеквизиты загружаемого объекта.Использование этого подхода гарантирует 100% заполнение любых сложных или нестандартных полей, независимо от настроек интерфейса конфигурации и ограничений БСП.