Имя: Пароль:
1C
 
Заполнение регистра сведений из таблицы значений
0 Wefast
 
22.09.15
10:10
Есть таблица значений с штрихкодами и кодами номенклатуры.
Мне нужно все это записать в регистры сведений ШтрихкодыНоменклатуры.
В нем одно измерение и это Штрихкод

Таб = ЗначениеИзФайла(ИмяФайла);
    
    Для Каждого Строка из Таб Цикл
        
        Ном = Справочники.Номенклатура.НайтиПоКоду(Строка.Номенклатура);
        Если Ном <> Неопределено И Ном <> Справочники.Номенклатура.ПустаяСсылка() Тогда
            Набор = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
        Набор.Отбор.Штрихкод.Установить(СокрЛП(Строка.Штрихкод));
        Набор.Прочитать();
        Запись = Набор.Добавить();
        Запись.Номенклатура = Ном;
        Запись.Штрихкод = СокрЛП(Строка.Штрихкод);
        Набор.Записать(ИСТИНА);
        КонецЕсли;    
    КонецЦикла;

Ну и в итоге в какой то момент появляется ошибка о существование такой записи и ничего не записывается.
Разве он не заменит при этом новой записью все то что попало в набор после отбора?

В общем теперь у меня огромный реристр.

Как мне туда добавить все что не добавилось? без перезаписывания.

Или может можно как то всю ТЗ сразу загрузить?

Или может нужно использовать МенеджерЗаписи() раз уж я по одной строке за раз записываю?
А вдруг тогда по отбору будет больше 1 записи
1 vicof
 
22.09.15
10:18
Сначала сверни таблицу, потом добавляй записи
2 AlexToo
 
22.09.15
10:20
(0) я бы вынес из цикла Набор.Записать(истина) т.е. записал бы весь набор, а не по одной строке, да и тз лучше сверни, и можно проверку добавить на наличие штрихкода.
3 lxndr
 
22.09.15
10:21
Набор.Прочитать();
Набор.Очистить(); //Добавь
Запись = Набор.Добавить();
4 Wefast
 
22.09.15
10:36
(2) а Очистить() добавлять?
Для чего сворачивать?
5 vicof
 
22.09.15
10:38
(4) Как ты думаешь, почему появляется ошибка?
6 Wefast
 
22.09.15
10:41
(5) Ну видимо в ТЗ есть дубль.
Но при отборе она должна туда попадать и подменяться текущей строкой.

И если вынести Записать() за цикл точно будет работать? Что то как то странно
7 vicof
 
22.09.15
10:42
(6) Теперь перечитываем (1)
Точно.
8 Wefast
 
22.09.15
10:43
(7) Строки в ТЗ уникальны а вот штрихкоды повторяются. В старом регистры было больше одного измерения и такое было возможно. Тут - нет.
9 Wefast
 
22.09.15
10:44
(7) И почему отбор не работает при этом как нужно?
10 Timon1405
 
22.09.15
10:46
я просто оставлю это здесь

РегистрСведенийНаборЗаписей.<Имя регистра сведений> (InformationRegisterRecordSet.<Имя регистра сведений>)
Загрузить (Load)
Синтаксис:

Загрузить(<ТаблицаЗначений>)
Параметры:

<ТаблицаЗначений> (обязательный)

Тип: ТаблицаЗначений.
Таблица значений, по которой производится заполнение набора записей.
Описание:

Загружает набор записей значениями из переданной таблицы значений. При этом все прежние записи набора удаляются. Заполняются значения доступных для записи свойств записей регистра сведений, имена которых совпали c именами колонок таблицы значений.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
11 vicof
 
22.09.15
10:47
(8) Ну и? Алгоритм как преобразовать один регистр в другой за тебя никто придумывать не будет.
12 Зеленый пень
 
22.09.15
10:49
"В нем одно измерение и это Штрихкод" - это плохо, товары с несколькими ШК - обычное дело.
(0) Убери Набор.Прочитать();
13 Wefast
 
22.09.15
10:51
(11) Я спросил что не так с отбором. Он же должен брать из заполняемого регистра все записи с этим штрихкодом. И стирать их при добавление новой записи.
14 Wefast
 
22.09.15
10:51
(10) У меня в ТЗ не ссылка на номенклатуру а ее код, так что не получится
15 vicof
 
22.09.15
10:53
(13) Эмм. У тебя не может быть более одной записи с одним и тем же штрихкодом.
16 Wefast
 
22.09.15
10:56
(15) На первой итерации цикла записалась в регистр строка.
На n-ой итерации попадается строка с таким же штрихкодом. Она отбирается по отбору. Она подменяется строкой из итерации
Так должен работать этот отбор
17 Timon1405
 
22.09.15
10:57
(14) таб в запрос - добавить справочник номенклатура - заполнить колонку, соединив по коду(без языческих найтипокоду) - выгрузить, выкинув код и нуллы, -загрузить в регистр.
18 Defender aka LINN
 
22.09.15
11:29
(16) "Так должен работать этот отбор"
В (0) "Набор.Прочитать();". Не должен.
19 IlyaSR
 
22.09.15
12:20
Сделать запись через ПОПЫТКА, вывести ошибку и проанализировать, явно таких ошибок будет несколько
и Записать(ИСТИНА) избыточные данные... Записать() => Значение по умолчанию: Истина
20 IlyaSR
 
22.09.15
12:30
И для чего найденный штрихкод перезаписывать? или штрихкод как-то цикличен и может присваиваться разным номенклатурам?
21 Wefast
 
22.09.15
15:39
(18) Вот взял какой то пример из обучающего материала
НаборЗаписей = РегистрыСведений.НумерацияДоговоров.СоздатьНаборЗаписей();              
НаборЗаписей.Отбор.Период.Установить(НачалоГода(Дата));
НаборЗаписей.Отбор.Организация.Установить(Организация);
// Отбор может устанавливаться только на равенство
// Для регистров "Подчиненных регистратору", отбор возможен только по регистратору
НаборЗаписей.Прочитать();    // считывает записи в память согласно отбору (проще говоря получаем таблицу значений)

Если НаборЗаписей.Количество() = 0 Тогда
    НовыйНомер = НаборЗаписей.Добавить();
    НовыйНомер.Организация = Организация;
    НовыйНомер.Период = НачалоГода(Дата);
    НовыйНомер.Номер = 2; ном=1;
ИначеЕсли НаборЗаписей.Количество() = 1 Тогда
    НовыйНомер = НаборЗаписей[0];
    ном = НовыйНомер.Номер;
    НовыйНомер.Номер = ном+1;
КонецЕсли;
НаборЗаписей.Записать();    // удаляет все старые записи согласно отбору и добавляет строки из НаборЗаписей

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

(20) В регистре Штрихкод единственное измерение, т.е. дублироваться не может. А выгружаю я с уже дублирующимися элементами.

В общем не найдя ничего конкретного пытаюсь при выгрузке из старой базы удалить все дубли.
22 Зеленый пень
 
22.09.15
16:28
(21) Тебе уже 2 раза написали - убери .Прочитать()
"И написано, что удаляться все записи что попали после отбороа и запишутся только что добавленные" - и те, что были записаны ранее тоже останутся, т.к. ты их "прочитал".
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший