|
Проблема с добавление данных в уже существующий документ | ☑ | ||
---|---|---|---|---|
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) при начале редактирования этого поля формы
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |