При переносе данных из предыдущих версий (например, Альфа-Авто 4.1) в новую конфигурацию 5.1 через Excel часто возникает критическая ошибка при попытке записать документ Ввод начальных остатков. Система выдает сообщение: «Таблица < Товары > значения колонок < ЕдиницаИзмерения, ХарактеристикаНоменклатуры, ГТД > не уникальны!». Даже если в исходном файле нет явных дублей, логика работы Альфа-Авто требует специфического подхода к заполнению табличных частей. В этой статье мы подробно разберем причины этой ошибки и пути её решения.
Для начала проанализируем ситуацию с точки зрения логики системы. В Альфа-Авто 5.1 (которая идейно близка к «Управлению торговлей 10.3») реализован жесткий контроль уникальности строк в складских документах. Это необходимо для корректного партионного учета. Система не позволяет хранить в одном документе две строки, которые имеют абсолютно идентичный набор ключевых полей.
Ключевыми полями для проверки уникальности являются:
Если в вашем загрузочном файле Excel один и тот же товар встречается дважды (например, с разной ценой или просто разными строками), то при программном заполнении документа 1С попытается создать две записи. При записи объекта сработает стандартная процедура ПроверитьУникальностьСтрок, которая обнаружит совпадение по ключевым полям и заблокирует транзакцию.
Выясним причину, которая чаще всего сбивает с толку начинающих разработчиков. В Альфа-Авто справочник ЕдиницыИзмерения является подчиненным справочнику Номенклатура.
Рассмотрим подробнее: в системе есть «Классификатор единиц измерения» (ОКЕИ), где хранятся общие понятия (штуки, литры, метры). Однако в табличную часть документа Товары подставляется не элемент классификатора, а элемент справочника ЕдиницыИзмерения, владельцем которого является конкретная карточка товара.
Распространенная ошибка: программист находит одну общую единицу «шт» через Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("шт") и подставляет её во все строки документа. Это в корне неверно. Для «Товара А» должна быть выбрана его собственная единица «шт», а для «Товара Б» — его собственная, даже если они называются одинаково.
Если вы подставите одну и ту же ссылку на единицу измерения разным товарам, система при проверке уникальности может вести себя непредсказуемо, так как нарушается логическая целостность данных (владелец единицы не совпадает с номенклатурой в строке).
Посмотрим на пример правильной организации загрузки. Прежде чем добавлять строки непосредственно в документ, необходимо «свернуть» данные из Excel в таблицу значений. Это позволит объединить дублирующиеся позиции и избежать конфликта уникальности.
Рекомендуется использовать следующий алгоритм в коде 1С:
// Создаем таблицу для предварительной обработки
ТЗ_Остатки = Новый ТаблицаЗначений;
ТЗ_Остатки.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ТЗ_Остатки.Колонки.Добавить("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"));
ТЗ_Остатки.Колонки.Добавить("ЕдиницаИзмерения", Новый ОписаниеТипов("СправочникСсылка.ЕдиницыИзмерения"));
ТЗ_Остатки.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ТЗ_Остатки.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
// ... Цикл чтения из Excel ...
// Для каждой строки файла ищем товар и его ЕДИНИЦУ ХРАНЕНИЯ
НоваяСтрокаТЗ = ТЗ_Остатки.Добавить();
НоваяСтрокаТЗ.Номенклатура = НайденныйТовар;
// Важно: берем единицу, подчиненную именно этому товару!
НоваяСтрокаТЗ.ЕдиницаИзмерения = НайденныйТовар.ЕдиницаХраненияОстатков;
НоваяСтрокаТЗ.Количество = КоличествоИзФайла;
НоваяСтрокаТЗ.Сумма = СуммаИзФайла;
// ... Конец цикла ...
// Сворачиваем таблицу по ключевым полям
ТЗ_Остатки.Свернуть("Номенклатура, Характеристика, ЕдиницаИзмерения", "Количество, Сумма");
// Теперь переносим чистые данные в документ
Для Каждого СтрТЗ Из ТЗ_Остатки Цикл
НоваяСтрокаДок = ДокументОбъект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрокаДок, СтрТЗ);
КонецЦикла;
Проанализируем ситуацию, когда в новой базе 5.1 еще нет созданных единиц измерения для номенклатуры. При загрузке справочников через КД или Excel необходимо убедиться, что у каждого товара заполнены реквизиты БазоваяЕдиницаИзмерения (из классификатора) и ЕдиницаХраненияОстатков (из подчиненного справочника).
Если вы создаете документы ввода остатков программно и видите ошибку уникальности по единицам, проверьте следующий код поиска единицы:
Функция ПолучитьЕдиницуТовара(ТоварСсылка, ИмяЕдиницы = "шт") Экспорт
Единица = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию(ИмяЕдиницы, Истина, , ТоварСсылка);
Если Единица.Пустая() Тогда
// Если единицы нет, её нужно создать программно
ОбъектЕд = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
ОбъектЕд.Наименование = ИмяЕдиницы;
ОбъектЕд.Владелец = ТоварСсылка;
ОбъектЕд.Коэффициент = 1;
// Ссылка на классификатор ОКЕИ (например, штуки)
ОбъектЕд.ЕдиницаПоКлассификатору = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("796");
ОбъектЕд.Записать();
Единица = ОбъектЕд.Ссылка;
КонецЕсли;
Возвращает Единица;
КонецФункции
В некоторых случаях разработчики пытаются обойти проблему, временно отключая проверки в коде конфигурации или используя настройки «Учетной политики». В Альфа-Авто 5.1 существует возможность настройки контроля отрицательных остатков и уникальности в параметрах системы. Однако мы не рекомендуем этот путь, так как запись неуникальных строк приведет к тому, что документ просто не проведется по регистрам накопления (партии товаров), либо сформирует некорректные движения.
Вместо этого лучше воспользоваться встроенной обработкой «Загрузка данных из табличного документа». В ней предусмотрены механизмы поиска существующих объектов и возможность настройки сопоставления полей. Если вы пишете свой загрузчик, обязательно реализуйте метод Свернуть() для коллекции данных перед заполнением документа.
Даже если в настройках типа номенклатуры указано, что «Учет по характеристикам не ведется», программный код проверки уникальности все равно обращается к этому полю. Если вы загружаете данные из Excel, убедитесь, что:
Неопределено или NULL.Подводя итог: ошибка «значения колонок не уникальны» — это защитный механизм Альфа-Авто, предотвращающий замусоривание регистров. Чтобы её обойти, используйте предварительное агрегирование данных в таблице значений и всегда подставляйте в документ единицы измерения, владельцем которых является загружаемая номенклатура.