Как организовать генерацию уникальных идентификаторов в Excel для синхронизации с 1С?

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

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

Метод 1. Использование внутреннего GUID из 1С (Рекомендуемый)

Самый надежный способ — это не генерировать новые значения в Excel, а использовать уже существующие уникальные идентификаторы объектов из базы 1С. У каждого элемента справочника в 1С есть свой УникальныйИдентификатор (GUID), который никогда не меняется.

Проанализируем правильный алгоритм действий при выгрузке данных:

  1. При формировании файла Excel из 1С добавим техническую колонку "ID". Эту колонку лучше сделать скрытой или защищенной от редактирования.
  2. В эту колонку для каждой строки запишем строковое представление ссылки.

Пример кода на стороне 1С для выгрузки GUID в ячейку Excel:


// Предположим, что ЭксельОбъект — это COM-объект Excel
// ТекущаяСтрока — номер строки в листе
// СсылкаНаЭлемент — ссылка на товар или услугу в 1С

ИдентификаторСтрокой = Строка(СсылкаНаЭлемент.УникальныйИдентификатор());
Лист.Cells(ТекущаяСтрока, НомерКолонкиID).Value = ИдентификаторСтрокой;

При обратной загрузке нам достаточно прочитать этот GUID и найти объект в базе одной командой Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(ЗначениеИзЯчейки)). Это исключает любые ошибки поиска по наименованию.

Метод 2. Генерация статических идентификаторов через VBA

Если данные начинают свой путь из Excel (например, новые услуги создаются пользователем в файле), нам нужно сгенерировать уникальное значение прямо в таблице. Как было отмечено в обсуждении, стандартная функция СЛУЧМЕЖДУ не подходит, так как она пересчитывается при любом изменении листа.

Рассмотрим вариант использования макроса VBA, который генерирует настоящий GUID и записывает его в ячейку как константу. Разберем код функции, которую можно вызвать при нажатии кнопки или при событии изменения строки:


Function GenerateGUID() As String
    Dim TypeLib As Object
    Set TypeLib = CreateObject("Scriptlet.TypeLib")
    GenerateGUID = Mid(TypeLib.GUID, 2, 36)
End Function

Sub AssignIDToActiveRow()
    ' Присваиваем ID текущей строке в колонку 1, если она пустая
    If IsEmpty(Cells(ActiveCell.Row, 1)) Then
        Cells(ActiveCell.Row, 1).Value = GenerateGUID()
    End If
End Sub

Такой идентификатор будет выглядеть как 550e8400-e29b-41d4-a716-446655440000. Он гарантированно уникален и не изменится, пока пользователь не удалит его вручную.

Метод 3. Использование Power Query для создания индексов

Если вы используете современные версии Excel, проанализируем возможности инструмента Power Query. Он позволяет преобразовывать данные перед загрузкой. В Power Query можно добавить "Столбец индекса", однако помните, что при удалении или вставке строк в середине таблицы индексы могут пересчитаться.

Чтобы создать более устойчивую связь, выполним следующие шаги в Power Query:

  1. Загрузим таблицу в редактор запросов.
  2. Используем функцию Text.NewGuid() (доступна в Power BI и некоторых версиях Excel через пользовательские функции) или создадим составной ключ из даты создания и случайного числа.
  3. Главное условие: результат должен быть "зафиксирован" в таблице как статичное значение перед тем, как файл попадет на обработку в 1С.

Метод 4. Защита идентификаторов от изменений

Выясним причину, по которой системы обмена часто дают сбой. Это человеческий фактор: пользователи копируют строки вместе с идентификаторами, создавая дубли, или случайно удаляют их. Разберем, как защитить наш механизм поиска в Excel.

Воспользуемся встроенной функцией Проверка данных (Data Validation):

  1. Выделим колонку с нашими идентификаторами.
  2. Перейдем в меню "Данные" -> "Проверка данных".
  3. Выберем тип "Другой" и введем формулу для запрета дубликатов: =СЧЁТЕСЛИ($A:$A; A1)=1 (где A — колонка с ID).

Теперь Excel просто не позволит пользователю вставить или вписать уже существующий идентификатор в другую строку.

Стратегия обработки новых элементов

Проанализируем ситуацию: что делать, если пользователь добавил новую услугу в Excel, у которой еще нет ID из 1С? Мы рекомендуем следующую логику в обработке 1С:

  1. Если при чтении строки колонка ID пустая — 1С воспринимает это как создание нового элемента.
  2. После создания элемента в справочнике 1С, программа должна при следующей выгрузке "вернуть" присвоенный GUID обратно в файл Excel.
  3. Если колонка ID заполнена — 1С ищет элемент по нему. Если находит — обновляет (например, меняет наименование), если не находит (редкий случай) — выдает ошибку или создает новый.

Таким образом, мы создаем замкнутый цикл синхронизации, где первичным ключом является технический идентификатор, а не человекочитаемое название. Это делает обмен данными между 1С и Excel профессиональным и устойчивым к ошибкам.

← На главную