|   |   | 
| 
 | Проблема с добавление данных в уже существующий документ | ☑ | ||
|---|---|---|---|---|
| 0
    
        Валидатор 07.11.13✎ 14:43 | 
        Такая задача: конфа 1с 8.2 КА, если есть документ ПТиУ с номером, по которому мы ищем, то данные добавляются в него, если такого документа нет, то создается новый, С созданием нового все хорошо, а вот с добавление в уже существующий проблемы, летит ошибка:
 Значение поля "Номер" не уникально Процедура ОсновныеДействияФормыОсновныеДействияФормыВыполнить(Кнопка) Сообщить("Загрузка данных начата"); КЧ = Новый КвалификаторыЧисла(12,2); КД = Новый КвалификаторыДаты(); КС = Новый КвалификаторыСтроки(30); КС2 = Новый КвалификаторыСтроки(40); Массив = Новый Массив; Массив.Добавить(Тип("Дата")); ОписаниеТиповД = Новый ОписаниеТипов(Массив, , КД); Массив.Очистить(); Массив.Добавить(Тип("Число")); ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ); Массив.Очистить(); Массив.Добавить(Тип("Строка")); ОписаниеТиповС = Новый ОписаниеТипов(Массив, , ,КС); Массив.Очистить(); Массив.Добавить(Тип("Строка")); ОписаниеТиповС2 = Новый ОписаниеТипов(Массив, , ,КС2); Массив.Очистить(); ТаблицаЗначений = Новый ТаблицаЗначений; ТаблицаЗначений.Колонки.Добавить("Артикул",ОписаниеТиповС2 , "Код номенклатуры"); ТаблицаЗначений.Колонки.Добавить("Номенклатура",ОписаниеТиповС2 , "Описание номенклатуры"); ТаблицаЗначений.Колонки.Добавить("ГТД",ОписаниеТиповС2 , "ГТД"); ТаблицаЗначений.Колонки.Добавить("СтранаПроисхождения",ОписаниеТиповС2 , "Страна происхождения"); ТаблицаЗначений.Колонки.Добавить("ДатаНакладной",ОписаниеТиповД , "Дата накладной"); ТаблицаЗначений.Колонки.Добавить("НомерНакладной",ОписаниеТиповЧ , "НомерНакладной"); ТаблицаЗначений.Колонки.Добавить("Импортер",ОписаниеТиповС2 , "Импортер"); ТаблицаЗначений.Колонки.Добавить("Количество",ОписаниеТиповЧ , "Количество"); ТаблицаЗначений.Колонки.Добавить("Цена",ОписаниеТиповЧ , "Цена"); Текст = Новый ЧтениеТекста(ПутьКФайлу, "cp866"); Стр = Текст.ПрочитатьСтроку(); Пока Стр <> Неопределено Цикл МассивСтрок = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Стр,"│"); НоваяТЗ = ТаблицаЗначений.Добавить(); Артикул = МассивСтрок[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) при начале редактирования этого поля формы     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |