Имя: Пароль:
1C
1С v8
Проблема с добавление данных в уже существующий документ
0 Валидатор
 
07.11.13
14:43
Такая задача: конфа 1с 8.2 КА, если есть документ ПТиУ с номером, по которому мы ищем, то данные добавляются в него, если такого документа нет, то создается новый, С созданием нового все хорошо, а вот с добавление в уже существующий проблемы, летит ошибка:
Значение поля "Номер" не уникально



Процедура ОсновныеДействияФормыОсновныеДействияФормыВыполнить(Кнопка)
    
    Сообщить("Загрузка данных начата");
    
    КЧ = Новый КвалификаторыЧисла(12,2);
    КД = Новый КвалификаторыДаты();
    КС = Новый КвалификаторыСтроки(30);
    КС2 = Новый КвалификаторыСтроки(40);
    Массив = Новый Массив;
    Массив.Добавить(Тип("Дата"));
    ОписаниеТиповД = Новый ОписаниеТипов(Массив, , КД);
    Массив.Очистить();
    Массив.Добавить(Тип("Число"));
    ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ);
    Массив.Очистить();
    Массив.Добавить(Тип("Строка"));
    ОписаниеТиповС = Новый ОписаниеТипов(Массив, , ,КС);
    Массив.Очистить();
    Массив.Добавить(Тип("Строка"));
    ОписаниеТиповС2 = Новый ОписаниеТипов(Массив, , ,КС2);
    Массив.Очистить();
    ТаблицаЗначений = Новый ТаблицаЗначений;
    ТаблицаЗначений.Колонки.Добавить("Артикул",ОписаниеТиповС2 , "Код номенклатуры");
    ТаблицаЗначений.Колонки.Добавить("Номенклатура",ОписаниеТиповС2 , "Описание номенклатуры");
    ТаблицаЗначений.Колонки.Добавить("ГТД",ОписаниеТиповС2 , "ГТД");
    ТаблицаЗначений.Колонки.Добавить("СтранаПроисхождения",ОписаниеТиповС2 , "Страна происхождения");
    ТаблицаЗначений.Колонки.Добавить("ДатаНакладной",ОписаниеТиповД , "Дата накладной");
    ТаблицаЗначений.Колонки.Добавить("НомерНакладной",ОписаниеТиповЧ , "НомерНакладной");
    ТаблицаЗначений.Колонки.Добавить("Импортер",ОписаниеТиповС2 , "Импортер");
    ТаблицаЗначений.Колонки.Добавить("Количество",ОписаниеТиповЧ , "Количество");
    ТаблицаЗначений.Колонки.Добавить("Цена",ОписаниеТиповЧ , "Цена");
    
    Текст = Новый ЧтениеТекста(ПутьКФайлу, "cp866");
    Стр = Текст.ПрочитатьСтроку();
    Пока Стр <> Неопределено Цикл
        МассивСтрок = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Стр,"&#9474;");
        НоваяТЗ = ТаблицаЗначений.Добавить();
        Артикул = МассивСтрок[0];
        НоваяТЗ.Артикул = СокрЛП(Артикул);
        Номенклатура = МассивСтрок[1];
        НоваяТЗ.Номенклатура = СокрЛП(Номенклатура);
        ГТД = МассивСтрок[2];
        НоваяТЗ.ГТД = СокрЛП(ГТД);
        СтранаПроисхождения = МассивСтрок[3];
        НоваяТЗ.СтранаПроисхождения = СокрЛП(СтранаПроисхождения);
        ДатаНакладной = МассивСтрок[6];  
        ДатаНакладной = ПолучитьДатуИзСтроки(ДатаНакладной);
        НоваяТЗ.ДатаНакладной = ДатаНакладной;
        НомерНакладной = МассивСтрок[7];
        НоваяТЗ.НомерНакладной = Число(НомерНакладной);
        Импортер = МассивСтрок[8];
        НоваяТЗ.Импортер = СокрЛП(Импортер);
        Количество = МассивСтрок[9];
        НоваяТЗ.Количество = СокрЛП(Количество);
        Цена = МассивСтрок[10];
        НоваяТЗ.Цена = СокрЛП(Цена);
        Стр = Текст.ПрочитатьСтроку();
        Если ТипЗнч(Стр) = Неопределено Тогда
            Продолжить;    
        КонецЕсли;
    КонецЦикла;
    
    СтарыйНомерДокумента = "";
    Документ = "";
    
    МассивДокументов = Новый Массив;
    
    Для каждого Строчка из ТаблицаЗначений Цикл
        
        Если строчка.НомерНакладной = СтарыйНомерДокумента Тогда
            
            НоменклатураПоискПоРеквизиту = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Строчка.Артикул);
            
            Если НоменклатураПоискПоРеквизиту = Справочники.Номенклатура.ПустаяСсылка() Тогда
                НоменклатураПоискПоРеквизиту = СоздатьНоменклатуру(Строчка.Артикул, Строчка.Номенклатура, ГруппаТоваровНов,Строчка.ГТД, Строчка.Импортер, Строчка.СтранаПроисхождения);
                НоменклатураПоискПоРеквизиту = НоменклатураПоискПоРеквизиту.Ссылка;    
            КонецЕсли;
            НоваяСтрокаНайденДокумент = Документ.Товары.Добавить();
            НоваяСтрокаНайденДокумент.ЕдиницаИзмерения = НоменклатураПоискПоРеквизиту.ЕдиницаХраненияОстатков;
            НоваяСтрокаНайденДокумент.Номенклатура = НоменклатураПоискПоРеквизиту;
            НоваяСтрокаНайденДокумент.Количество = Строчка.Количество;
            НоваяСтрокаНайденДокумент.Коэффициент = 1;
            НоваяСтрокаНайденДокумент.Цена = Строчка.Цена;
            НоваяСтрокаНайденДокумент.Сумма = Строчка.Количество * Строчка.Цена;
            Попытка
                Документ.Записать();
            Исключение
                Сообщить(ОписаниеОшибки());
            КонецПопытки;
        Иначе
            Документ = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
            Документ.ОтражатьВБухгалтерскомУчете = Истина;
            Документ.ОтражатьВНалоговомУчете = Истина;
            Документ.ОтражатьВУправленческомУчете = Истина;
            Документ.Комментарий = Комментарий;
            СтарыйНомерДокумента = строчка.НомерНакладной;
            Документ.Номер = СтарыйНомерДокумента;
            Документ.Дата = Строчка.ДатаНакладной;
            Документ.Контрагент = Контрагент;
            Документ.СкладОрдер = Склад;
            Документ.Организация = Организация;
            СтруктураРеквизитовДокумента = Ценообразование.ПолучитьСтруктуруРеквизитовДокументаДляЦенообразования(Документ);
            Документ.ДоговорКонтрагента = ВыбДоговор;
            Документ.ТипЦен = ВыбДоговор.ТипЦен.Наименование;
            Документ.ВалютаДокумента = ВыбДоговор.ВалютаВзаиморасчетов;
            Документ.ВидОперации = Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ПокупкаКомиссия;
            Документ.ВидПоступления = Перечисления.ВидыПоступленияТоваров.НаСклад;
            
            НоменклатураПоискПоНаименованию = Справочники.Номенклатура.НайтиПоНаименованию(Строчка.Номенклатура);
            
            Если НоменклатураПоискПоРеквизиту = Справочники.Номенклатура.ПустаяСсылка() Тогда
                НоменклатураПоискПоРеквизиту = СоздатьНоменклатуру(Строчка.Артикул, Строчка.Номенклатура, ГруппаТоваровНов,Строчка.ГТД, Строчка.Импортер, Строчка.СтранаПроисхождения);
                НоменклатураПоискПоРеквизиту = НоменклатураПоискПоРеквизиту.Ссылка;    
            КонецЕсли;
            НоваяСтрока = Документ.Товары.Добавить();
            НоваяСтрока.ЕдиницаИзмерения = НоменклатураПоискПоРеквизиту.ЕдиницаХраненияОстатков;
            НоваяСтрока.Номенклатура = НоменклатураПоискПоРеквизиту;
            НоваяСтрока.Количество = Строчка.Количество;
            НоваяСтрока.Коэффициент = 1;
            НоваяСтрока.Цена = Строчка.Цена;
            НоваяСтрока.Сумма = Строчка.Цена * Строчка.Количество;
            
            Сообщить("Документ " + Документ + " был создан");
        КонецЕсли;
        
        Для каждого стр ИЗ Документ.Товары  Цикл
            ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(стр, Документ);
            ЭтоКомиссия = (выбДоговор.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СКомиссионером);
            МетаданныеДока = Документ.Метаданные();
        КонецЦикла;
        
        Попытка
            Документ.Записать();
        Исключение
            Сообщить(ОписаниеОшибки());
        КонецПопытки;
        
    КонецЦикла;    
    
    Сообщить("Данные были загружены");
    
КонецПроцедуры
1 Холодильник
 
07.11.13
14:46
плохой негодный код
2 Валидатор
 
07.11.13
14:49
есть варианты почему ошибка летит? по коду не должно же
3 Валидатор
 
07.11.13
14:49
(1) такими ответами иди на инфостарт набивай себе бонусы
4 Sabbath
 
07.11.13
14:50
(0) по идее, надо посмотреть в отладчике, какой там номер у документа, почему он такой и почему не уникальный
5 Поросенок Петр
 
07.11.13
14:50
(1) +100500
Код херовый.
6 Валидатор
 
07.11.13
14:51
(5) чем именно?
7 Господин ПЖ
 
07.11.13
14:52
идиотизм какой-то... сначала приводить тип колонки к строке = 40, потом совать в нее сокрлп()
8 Sabbath
 
07.11.13
14:53
(5) проблема все равно не из-за херового кода имхо))
9 Валидатор
 
07.11.13
14:53
(8) хоть один нормальынй попался)
10 Sabbath
 
07.11.13
14:54
Мне понравилась переменная Строчка, это мило :)
11 Валидатор
 
07.11.13
14:54
короче если по существу, может кто что сказать, а не сидеть тут тролить, можете собраться в кружок и потом потролить
12 Холодильник
 
07.11.13
14:55
(6) ты ищещь номер дока в каком-то массиве, если не находишь - создаешь новый. но искать-то нужно среди реальных документов, или массив заполнять правильно.
тогда и ошибки с неуникальностью номеров не будет
13 Валидатор
 
07.11.13
14:56
(12) что значит среди реальных документов? Поиск и так идет по существующим докам
14 Apokalipsec
 
07.11.13
14:56
(9) нормальные это (1) (5) и (7), а ты научись адекватно воспринимать критику.
Документ - это что у тебя? не вижу где ты получаешь какой-то документ в эту переменную чтобы что-то туда добавлять.
15 Поросенок Петр
 
07.11.13
14:57
(6)

- Одна процедура делаёт все, смешивая в себе разные уровни абстракции.
- Тело цикла порвано контекстом документа, т.е. его невозможно просто вынести в отдельную процедуру. Т.е. код ориентирован не на процедурность, а на строчки.

(8) Из-за него. Если бы всё было разложено по полкам  (т.е. процедурам), ошибка была бы очевидна, или ,скорее всего, не появилось бы.
16 Sabbath
 
07.11.13
14:59
(15) А, так он там присваивает какой-то номер, не увидел, тогда да, проблема в коде.
17 Sabbath
 
07.11.13
15:00
+(16) но все равно надо как в (4), т.е. прогнать в отладчике и увидеть
18 Валидатор
 
07.11.13
15:00
Объясните тогда, как сделать поиск документа, и если документ с таким номером уже существует, то в него пишем данные,если нет то создаем новый?
19 Холодильник
 
07.11.13
15:01
не. код ужасен, даже разбираться с ним лень
20 Холодильник
 
07.11.13
15:01
(18) запросом, епт. либо найтиПоНомеру()
21 Sabbath
 
07.11.13
15:03
(18) ты новому документу даешь какой-то номер, который уже есть, зачем?
22 Валидатор
 
07.11.13
15:08
(21) там где создание документа он только в начале попадает, потом в первой части цикла обходит все и ошибки выкладывает
23 Sabbath
 
07.11.13
15:13
(22) Так ты в отладчике посмотри, что там у тебя с номером творится и почему такой есть уже. Честно говоря, тяжеловато вкуривать в этот код))
24 Валидатор
 
07.11.13
15:17
(23) Да блин, еще раз
1. создали документ с номером 172, заполнили 2 строчки
2. запустили обработку, выбрали файл, которыми заполнять наш документ
3. в файле, из которого грузим данные есть документ с номером 172
4. ищем есть ли у нас среди ПТиУ документ с номером 172, если да, то просто добавляем в него данные, если документа с номером 172 нет, то создаем его, и добавляем в него данные
25 Sabbath
 
07.11.13
15:26
(24) ну так ошибки тебе говорит, что такой номер уже есть в базе, в этом и косяк.
26 Валидатор
 
07.11.13
15:59
(25)там просто получается что когда я гружу номер из файла он такого вида: "172", а в номер документа пишется "172    " сокрЛП не помогает в данном случае(9
27 Валидатор
 
07.11.13
16:09
тупо не ищется по номеру документа, блин, че за херня
28 Валидатор
 
08.11.13
14:43
Решил запрос делать и в нее свою ТЗ засовывать, чтобы потом группировками обходить, но летит ошибка: {Форма.Форма.Форма(127)}: Ошибка при вызове метода контекста (Выполнить)
     Результат = Запрос.Выполнить();
по причине:
{(31, 33)}: Неоднозначное поле "Номенклатура.Артикул"
ПО втДанныеЗагрузки.Артикул = <<?>>Номенклатура.Артикул

почему?

вот запрос:
Запрос = Новый Запрос;
     Запрос.Текст =  "ВЫБРАТЬ
     |    ЗагрузкаДанных.Артикул,
     |    ЗагрузкаДанных.Номенклатура,
     |    ЗагрузкаДанных.ГТД,
     |    ЗагрузкаДанных.СтранаПроисхождения,
     |    ЗагрузкаДанных.ДатаНакладной,
     |    ЗагрузкаДанных.НомерНакладной,
     |    ЗагрузкаДанных.Импортер,
     |    ЗагрузкаДанных.Количество,
     |    ЗагрузкаДанных.Цена
      |ПОМЕСТИТЬ втЗагрузкаДанных
      |ИЗ
      |    &ЗагрузкаДанных КАК ЗагрузкаДанных
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      |    Номенклатура.Ссылка,
      |    втЗагрузкаДанных.Артикул,
      |    втЗагрузкаДанных.Номенклатура,
      |    втЗагрузкаДанных.ГТД,
      |    втЗагрузкаДанных.СтранаПроисхождения,
      |    втЗагрузкаДанных.ДатаНакладной,
      |    втЗагрузкаДанных.НомерНакладной,
      |    втЗагрузкаДанных.Импортер,
      |    втЗагрузкаДанных.Количество,
      |    втЗагрузкаДанных.Цена
      |ИЗ
      |    втЗагрузкаДанных КАК втЗагрузкаДанных
      |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
      |        ПО втЗагрузкаДанных.Артикул = Номенклатура.Артикул";
      
     Запрос.УстановитьПараметр("ЗагрузкаДанных", ТаблицаЗначений);
     Результат = Запрос.Выполнить();
29 hhhh
 
08.11.13
14:53
(27) там еще дату надо указывать при поиске, Семен Сененыч.
30 Enders
 
08.11.13
15:12
(28)У тебя одинаковое название реквизита: "втЗагрузкаДанных.Номенклатура" и
Справочника:"Справочник.Номенклатура КАК Номенклатура"
Оно и ругается
31 Валидатор
 
08.11.13
15:15
(29) потому что когда идет поиск документа по номеру - искомое значение "172", а в номере документа "172    ", и никаки не обрезаются эти пробелы
32 catena
 
08.11.13
15:26
(31)Врешь, это не играет рояля
33 Валидатор
 
08.11.13
15:28
(32) да что врешь, вот пример кода:
Для каждого Строка из ТаблицаЗначений Цикл
        
НомерНакладной = Строка.НомерНакладной;
Документ = Документы.ПоступлениеТоваровУслуг.НайтиПономеру(НомерНакладной);
в НомерНакладной попадает 172, а в следующей строке поиска ничего не находится, хотя документ существует в базе
34 catena
 
08.11.13
15:28
(33)Тебе же сказали: у НайтиПоНомеру ДВА параметра: Номер и ДАТА.
35 Валидатор
 
08.11.13
15:28
Документ = Документы.ПоступлениеТоваровУслуг.НайтиПономеру(НомерНакладной, строка.ДатаНакладной); вот так точнее
36 catena
 
08.11.13
15:30
(35)строка.ДатаНакладной - тип какой?
37 Валидатор
 
08.11.13
15:30
дата
38 Валидатор
 
08.11.13
15:31
так вроде документ нашелся, но теперь летит ошибка, что документ недоступен для изменения, почему? оО Документ.ПолучитьОбъект я сделал
39 catena
 
08.11.13
15:31
(37)А НомерНакладной?
40 catena
 
08.11.13
15:32
(38)Пока ты выдаешь информацию частями и по наводящим вопросам, сказать что-то очень сложно. Где-то там ошибка, поэтому.
41 ЧессМастер
 
08.11.13
15:35
(35) вот так точнее

Документ = Документы.ПоступлениеТоваровУслуг.НайтиПономеру(НомерНакладной, ДатаНакладной).ПолучитьОбъент()
42 ЧессМастер
 
08.11.13
15:36
+(41) и дальше с этим Документ делай что хочешь - добавляй строки записывай и проводи
43 Валидатор
 
08.11.13
15:41
(41) да уже понял, сделал это, нашел там в чем проблема была, теперь другой вопрос: у меян на форме есть поле - контрагент, в него понятно откуда и что берется, при открытии этого поля предлагается из справочника одноименного выбрать контрагента, как прописать жеский отбор чтобы брались контрагенты только из папка "Поставщики", и отбор нельзя было снять?
44 ЧессМастер
 
08.11.13
16:00
(43) при начале редактирования этого поля формы
Основная теорема систематики: Новые системы плодят новые проблемы.