Имя: Пароль:
1C
1С v8
DBF и ТЗ
0 Singenor
 
13.11.12
17:20
нужно выгружать данные из дбф в таблицу значений на форме, как это сделать? почитал как просто выгружать данные, что то вроде:
ФайлДанных = Новый XBase(ИмяФайла);
   ФайлДанных.Кодировка = Кодировка;
   Если Не ФайлДанных.Открыта() Тогда
       Сообщение = Новый СообщениеПользователю;
       Сообщение.Текст = "Не удалось открыть файл " + ИмяФайла;
       Сообщение.Сообщить();
       Возврат Неопределено;
   КонецЕсли;
ну это просто для открытия дбф, потом нам нужно создать ТЗ:
ТабЗнач = Новый ТаблицаЗначений;
   Для Каждого Поле из ФайлДанных.Поля Цикл
     тут создаем поля для выгрузки данных
   КонецЦикла;
Ну и затем заполняем его. Вроде все не сложно, только встает вопрос:
Если у меня на форме есть табличное поле с типом таблица значений, как мне именно в эту форму выгружать данные?
1 Vladal
 
13.11.12
17:23
ЭлементыФормы.ТабличноеПоле1.Значение = ТаблицаДанных;
ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();
2 Singenor
 
13.11.12
17:25
(1) это вместо пункта 2 получается, где мы создаем тз?
3 Singenor
 
13.11.12
17:27
точнее мы создаем тз, забиваем колонками, и потом прописываем как раз ЭлементыФормы.ТабличноеПоле1.Значение = ТЗ так?
4 Vladal
 
13.11.12
17:30
(2) Это мы визуализируем. А тебе надо именно как пройти по всем полям ДБФ и создать колонки в ТЗ? Просто я прочитал "это несложно" и подумал "странно, это не сложно, а показать сложно ("
5 Singenor
 
13.11.12
17:32
ну вот у меня в дбф есть куча колонок, мне нужно вытащить только 2 колонки, одна АРТ, вторая Ном, к  примеру, и эти колонки нужно перенести в обработку, у которой есть табличноеполе1
6 shuhard
 
13.11.12
17:33
(5) будь мужиком
сделай у обработки ТЧ с двумя колонками
7 Singenor
 
13.11.12
17:36
ТаблицаЗначений = Новый ТаблицаЗначений;
   ТаблицаЗначений.Колонки.Добавить("Артикул");
   ТаблицаЗначений.Колонки.Добавить("Наименование")
   ЭлементыФормы.ТабличноеПоле1.ТипЗначения = ТаблицаЗначений;

можно и так ведь не?
8 vicof
 
13.11.12
17:38
(7) нет
9 shuhard
 
13.11.12
17:39
(7)[ЭлементыФормы.ТабличноеПоле1.ТипЗначения = ТаблицаЗначений]
я бы на месте 1С послал матом
10 salvator
 
13.11.12
17:42
(7) Почитай Радченко чтоль для начала. Да и на форуме поиском научись пользоваться, полно примеров.
11 salvator
 
13.11.12
17:43
+(10) 10 секунд поиска и вуаля:
v8: Загрузка из DBF в Табл.Часть(Обраьотки)
Круто, правда?
12 Singenor
 
13.11.12
17:47
(11) я этот пост видел уже сегодня)
у меня тут паралельно еще вопросик: делаю полеввода(Загрузка), для выбора дбф файла, размещаю его на форму обработки, создаю реквизит, называю его путьКФайлу, затем передаю полею ввода тип реквизит путь к файлу, т.е.
Загрузка имеет тип ПутьКФайлу
пишу код для выбора файла:
Процедура ВыборФайла(Элемент)
   
   ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   
   ДиалогВыбора.Фильтр     = "Файл данных (*.dbf)|*.dbf";
   ДиалогВыбора.Расширение = "xls";
   
   ДиалогВыбора.Заголовок ="Выберите файлы для загрузки";
   
   ДиалогВыбора.ПредварительныйПросмотр     = Ложь;
   ДиалогВыбора.ИндексФильтра               = 0;
   ДиалогВыбора.ПолноеИмяФайла              = Элемент.Значение;
   ДиалогВыбора.ПроверятьСуществованиеФайла = Ложь;
   ДиалогВыбора.МножественныйВыбор          = Ложь;
   Если ДиалогВыбора.Выбрать() Тогда
       
       Элемент.Значение = ДиалогВыбора.ПолноеИмяФайла;
       
   КонецЕсли;
   
КонецПроцедуры

И затем вызваю эту функцию

Процедура ЗагрузкаНачалоВыбора(Элемент, СтандартнаяОбработка)
ВыборФайла(Элемент);
КонецПроцедуры

но ничего не происходит, почему?
13 salvator
 
13.11.12
17:53
1. Почему расширение экселевское?
2. Лучше ПроверятьСуществованиеФайла поставь в Истина
14 Singenor
 
13.11.12
17:53
да точно, расширение дбф, мозг кипит) щас попробуем
15 Singenor
 
13.11.12
17:54
(13) нет, все равно пустое поле, без возможности выбора
16 Singenor
 
13.11.12
17:58
отладчиком не попадает даже на этот кусок кода
17 salvator
 
13.11.12
18:00
(16) К полю ввода точно назначена процедура ЗагрузкаНачалоВыбора на событие Начало выбора?
18 Singenor
 
13.11.12
18:02
да
19 Singenor
 
13.11.12
18:03
20 Singenor
 
13.11.12
18:05
21 Singenor
 
13.11.12
18:06
22 salvator
 
13.11.12
18:09
(19) Лол.
Думай. Подсказка: ответ в последнем слове в (17)
23 Singenor
 
13.11.12
18:11
(22) Так процедура ведь указана на событие Началовыбора оО
24 Singenor
 
13.11.12
18:14
во я лох то) надо просто галочку было воткнуть)
25 salvator
 
13.11.12
18:17
(24)  я даже боюсь предположить, как ты собирался выбирать файл...
26 Singenor
 
13.11.12
18:34
25 с бубном))
27 Vladal
 
13.11.12
18:40
(26) Тебе просто говорят в свойствах реквизита указать обработчик.
28 Singenor
 
13.11.12
18:43
(27) где в свойствах реквизита обработчик? я добавил на свойствах поле ввода просто в Использовании Кнопкавыбора, и все, работает ведь
29 salvator
 
13.11.12
18:44
(27) не, все проще. он кнопку выбора в поле ввода не поставил.
30 Vladal
 
13.11.12
18:50
Да поможет тогда Ctrl+Shift+F4
31 Singenor
 
14.11.12
10:56
а как сделать проверку на наличие уже значений? то есть я загрузил данные из ДБФ в ТП, они загрузились, потом загружаю еще раз, они опять грузятся, чтобы в общем не было дублирований?
32 Singenor
 
14.11.12
10:58
Вот процедура:

Процедура ОсновныеДействияФормыЗагрузитьДанныеИзДБФ(Кнопка)
   
   База = Новый XBase;
   База.Кодировка=КодировкаXBase.OEM;
   База.ОткрытьФайл(ПутьКФайлу);
   Если База.Открыта() тогда
       База.Первая();
       Пока Не База.ВКонце() Цикл
           НоваяСтрока = ТабличноеПоле1.Добавить();
           НоваяСтрока.Артикул = База.Art;
           НоваяСтрока.Наименование = База.IKT;
           База.Следующая();
       КонецЦикла;
   КонецЕсли;
   База.ЗакрытьФайл();
КонецПроцедуры
33 Singenor
 
14.11.12
11:40
блин, запутался, выдает ошибку:

{Форма.Форма.Форма(81)}: Значение не является значением объектного типа (Артикул)
               ТекСтраница.Артикул = СтрокаТаблицыЗагрузки.Артикул;
34 Singenor
 
14.11.12
11:42
Процедура ОсновныеДействияФормыЗагрузитьДанныеИзДБФ(Кнопка, Отказ)
   
   База = Новый XBase;
   База.Кодировка=КодировкаXBase.OEM;
   База.ОткрытьФайл(ПутьКФайлу);
   Если НЕ ЗначениеЗаполнено(ПутьКФайлу) Тогда
       Сообщить("Не указан DBF файл, для загрузки");
       Возврат;
   КонецЕсли;
   База.Первая();
   ТаблицаЗагрузки = Новый ТаблицаЗначений;
   ТаблицаЗагрузки.Колонки.Добавить("Артикул");
   ТаблицаЗагрузки.Колонки.Добавить("Наименование");
   Пока Истина Цикл
       СтрокаТаблицыЗагрузки = ТаблицаЗагрузки.Добавить();
       СтрокаТаблицыЗагрузки.Артикул = База.Art;
       СтрокаТаблицыЗагрузки.Наименование = База.IKT;
       Если Не База.Следующая() Тогда
           Прервать;
       КонецЕсли;
   КонецЦикла;
   ТаблицаЗагрузки.Сортировать("Артикул");
   
   ТекСтраница = Неопределено;
   
   Для каждого СтрокаТаблицыЗагрузки из ТаблицаЗагрузки Цикл
       СоздатьНовуюЗапись = Ложь;
       Если ТекСтраница = Неопределено Тогда
           СоздатьНовуюЗапись = Истина;
       Иначе
           Если НЕ ТекСтраница.Артикул = СтрокаТаблицыЗагрузки.Артикул Тогда
               СоздатьНовуюЗапись = Истина;
           КонецЕсли;
       КонецЕсли;
       Если ТекСтраница = Неопределено Тогда
           СоздатьНовуюЗапись = Истина;
           Иначе
           Если Не ТекСтраница.Наименование = СтрокаТаблицыЗагрузки.Наименование Тогда
               СоздатьНовуюЗапись = Истина;
           КонецЕсли;
       КонецЕсли;
       
           
           Если СоздатьНовуюЗапись Тогда
               ТекСтраница.Артикул = СтрокаТаблицыЗагрузки.Артикул;
               ТекСтраница.Наименование = СтрокаТаблицыЗагрузки.Наименование;
           КонецЕсли;
           
       Новаястрока = ТекСтраница.Добавить();
       Новаястрока.Артикул = СтрокаТаблицыЗагрузки.Артикул;
       Новаястрока.Наименование = СтрокаТаблицыЗагрузки.Наименование;
   КонецЦикла;
           
КонецПроцедуры
35 Singenor
 
14.11.12
11:51
что не так?)
36 Singenor
 
14.11.12
12:10
Текстраница = неопределено, из за этого мб? нужно ведь задать что Текстраница это по сути запись в ТП не?
37 1Сергей
 
14.11.12
12:15
(36) почитай книжки уже. А ещё посмотри как в других конфах это сделано
38 hhhh
 
14.11.12
12:22
(36) что за страница такая и почему она всегда равна Неопределено?
39 Singenor
 
14.11.12
12:23
(38) для начала она неопределно, а вообще эта страница это табличноеполе, в которое у меня выводятся данные из дбф,
Текстраница = ЭлементыФормы.ТабличноеПоле1;
но так тоже неверно
40 Singenor
 
14.11.12
12:26
как то нужно чтобы, если значение в ТЗ, в которую я выгрузил данные из ДБФ уже существует то ничего не делать, если в ТЗ нет еще такого значения, то загрузить его)
41 Singenor
 
14.11.12
12:27
ТаблицаЗагрузки = Новый ТаблицаЗначений;
   ТаблицаЗагрузки.Колонки.Добавить("Артикул");
   ТаблицаЗагрузки.Колонки.Добавить("Наименование");
   Пока Истина Цикл
       СтрокаТаблицыЗагрузки = ТаблицаЗагрузки.Добавить();
       СтрокаТаблицыЗагрузки.Артикул = База.Art;
       СтрокаТаблицыЗагрузки.Наименование = База.IKT;
       Если Не База.Следующая() Тогда
           Прервать;
       КонецЕсли;
   КонецЦикла;
Вот запись данных из ДБФ в ТЗ
42 Singenor
 
14.11.12
12:27
потом пишем условие для проверки наличия записей:
Для каждого СтрокаТаблицыЗагрузки из ТаблицаЗагрузки Цикл
тут и нужно задать проверку, но я не совсем понимаю как
КонецЦикла;
43 Singenor
 
14.11.12
12:30
ТекСтраница = ЭлементыФормы.ТабличноеПоле1.ТекущиеДанные;
44 salvator
 
14.11.12
12:34
Ёперный театр. Я тебе в (11) ссылку давал, там есть проверка на наличие значения. Глаза разуй.
45 salvator
 
14.11.12
12:35
Жду не дождусь, когда на форуме введут месячный ридонли за неумение пользоваться поиском.
46 Singenor
 
14.11.12
12:36
(45) ты про это?
Если ТЗ_.Найти(СокрЛП(База_.NomerD))=Неопределено Тогда
                 НоваяТЗ = ТЗ_.Добавить();
                 НоваяТЗ.Документ = СокрЛП(База_.VIDDoc);
                 НоваяТЗ.НомерДокумента = СокрЛП(База_.NomerD);
                 НоваяТЗ.Дата = СокрЛП(База_.DataDoc);
                 НоваяТЗ.Состояние = ?(База_.Proveden=1,"Проведен","Не Проведен");
           КонецЕсли;
47 salvator
 
14.11.12
12:41
(46) Почитай СП про метод Найти.
48 salvator
 
14.11.12
12:42
+(47) Разрешаю так же использовать метод НайтиСтроки. Тут он полезнее будет, чтобы 2 условия не писать.
49 Singenor
 
14.11.12
12:54
так вроде получилось, щас проверю
50 Singenor
 
14.11.12
12:57
ПараметрыПоиска = Новый Структура;
    ПараметрыПоиска.Вставить("Артикул", База.Art);
    ПараметрыПоиска.Вставить("Наименование", База.IKT);
   
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Артикул");
    ТЗ.Колонки.Добавить("Наименование");
    Если База.Открыта() тогда
        База.Первая();
        НомерСтр = 1;
        Пока Не База.ВКонце() Цикл
            Если ТЗ.Найти(ПараметрыПоиска)=Неопределено Тогда
                НоваяТЗ = ТЗ.Добавить();
                НоваяТЗ.Артикул = СокрЛП(База.Art);
                НоваяТЗ.Наименование = СокрЛП(База.IKT);
            КонецЕсли;
            База.Следующая();
        КонецЦикла;    
        ЭлементыФормы.ТабличноеПоле1.Значение = ТЗ;
        ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();
    КонецЕсли;

Вот, может кому еще пригодиться)