Имя: Пароль:
1C
 
Помогите заполнить субконто.
0 bizon2008
 
04.09.07
12:25
Заполняю программно из текстового файла документ «Банковская выписка», в табличной части есть реквизиты «Субконто1»,  «Субконто2» и «Субконто3» тип значения <<неопределенный>>. В текстовом файле есть конкретное текст, что надо присвоит этому субконто.  Т.е. для примера если по счету «631»,  субконто1 «контрагент», то в файле конкретно записан «Вася пупкин».  Используются только несколько счетов, у всех одинаковый набор субконто. Подскажите как можно реализовать такую загрузку? Заранее спасибо.
1 Рэйв
 
04.09.07
12:29
1.Назначаешь тип реквизиту в соответсвии с типом субконто.
2.Ищешь значение по наименованию "Вася Пупкин"
3.Присваиваешь
2 Andy13
 
04.09.07
12:33
Выдержка из дока "Выписка"
НазначитьТип("Субконто1", УсловныйКоррСчет.ВидСубконто(1));
3 перцептрон
 
04.09.07
12:34
текс = "Субконто1";
ВидСубконто = Счет.ВидСубконто(Число(Прав(текс, 1)));
НазначитьТип(текс, ВидСубконто);
Спр = СоздатьОбъект(ВидСубконто.ТипСубконто());
Спр.НайтиПоНаименованию("Вася Пупкин", ...);
Док.УстановитьАтрибут(текс, Спр.ТекущийЭлемент());
4 bizon2008
 
04.09.07
13:09
(3)Спасибо. Не пойму в чем смысл.
ВидСубконто = Счет.ВидСубконто(Число(Прав(текс, 1)));
Можете подробней?
5 Подводный Таракан
 
04.09.07
13:14
(4) эта строка определяет вид тек. субконто...
извращенно как то сделано)))
6 bizon2008
 
04.09.07
15:09
(1)
Можно для особо одареных. Расшифровать.
1.Назначаешь тип реквизиту в соответсвии с типом субконто.
Спасибо.
7 bizon2008
 
04.09.07
15:30
Пропадаю. HELP!
8 Motya
 
04.09.07
15:35
(6) Док.НазначитьТип(<ИмяРеквизита>,<ТипСубконто>,<Длина>,<Точность>)
9 Рэйв
 
04.09.07
15:42
(6)Смотри (3) ...что-то вроде
10 bizon2008
 
04.09.07
15:43
Делаю так.
НазначитьТип("Субконто1", Счет.Субконто(1));
Выдает ошибку
НазначитьТип<<?>>("Субконто1", Счет.Субконто(1));
{D:\work\Импорт_банк.ert(114)}: Процедура не обнаружена (НазначитьТип)
11 Motya
 
04.09.07
15:47
(10) Если ты не в модуле формы документа, а в модуле обработки, то
Док.НазначитьТип("Рекв", ТипРекв)
Счет - это что?
12 Подводный Таракан
 
04.09.07
15:48
(10)

Док.НазначитьТип("Субконто1", Счет.ВидСубконто(1));
13 Motya
 
04.09.07
15:53
(12) Счет.ВидСубконто(1) вернёт "Склады", для типа "Справочник.Склады" =>
Док.НазначитьТип("Субконто1", "Справочник."+Счет.ВидСубконто(1))
14 Motya
 
04.09.07
15:54
(12)Но не факт, что ВидСубконто - типа справочник, это может быть перечисление или документ
15 puls
 
04.09.07
15:55
(13) а если тама перечисление?
Док.НазначитьТип("Субконто1", Док.Счет.ВидСубконто(1));
16 bizon2008
 
04.09.07
15:56
Спасибо. С НазначитьТип() вроде понял.
Сделал так:
Док.НазначитьТип("Субконто1", Док.Счет.Субконто(1));

Как найти по наименованию субконто?
17 puls
 
04.09.07
15:58
(16) не очень понятен вопрос
18 перцептрон
 
04.09.07
16:12
(3, 4) можно сделать текс = ТекущаяКолонка()
19 перцептрон
 
04.09.07
16:15
(16) твой код - банален.
Док.Счет.Субконто("наименование_субконто") ??
20 Motya
 
04.09.07
16:19
(19) У объекта Счет нет метода Субконто
21 перцептрон
 
04.09.07
16:29
(20) зато есть ВидСубконто(). То вообще не мои проблемы чего там нет
22 bizon2008
 
04.09.07
17:50
Реализую пример приведенный в (3);

Док.НазначитьТип("Субконто1", Док.Счет.ВидСубконто(1));
СпрСуб1 = СоздатьОбъект(ВидСубконто.ТипСубконто());
СпрСуб.НайтиПоНаименованию(Список.ПолучитьЗначение(Номер+3),0);
Док.Субконто1 = Спр.ТекущийЭлемент();
При проверке.
СпрСуб1 = СоздатьОбъект(ВидСубконто<<?>>.ТипСубконто());
{D:\work\Импорт_банк.ert(115)}: Переменная не определена (ВидСубконто)
СпрСуб<<?>>.НайтиПоНаименованию(Список.ПолучитьЗначение(Номер+3),0);
{D:\work\Импорт_банк.ert(116)}: Переменная не определена (СпрСуб)
При проверке модуля обнаружены синтаксические ошибки!
23 bizon2008
 
04.09.07
17:58
Как правельно задать Создать оъект в приведеном коде.

Док.НазначитьТип("Субконто1", Док.Счет.ВидСубконто(1));
СпрСуб1 = СоздатьОбъект(Док.Счет.ВидСубконто());
СпрСуб1.НайтиПоНаименованию(Список.ПолучитьЗначение(Номер+3),0);
Док.Субконто1 = Спр.ТекущийЭлемент();
24 перцептрон
 
04.09.07
18:01
(23) щас отвечу... 5 сек
25 child
 
04.09.07
18:04
(23)
СпрСуб1 = СоздатьОбъект(СокрЛП(Док.Счет.ВидСубконто().ТипСубконто()))
26 перцептрон
 
04.09.07
18:06
(22) это не мой пример? что ты с ним сделал!?
где строка ВидСубконто = Счет.ВидСубконто(Число(Прав(текс, 1)));
27 перцептрон
 
04.09.07
18:09
(23) не
СпрСуб1 = СоздатьОбъект(Док.Счет.ВидСубконто());
а
СпрСуб1 = СоздатьОбъект(Док.Счет.ВидСубконто(1).типСубконто());
28 Креатив
 
04.09.07
18:28
(0) А так уже не прокатывает?
Для ш = 1 По счет.КоличествоСубконто() Цикл
  Док.НазначитьТип("Субконто" + ш, Счет.ВидСубконто(ш));
КонецЦикла
счет определяется в обработке.
29 bizon2008
 
04.09.07
18:41
Большое спасибо. Но в документе реквизит остается пустой. Мой код.

Док.НазначитьТип("Субконто1", Док.Счет.ВидСубконто(1));
СпрСуб1 = СоздатьОбъект(Док.Счет.ВидСубконто(1).типСубконто());
СпрСуб1.НайтиПоНаименованию(Список.ПолучитьЗначение(Номер+3),0);
Док.Субконто1 = Спр.ТекущийЭлемент();

Обработка выполняется ошибок нет.
30 bizon2008
 
04.09.07
18:42
Реквизит Счет заполняется раньше.
Док.Счет = СчетПоКоду(Список.ПолучитьЗначение(Номер+1));
31 Креатив
 
04.09.07
18:47
(29) дык в реквизиты после назначения типа нужно значения положить
док.Субконто1 = значение1;
32 bizon2008
 
04.09.07
18:49
Так ложу
Док.Субконто1 = Спр.ТекущийЭлемент();
33 Креатив
 
04.09.07
18:53
(32) Кстати, если у тебя есть одинаковые контрагенты в разных группах, можешь не того найти.
Кстати, а сам-то текстовый документ из клиент-банка?
34 bizon2008
 
04.09.07
18:54
Одинаковых контрагентоа нет. Документ мой.
35 DrShad
 
04.09.07
18:55
(34) а Спр это какой справочник и какой там ТекущийЭлемент()?
36 FlashC
 
04.09.07
18:59
Делай так

Если СпрСуб1.НайтиПоНаименованию(Список.ПолучитьЗначение(Номер+3),0) = 1 Тогда
Док.Субконто1 = Спр.ТекущийЭлемент();
КонецЕсли;
37 DrShad
 
04.09.07
19:02
(34) ответ на (35) в студию
(36) а ты сам то понял че написал?
38 FlashC
 
04.09.07
19:04
Если СпрСуб1.НайтиПоНаименованию(Список.ПолучитьЗначение(Номер+3),0) = 1 Тогда
Док.Субконто1 = СпрСуб1.ТекущийЭлемент();
КонецЕсли;
39 FlashC
 
04.09.07
19:06
(37) нет:)
40 DrShad
 
04.09.07
19:07
где афтар?
41 FlashC
 
04.09.07
19:10
ушел домой или по делам
42 bizon2008
 
04.09.07
19:11
(35) Взято из выше приведеных примеров.
43 FlashC
 
04.09.07
19:14
(42) выкладывай ка весь код, что напиал.
44 Креатив
 
04.09.07
19:15
(34) То есть ты сначала ручками набиваешь текстовый документ, а потом грузишь его в 1С? Я сейчас заплАчу. :-/
45 DrShad
 
04.09.07
19:17
(42) читай тогда ЖКК
46 bizon2008
 
04.09.07
19:19
(44) Нет я выгружаю из другой программы.

Код.
Док.НазначитьТип("Субконто1", Док.Счет.ВидСубконто(1));
   СпрСуб1 = СоздатьОбъект(Док.Счет.ВидСубконто(1).типСубконто());
   
Если СпрСуб1.НайтиПоНаименованию(Список.ПолучитьЗначение(Номер+3),0,0)=1 Тогда
     Док.Субконто1 = Спр.ТекущийЭлемент();
Иначе          
 Сообщить("Субконто1 "+Список.ПолучитьЗначение(Номер+3));
КонецЕсли;
47 DrShad
 
04.09.07
19:21
(46) ты дятел
48 bizon2008
 
04.09.07
19:22
(45) какой раздел
49 DrShad
 
04.09.07
19:22
(48) начни с введения
полезно будет
50 Креатив
 
04.09.07
19:24
(46) Так что в результате получается?
51 FlashC
 
04.09.07
19:26
выложи весь код, а не обрезок
52 bizon2008
 
04.09.07
19:28
DrShad надеюсь это не все что Вы знаете.
(46)Обработка работает, выдает собщения с названиями контрагентов, но в локумент они не попадают.
53 FlashC
 
04.09.07
19:29
И что есть: Спр.ТекущийЭлемент()? в отладчике глянь
54 bizon2008
 
04.09.07
19:30
(51) весь большой, с какого момента интерисует?
55 DrShad
 
04.09.07
19:31
(52) обработка тебе выдает значения списка, а не названия контрагентов
а знаю я очень много
56 DrShad
 
04.09.07
19:31
(54) начни с того где Спр = СоздатьОбъект(....)
57 Креатив
 
04.09.07
19:32
(46)попробуй
СпрСуб1.НайтиПоНаименованию(СокрЛП(Список.ПолучитьЗначение(Номер+3)),0,0)
58 DrShad
 
04.09.07
19:33
Сообщить("Субконто1 "+Список.ПолучитьЗначение(Номер+3));

млин это что сообщение наименования справочника?
59 Креатив
 
04.09.07
19:33
И всё-таки если есть возможность синхронизации по коду, очень бы рекомендовал именно её.
60 bizon2008
 
04.09.07
19:35
У меня не выполняется условие.
Если СпрСуб1.НайтиПоНаименованию(Список.ПолучитьЗначение(Номер+3),0,0)=1 Тогда
61 DrShad
 
04.09.07
19:35
(60) в списке что хранится?
62 DrShad
 
04.09.07
19:36
(60) что выдает в отладчике?
Список.ПолучитьЗначение(Номер+3)
63 bizon2008
 
04.09.07
19:36
(58)Торможу. Сейчас поменяю и посмотрю.
64 DrShad
 
04.09.07
19:38
(63) короче
я пошел домой
некогда мне ждать пока у тебя тормоза пройдут
65 bizon2008
 
04.09.07
19:38
В списке хранятся строка, счет, название котрагента, т.д.
66 FlashC
 
04.09.07
19:39
ВЫЛОЖИ ВЕСЬ КОД! А то, так до тяпницы будешь делать!
67 bizon2008
 
04.09.07
19:40
(60) что выдает в отладчике?
Список.ПолучитьЗначение(Номер+3)

Название контрагента из текстового файла.
68 bizon2008
 
04.09.07
19:41
Весь код

//*******************************************
Процедура Выполнить()
Перем к;
Перем м;
Док = СоздатьОбъект("Документ.БанковскаяВыписка");
ДокДог = СоздатьОбъект("Документ.Договор");
Текст = СоздатьОбъект("Текст");
Список = СоздатьОбъект("СписокЗначений");
Спр = СоздатьОбъект("Справочник.Контрагенты");
СпрТМЦ=СоздатьОбъект("Справочник.ТМЦ");
СпрЕд=СоздатьОбъект("Справочник.Единицы");
СпрМестаХранения=СоздатьОбъект("Справочник.МестаХранения");
СпрФирмы=СоздатьОбъект("Справочник.Фирмы");
СпрВал=СоздатьОбъект("Справочник.ВалДоходыРасходы");
СпрПодр=СоздатьОбъект("Справочник.Подразделения");

//Суб1 = "Субконто1";
//ВидСубконто = Счет.ВидСубконто(Число(Прав(Суб1, 1)));
//НазначитьТип(Суб1, ВидСубконто);
//СпрСуб1 = СоздатьОбъект(ВидСубконто.ТипСубконто());
//Спр.НайтиПоНаименованию("Вася Пупкин", ...);
//Док.УстановитьАтрибут(Суб1, Спр.ТекущийЭлемент());

СпрРСчет=СоздатьОбъект("Справочник.НашиДенежныеСчета");
СпрВалюта=СоздатьОбъект("Справочник.Валюты");
СпрШкалаСтавок=СоздатьОбъект("Справочник.ШкалаСтавок");



Таб = СоздатьОбъект("Таблица");
Текст.Открыть("c:\exp_imp_bk.txt");

м=0;        
Таб.ВывестиСекцию("Шапка");
//Проход по строкам файла переноса
Для Ном=1 По Текст.КоличествоСтрок() Цикл
 Стр = Текст.ПолучитьСтроку(Ном);
 Список.ИзСтрокиСРазделителями(Стр); //преобразуем строку в список значений
 
 //Проверка на наличие документа
 Если Док.НайтиПоНомеру(Список.ПолучитьЗначение(5), Список.ПолучитьЗначение(1))=1 Тогда
     Сообщить("Докумен существует"+Список.ПолучитьЗначение(5));
   Перейти ~M;
   м=1;
 КонецЕсли;
     
 //Создаем новый
 Док.Новый();
 
 //Заролняем шапку документа
 
 //Дата документа
 Док.ДатаДок = Список.ПолучитьЗначение(1);
 //Время документа
 Док.УстановитьВремя(Список.ПолучитьЗначение(2), Список.ПолучитьЗначение(3), Список.ПолучитьЗначение(4));
 //Номер документа
 Док.НомерДок =Список.ПолучитьЗначение(5);
 //Контрагент документа
 
   
 //Заполняем Расчетный счет
 Если СпрРСчет.НайтиПоНаименованию(Список.ПолучитьЗначение(6),0,1)=1 Тогда
   Док.РСчет = СпрРСчет.ТекущийЭлемент();
 Иначе
   м=1;
     Сообщить("Расчетный счет не найден"+Список.ПолучитьЗначение(6));
     Перейти ~M;
 КонецЕсли;
 
 //Заполнение СчетУчета
 Док.СчетУчета = СчетПоКоду(Список.ПолучитьЗначение(7));
 
 //Заполняем валюта
 Если СпрВалюта.НайтиПоНаименованию(Список.ПолучитьЗначение(8),0,1)=1 Тогда
   Док.Валюта = Спр.ТекущийЭлемент();
 Иначе
   м=1;
     Сообщить("Валюта не найдена"+Список.ПолучитьЗначение(8));
     Перейти ~M;
 КонецЕсли;
 
 //Заполнение табличной части*************************************
 к=1;
 Для Номер = 9 По Список.РазмерСписка() Цикл
   Док.НоваяСтрока();
   
   //Заполнение Вид Движения
   Если Список.ПолучитьЗначение(Номер)="Поступление" Тогда
     Док.ВидДвижения = Перечисление.ВидыДвиженийПоРасчетномуСчету.Поступление;    
   ИначеЕсли Список.ПолучитьЗначение(Номер)="Выплата" Тогда
     Док.ВидДвижения = Перечисление.ВидыДвиженийПоРасчетномуСчету.Списание;
   Иначе
     м=1;
     Сообщить("Вид движения не найден"+Список.ПолучитьЗначение(Номер));
       Таб.ВывестиСекцию("Стр_1");
     Перейти ~M;    
   КонецЕсли;    
   
   //Заполнение Счет
   
   Док.Счет = СчетПоКоду(Список.ПолучитьЗначение(Номер+1));
   
   
   //Заполнение ВидНДС
   Если СпрШкалаСтавок.НайтиПоНаименованию(Список.ПолучитьЗначение(Номер+2),0)=1 Тогда
     Док.ВидНДС = СпрШкалаСтавок.ТекущийЭлемент();
   Иначе          
     м=1;
     Сообщить("ВидНДС не найден "+Список.ПолучитьЗначение(Номер+2));
       Таб.ВывестиСекцию("Стр_1");
     Перейти ~M;
     КонецЕсли;
     
   //Заполнение субконто1 Номер+3
   
   Док.НазначитьТип("Субконто1", Док.Счет.ВидСубконто(1));
   СпрСуб1 = СоздатьОбъект(Док.Счет.ВидСубконто(1).типСубконто());
   
   Если СпрСуб1.НайтиПоНаименованию(Список.ПолучитьЗначение(Номер+3),0,0)=1 Тогда
     Док.Субконто1 = Спр.ТекущийЭлемент();
   Иначе          
     м=1;
     Сообщить("Субконто1 "+Список.ПолучитьЗначение(Номер+3));
       Таб.ВывестиСекцию("Стр_1");
     Перейти ~M;
     КонецЕсли;
   
   //Заполнение субконто2 Номер+4
   
   //Док.НазначитьТип("Субконто2", Док.Счет.ВидСубконто(2));
   //СпрСуб2 = СоздатьОбъект(Док.Счет.ВидСубконто(2).типСубконто());
   
   //Если СпрСуб2.НайтиПоНаименованию(Список.ПолучитьЗначение(Номер+4),0,0)=1 Тогда
   //  Док.Субконто1 = Спр.ТекущийЭлемент();
   //Иначе          
   //  м=1;
   //  Сообщить("Субконто2 "+Список.ПолучитьЗначение(Номер+4));
     //  Таб.ВывестиСекцию("Стр_1");
   //  Перейти ~M;
     //КонецЕсли;    
   
   
   
           
   Док.СуммаСНДС = Список.ПолучитьЗначение(Номер+5);
   Док.НДС=Список.ПолучитьЗначение(Номер+6);
   
   //Заполнение Вид оплат
   Если Список.ПолучитьЗначение(Номер+7)="Оплата" Тогда
     Док.ВидОплаты = Перечисление.ВидыОплаты.Оплата;    
   ИначеЕсли Список.ПолучитьЗначение(Номер+7)="Возрат" Тогда
     Док.ВидОплаты = Перечисление.ВидыОплаты.Возрат;
   Иначе
     м=1;
     Сообщить("Вид оплат не найден ? "+Список.ПолучитьЗначение(Номер+7));
       Таб.ВывестиСекцию("Стр_1");
     Перейти ~M;    
   КонецЕсли;
   
   
   //Заполнение Субконто Валовых Доходов Номер+8
   //Если СпрВал.НайтиПоНаименованию(Список.ПолучитьЗначение(Номер+8),0,0)=1 Тогда
   //  Док.СубконтоВалДохРасх=СпрВал.ТекущийЭлемент();
   //Иначе          
   //  м=1;
   //  Сообщить("СубконтоВалДохРасх не найден "+Список.ПолучитьЗначение(Номер+8));
     //  Таб.ВывестиСекцию("Стр_1");
   //  Перейти ~M;
     //КонецЕсли;
   
   
   //Содержание Номер+9
   
   //Режим оплаты Номер+10
   
   Номер=Номер+10;
 КонецЦикла;    
 Док.Записать();
 ~M: Если м=0 Тогда
         Сообщить("Документ: "+Док.НомерДок+" Успешно записан");
     Иначе    
       Сообщить("Документ: "+Док.НомерДок+" Не записан");
     КонецЕсли;
Таб.Показать();
КонецЦикла;  
 
КонецПроцедуры
69 Креатив
 
04.09.07
19:51
Прочитай (57) ещё раз
70 bizon2008
 
04.09.07
20:05
Сделал (57) стало, через раз выполнятся условие. В документе пусто.
71 Креатив
 
04.09.07
20:10
(70)
Док.Субконто1 = Спр.ТекущийЭлемент();
Конечно круто, но
Док.Субконто1 = СпрСуб1.ТекущийЭлемент();
однако, лучше будет
72 FlashC
 
04.09.07
20:11
Мдя, я конечно, промолчу на счет того что в (68)... но:
1. Спр.ТекущийЭлемент() - у тебя ничего, сначала спозиционируйся на нужном элементе!
Спр.НайтиПоНаименованию(Список.ПолучитьЗначение(№))
2. Почему тут это:
 //Заполняем валюта
 Если СпрВалюта.НайтиПоНаименованию(Список.ПолучитьЗначение(8),0,1)=1 Тогда
   Док.Валюта = !!!Спр.ТекущийЭлемент();!!!
 Иначе ...
3. В отладчик.
73 FlashC
 
04.09.07
20:14
(71)->(38)
74 Креатив
 
04.09.07
20:14
(72) А как хочется, чтоб 1С сама додумалась. Незачот 1С!!!
75 Креатив
 
04.09.07
20:16
(73) Дык в (68) то же самое. Автор идёт своим, непростым путём.
76 bizon2008
 
04.09.07
20:18
Большое спасибо.
77 Креатив
 
04.09.07
20:20
(76) Обращайся. я на обмене через текстовые файлы стаю борзых схавал. %)
78 FlashC
 
04.09.07
20:27
А вот так всегда, когда (7) - накопируешь кусков кода, а глаза не видят:)