Вход | Регистрация


1С:Предприятие ::

Метки:документы

табличная часть документа 7.7

Я
   maks
18.05.04 - 14:14
Как програмно реализовать возможность заполнения табличной части документа.
Т.е. в табличной части есть реквизит "Номенклатура" Справочник.Номенклатура и есть DBF файл с полем "Номенклатура" необходимо заполнить из dbf файла табличную часть документа.
 
  Рекламное место пустует
   lexa
 
1 - 18.05.04 - 14:37
А откуда у тебя это файл? И что лежит в поле "номенклатура"?
   maks
2 - 18.05.04 - 14:57
файл сделал fineriader ом сканирован документ и сохранен в формате dbf в поле номенклатура содержится название номенклатуры. Смысл всего этого: заполняется шапка документа (поступление МПЗ из упрощеннки 1.3) затем вызывается процедура для заполнения табличной части документа из dbf.
   lexa
 
3 - 18.05.04 - 15:23
   lexa
 
4 - 18.05.04 - 15:30
Но учти что наименование вещь неоднозначная. тем более после распознования часть товара может не найтись и что делать если товар новый. По хорошему надо из дбф в таблицу значений. Потом в эту таблицу добавить товар из номенклатуры если он найден с возможностью выбора товара. Кучу проверок по преобразованию строк в число и т.п. и т.д.
   maks
5 - 18.05.04 - 16:01
распознаванию идет в режиме обучения fineriadera, если товар новый то он записывается в справочник номенклатуры как новый.
   lexa
 
6 - 18.05.04 - 16:21
Честно говоря с дбф не заморачивался в ТиС сделал загрузку из екселла, могу как пример привести.
З.Ы.: Не боишься. что все справочники задвоятся
   Valery
 
7 - 18.05.04 - 16:52
Алгоритм должен быть такой:
Сканируеш ДБФ
Находиш название из ДБФ в справочника Номенклатуры
Если есть, присваиваешь номенклатуре в таблице значение справочника
если нет добавляешь новый элемент в справочник, и присваивешь его талице
   maks
8 - 18.05.04 - 16:54
6 - приводите пример.
просто столкнулся с такой проблемой впервые и показалось что из dbf вроде как легче.
вполне может произойти зодвоение, но можно поставить цикл на проверку время конечно возрастет, в данный момент важно время написания обработки а не время ее работы, когда не будут поджимать сроки то можно и доработать не спеша.
   maks
9 - 18.05.04 - 16:57
7 - сканирую, нахожу, присваиваю результат 0. Вот процедура

Процедура КнопкаСканер()
         Товар ="";
          ЕдИзм =0;
          Колич=0;
          Цена=0;
          СтоимостьБезНДС=0;
          СтавкаНДС=0;
          СуммаНДС=0;
          СтоимостьВсего=0;
          СтранаПроисхож="";
          НомерГТД="";
     

          
          
          
      СпрНом = СоздатьОбъект ("Справочник.Номенклатура");     // Справочник номенклатуры

      Док = СоздатьОбъект ("Документ.ПоступлениеМПЗ");
      Док = ТекущийДокумент();
      Номенклатура = СпрНом.НайтиПоКоду(43);
  
     //СпрНом.НайтиПоНаименованию ("");

     ДБФ=СоздатьОбъект("XBase");
     ИмяФайла="";
     ИмяПути="";
     ФС.ВыбратьФайл(0,ИмяФайла,ИмяПути,,"*.dbf|*.dbf");
     ПутьДБ=ИмяПути+ИмяФайла;
     ДБФ.ОткрытьФайл(ПутьДБ);
     ДБФ.КодоваяСтраница(0);
     Если ДБФ.Открыта()=1 Тогда
         Предупреждение ("База открыта", 2);
         ДБФ.Первая();
         Пока 1=1 Цикл
             Товар             = СокрЛП(ДБФ.Column1);
             ЕдИзм             = СокрЛП(ДБФ.Column2);
             Колич            = СокрЛП(ДБФ.Column3);
             Цена             = СокрЛП(ДБФ.Column4);
             СтоимостьБезНДС = СокрЛП(ДБФ.Column5);
             СтавкаНДС        = СокрЛП(ДБФ.Column6);
             СуммаНДС        = СокрЛП(ДБФ.Column7);
             СтоимостьВсего    = СокрЛП(ДБФ.Column8);
             СтранаПроисхож    = СокрЛП(ДБФ.Column9);
             НомерГТД        = СокрЛП(ДБФ.Column10);
           // Номенклатура    = "";

                     СпрНом.ВыбратьЭлементы(); 
                    
                     Пока СпрНом.ПолучитьЭлемент() = 1 Цикл 
                    
                    //действия с очередным элементом 

               //    Сообщить("Наименование " + СпрНом.Наименование); 

                            Если (Товар = СпрНом.Наименование) Тогда
                                Товар = СпрНом.Наименование;
                            КонецЕсли;
                    КонецЦикла; 
                
                              Если (Товар <> СпрНом.Наименование) Тогда
                             СпрНом.Новый();
                             СпрНом.ПолнНаименование     = Товар;
                             СпрНом.Наименование        = СпрНом.ПолнНаименование;
                             СпрНом.ЕдиницаИзмерения     = ЕдИзм;
                             СпрНом.ТипНоменклатуры        = "Товар";
                             СпрНом.ПлановаяСебестоимость = Цена;
                             СпрНом.Цена                = (Цена + (Цена * 20)/100);
                             СпрНом.Валюта                = "руб";
                             СпрНом.СтавкаНДС             = СтавкаНДС;
                             СпрНом.СтавкаНП            = "0";
                             СпрНом.СтранаПроисхождения = СтранаПроисхож;
                             СпрНом.Записать();
                             КонецЕсли;
             
                              НоваяСтрока();
                             Номенклатура = Товар;
                             //ПодборТовара(Товар);

                         
                              СпрНом.НайтиПоНаименованию(Товар,0);
                              Если СпрНом.Выбран()>0 Тогда
                                  
                             Док.Номенклатура = СпрНом.НайтиПоНаименованию(Товар);
                              Номенклатура = СпрНом.ПолнНаименование;
                              НазначитьТип(Номенклатура,СпрНом);
                              ОткрытьПодбор(СпрНом,Товар);
                              Количество   = Колич;
                             СтавкаНДС = СпрНом.СтавкаНДС;
                             АктивизироватьСтроку();
                             Иначе 
                               Сообщить ("Не нашли" + Товар);
                             КонецЕсли;  
            //Док.НоваяСтрока();

             
           //Пересчет("Номенклатура");        

                 
             Если ДБФ.Следующая()=0 Тогда 
                 Возврат;
             КонецЕсли;
         КонецЦикла;    
     КонецЕсли

 КонецПроцедуры
   lexa
 
10 - 18.05.04 - 17:04
а записать() и вместо перебора используй НаийтиПоНаименованию, тем более это функция
 
  Рекламное место пустует
   Valery
 
11 - 18.05.04 - 17:04
Я так думаю
Надо вместо Номенклатура = Товар;
Номенклатура=СпрНом.ТекущийЭлемент();
или после Записать()
добавить Товар=СпрНОм.ТекущийЭлемент(), а то у тебя при добавлении новой записи в справочник значение Товар не меняется.
   maks
12 - 18.05.04 - 17:13
11 - Номенклатура=СпрНом.ТекущийЭлемент();
СпрНом.ТекущийЭлемент()- нормальное значение спозициолнированного справочника, т.е. текущий элемент = значению из справочника номенклатуры, но присвоения не происходит номенклатура = ""
   Valery
 
13 - 18.05.04 - 17:19
(12) все так ,но у тебя в коде этого нет
Если Номенклатура- имеет тип строка тогда я не прав
Если номенклатура это справочник, то
у тебя в коде ты присваиваешь тип строка
   lexa
 
14 - 18.05.04 - 17:23
Процедура КнопкаСканер() 
Товар =""; 
ЕдИзм =0; 
Колич=0; 
Цена=0; 
СтоимостьБезНДС=0; 
СтавкаНДС=0; 
СуммаНДС=0; 
СтоимостьВсего=0; 
СтранаПроисхож=""; 
НомерГТД=""; 
ДБФ=СоздатьОбъект("XBase"); 
ИмяФайла=""; 
ИмяПути=""; 
ФС.ВыбратьФайл(0,ИмяФайла,ИмяПути,,"*.dbf|*.dbf"); 
ПутьДБ=ИмяПути+ИмяФайла; 
ДБФ.ОткрытьФайл(ПутьДБ); 
ДБФ.КодоваяСтраница(0); 
Если ДБФ.Открыта()=1 Тогда 
   Предупреждение ("База открыта", 2); 
КонецЕсли; 
Если ДБФ.КоличествоЗаписей() = 0 Тогда 
   Возврат(); 
КонецЕсли; 
ДБФ.Первая(); 
Флаг =1; 
Пока Флаг = 1 Цикл 
   Товар = СокрЛП(ДБФ.Column1); 
   ЕдИзм = СокрЛП(ДБФ.Column2); 
   Колич = СокрЛП(ДБФ.Column3); 
   Цена = СокрЛП(ДБФ.Column4); 
   СтоимостьБезНДС = СокрЛП(ДБФ.Column5); 
   СтавкаНДС = СокрЛП(ДБФ.Column6); 
   СуммаНДС = СокрЛП(ДБФ.Column7); 
   СтоимостьВсего = СокрЛП(ДБФ.Column8); 
   СтранаПроисхож = СокрЛП(ДБФ.Column9); 
   НомерГТД = СокрЛП(ДБФ.Column10); 
   Если СпрНом.НайтиПоНаименованию(Товар,0) = 0 Тогда 
       СпрНом.Новый(); 
       СпрНом.ПолнНаименование = Товар; 
       СпрНом.Наименование = СпрНом.ПолнНаименование; 
       СпрНом.ЕдиницаИзмерения = ЕдИзм; 
       СпрНом.ТипНоменклатуры = "Товар"; 
       СпрНом.ПлановаяСебестоимость = Цена; 
       СпрНом.Цена = (Цена + (Цена * 20)/100); 
       СпрНом.Валюта = "руб"; 
       СпрНом.СтавкаНДС = СтавкаНДС; 
       СпрНом.СтавкаНП = "0"; 
       СпрНом.СтранаПроисхождения = СтранаПроисхож; 
       СпрНом.Записать(); 
   КонецЕсли; 
   НоваяСтрока(); 
   Док.Номенклатура = СпрНом.ТекущийЭлемент(); 
   Количество = Колич; 
   СтавкаНДС = СпрНом.СтавкаНДС; 
   Записать(); 
   Если ДБФ.Следующая()=0 Тогда 
       Флаг = 0; 
   КонецЕсли; 
КонецЦикла; 
КонецПроцедуры
   lexa
 
15 - 18.05.04 - 17:26
нет усн под рукой проверь реквизиты документа и справочников - может они ссылаются на другие справочники или перечисления
   maks
16 - 18.05.04 - 17:51
13- в коде нет но я подставил значение из 11 и проверил, а потом написал
   kvm
 
17 - 19.05.04 - 00:12
(14) Количество в документе - это число.
Количество=Число(СокрЛП(Колич));
И раньше Колич=0, тогда присвоение Колич=СокрЛП(ДБФ.Column3) не сработает, надо Колич="";
ЕдИзм, ТпНоменклатуры, СтавкаНДС, Валюта - справочники, присвоение им текстового значения не прокатит.
   maks
18 - 20.05.04 - 08:46
Почему не работает присвоение?
Док.Номенклатура = СпрНом.ТекущийЭлемент().Наименование;
Номенклатура = СпрНом.ТекущийЭлемент().Наименование;

Номенклатура и Док.Номенклатура реквизит табличной части документа
   SnarkHunter
 
20 - 20.05.04 - 08:51
Потому что несоответствие типов... И ТекущийЭлемент() - это лишнее...
   lexa
 
22 - 20.05.04 - 10:44
(18)Док.Номенклатура = СпрНом.ТекущийЭлемент();



Список тем форума
Рекламное место пустует   Рекламное место пустует
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует