Как исправить ошибку уникальности строк при вводе остатков товаров в Альфа-Авто 5.1

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

При переносе данных из предыдущих версий (например, Альфа-Авто 4.1) в новую конфигурацию 5.1 через Excel часто возникает критическая ошибка при попытке записать документ Ввод начальных остатков. Система выдает сообщение: «Таблица < Товары > значения колонок < ЕдиницаИзмерения, ХарактеристикаНоменклатуры, ГТД > не уникальны!». Даже если в исходном файле нет явных дублей, логика работы Альфа-Авто требует специфического подхода к заполнению табличных частей. В этой статье мы подробно разберем причины этой ошибки и пути её решения.

Разбор архитектуры: почему возникает ошибка уникальности

Для начала проанализируем ситуацию с точки зрения логики системы. В Альфа-Авто 5.1 (которая идейно близка к «Управлению торговлей 10.3») реализован жесткий контроль уникальности строк в складских документах. Это необходимо для корректного партионного учета. Система не позволяет хранить в одном документе две строки, которые имеют абсолютно идентичный набор ключевых полей.

Ключевыми полями для проверки уникальности являются:

  1. Номенклатура;
  2. Характеристика номенклатуры (даже если учет по ним не ведется, значение «Пустая ссылка» учитывается);
  3. Единица измерения (важнейший момент, о котором мы поговорим ниже);
  4. ГТД (Номер грузовой таможенной декларации);
  5. Серия (если включен серийный учет).

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

Проблема подчиненных единиц измерения

Выясним причину, которая чаще всего сбивает с толку начинающих разработчиков. В Альфа-Авто справочник ЕдиницыИзмерения является подчиненным справочнику Номенклатура.

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

Распространенная ошибка: программист находит одну общую единицу «шт» через Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("шт") и подставляет её во все строки документа. Это в корне неверно. Для «Товара А» должна быть выбрана его собственная единица «шт», а для «Товара Б» — его собственная, даже если они называются одинаково.

Если вы подставите одну и ту же ссылку на единицу измерения разным товарам, система при проверке уникальности может вести себя непредсказуемо, так как нарушается логическая целостность данных (владелец единицы не совпадает с номенклатурой в строке).

Решение №1: Предварительная агрегация данных (Сворачивание)

Посмотрим на пример правильной организации загрузки. Прежде чем добавлять строки непосредственно в документ, необходимо «свернуть» данные из Excel в таблицу значений. Это позволит объединить дублирующиеся позиции и избежать конфликта уникальности.

Рекомендуется использовать следующий алгоритм в коде 1С:


// Создаем таблицу для предварительной обработки
ТЗ_Остатки = Новый ТаблицаЗначений;
ТЗ_Остатки.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ТЗ_Остатки.Колонки.Добавить("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"));
ТЗ_Остатки.Колонки.Добавить("ЕдиницаИзмерения", Новый ОписаниеТипов("СправочникСсылка.ЕдиницыИзмерения"));
ТЗ_Остатки.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ТЗ_Остатки.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));

// ... Цикл чтения из Excel ...
// Для каждой строки файла ищем товар и его ЕДИНИЦУ ХРАНЕНИЯ
НоваяСтрокаТЗ = ТЗ_Остатки.Добавить();
НоваяСтрокаТЗ.Номенклатура = НайденныйТовар;
// Важно: берем единицу, подчиненную именно этому товару!
НоваяСтрокаТЗ.ЕдиницаИзмерения = НайденныйТовар.ЕдиницаХраненияОстатков; 
НоваяСтрокаТЗ.Количество = КоличествоИзФайла;
НоваяСтрокаТЗ.Сумма = СуммаИзФайла;
// ... Конец цикла ...

// Сворачиваем таблицу по ключевым полям
ТЗ_Остатки.Свернуть("Номенклатура, Характеристика, ЕдиницаИзмерения", "Количество, Сумма");

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

Решение №2: Правильное создание единиц измерения при импорте

Проанализируем ситуацию, когда в новой базе 5.1 еще нет созданных единиц измерения для номенклатуры. При загрузке справочников через КД или Excel необходимо убедиться, что у каждого товара заполнены реквизиты БазоваяЕдиницаИзмерения (из классификатора) и ЕдиницаХраненияОстатков (из подчиненного справочника).

Если вы создаете документы ввода остатков программно и видите ошибку уникальности по единицам, проверьте следующий код поиска единицы:


Функция ПолучитьЕдиницуТовара(ТоварСсылка, ИмяЕдиницы = "шт") Экспорт
    Единица = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию(ИмяЕдиницы, Истина, , ТоварСсылка);
    
    Если Единица.Пустая() Тогда
        // Если единицы нет, её нужно создать программно
        ОбъектЕд = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
        ОбъектЕд.Наименование = ИмяЕдиницы;
        ОбъектЕд.Владелец = ТоварСсылка;
        ОбъектЕд.Коэффициент = 1;
        // Ссылка на классификатор ОКЕИ (например, штуки)
        ОбъектЕд.ЕдиницаПоКлассификатору = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("796"); 
        ОбъектЕд.Записать();
        Единица = ОбъектЕд.Ссылка;
    КонецЕсли;
    
    Возвращает Единица;
КонецФункции

Решение №3: Отключение контроля (крайний случай)

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

Вместо этого лучше воспользоваться встроенной обработкой «Загрузка данных из табличного документа». В ней предусмотрены механизмы поиска существующих объектов и возможность настройки сопоставления полей. Если вы пишете свой загрузчик, обязательно реализуйте метод Свернуть() для коллекции данных перед заполнением документа.

Важные моменты при работе с Характеристиками и ГТД

Даже если в настройках типа номенклатуры указано, что «Учет по характеристикам не ведется», программный код проверки уникальности все равно обращается к этому полю. Если вы загружаете данные из Excel, убедитесь, что:

Подводя итог: ошибка «значения колонок не уникальны» — это защитный механизм Альфа-Авто, предотвращающий замусоривание регистров. Чтобы её обойти, используйте предварительное агрегирование данных в таблице значений и всегда подставляйте в документ единицы измерения, владельцем которых является загружаемая номенклатура.

← На главную