Имя: Пароль:
1C
1C 7.7
v7: Отчет по остаткам ТМЦ по счету 10.5
,
0 Duster
 
31.05.13
21:18
Добрый день.
В 1С не соображаю. Поиск не помог.
Задача: Получить остатки по складу. На выходе текстовый файл (сохранять программно или из таблицы на форме через стандартное меню 1С)
Формат файла примерно такой:

<Код запчасти><Tab><Название з.ч.><Tab><Остаток><Tab><Ед.изм>
<Код запчасти><Tab><Название з.ч.><Tab><Остаток><Tab><Ед.изм>
<Код запчасти><Tab><Название з.ч.><Tab><Остаток><Tab><Ед.изм>

Формат файла не критичен. Разделители, конец строки(либо разделители без конца строки) любые, лишь бы можно было парсить. Могу обойтись и без единиц измерения.


Помогите! Я уж измаялся весь. Работа не срочная, но сделать ее надо. Уперся в выгрузку из 1С. Очень много времени потратил на поиски - безуспешно.

Спасибо.
1 Duster
 
31.05.13
21:22
P.S.
Доступа к конфе у меня нет.
2 Флудер
 
31.05.13
21:22
(1) "Позовите специалиста".
3 Duster
 
31.05.13
21:55
(2) Не... Самому интереснее. Вот мне немножко подскажут... )))
4 Флудер
 
31.05.13
22:00
(3) 100 баксов за совет.
5 Duster
 
31.05.13
22:30
номер ЯД сказать? ))
6 ДенисЧ
 
31.05.13
22:41
с учётом того, что "Доступа к конфе у меня нет"

10 000 евро
7 Duster
 
31.05.13
22:45
(6) Ты ведь не программист?
8 VVVP
 
31.05.13
22:48
Если нет доступа к конфе, надо делать через внешнюю обработку, имхо
9 ДенисЧ
 
31.05.13
22:50
(7) нет. я получаю 10 000 евро и отдаю тысячу рублей программисту, который решит проблему
10 angro
 
31.05.13
22:50
(7) надо хоть выяснить что это бух или торговля, версию неплохо бы
11 ДенисЧ
 
31.05.13
22:52
(10) за 10000 евро пофиг :-
12 VVVP
 
31.05.13
22:54
Если это нужно изредка, то собссно, можно саму таблицу отчета в Эксель сохранить, лишнее убрать и сохранить в подходящем формате (CSV или что-то там)
13 VVVP
 
31.05.13
22:56
у нас народ так прайсы к загрузке готовил (через Эксель)
14 VVVP
 
31.05.13
23:03
т.е. порезать в Экселе шапку отчета, лишние колонки и т.д.
и потом в CSV формате сохраняешь (с разделителями)
15 Злой Бобр
 
01.06.13
03:58
(0) Формат xml, который понимают практически все нормальные приложения, я так понимаю вам неподходит?.. Ну тогда если объем файла будет большим - запасайтесь вазелином и ищите вк для работы с текстом.
В (6) очень правильная стартовая сумма.
16 Злой Бобр
 
01.06.13
04:01
(13) Ну тупой овце и семь верст не крюк. А необходимо было всего навсего заплатить программисту и незаниматься извратом.
У меня клиенты такого явно б непотерпели. Эх, завидую ...
17 Maximysis
 
01.06.13
07:48
(1) Доступ к конфе в 7 получить не проблема))
18 ДенисЧ
 
01.06.13
09:48
Так что, моя десятьдыщьевро не проходит конкурс?
19 Duster
 
01.06.13
09:57
(12) (13) (14)  Провести парсинг документа программно - не проблема. Стандартная оборотно-сальдовая ведомость не подходит т.к. слеплены вместе код запчасти и название. Код может быть разной длинны, название может начинаться с цифры - тут парсинг не возможен, увы.
(15) Можно и xml. Его я тоже смогу разобрать в программе. Для примера: размер файла txt оборотно-сальдовой ведомости в разрезе 1 субконто получается ~1.5 МБайт
(8) именно внешняя обработка и нужна. Я так понимаю, это ERT файл.
(17) Про доступ к конфе можно подробнее?
(10) Да, чувствую свое упущение. На работе буду в понедельник - напишу. Или попробую дозвонится до кого-то, кто по сменам работает.
20 Холст
 
01.06.13
11:30
(0) если сам хочешь разобраться то конкретно в чем проблема ?
в открывании конфигуратора ?
в коде получения остатков ?
в коде получения доп реквизитов ?
в коде вывода в файл ?
ответ "во всем вместе" не интересен, т.к. при этом ответе за тебя надо всю обработку написать, это могут за 50евро сделать кодеры с 1Слансера
21 Duster
 
01.06.13
17:28
(20) Проблема в том, что я даже не знаю, с чего начать.

На этом форуме программисты 1С вообще появляются? Не думаю, что трудно сделать выгрузку в текстовый файл остатков по счету 10.5
22 Duster
 
01.06.13
17:30
(20) хоть какой-то кусок кода для начала, чтобы можно было зацепиться. Хотя бы запрос какой нужен?
23 ДенисЧ
 
01.06.13
19:20
Не поверишь, запрос не обязателен, хотя желателен
24 angro
 
01.06.13
20:37
(22) самое простое конструктор запустить в конфигураторе, там потыкать что-нибудь получиться.

тебе надо конструкторы-новый отчет
25 angro
 
01.06.13
20:39
26 angro
 
01.06.13
20:40
27 oleg_prg
 
01.06.13
21:05
**При условии что остатки хранятся на бух.итогах тогда
1 Делай обработкой
2 Код для получения остатков такой
БИ  =    СоздатьОбъект("БухгалтерскиеИтоги");
   БИ.ИспользоватьСубконто(ВидыСубконто.МестаХранения,,1);
   БИ.ИспользоватьСубконто(ВидыСубконто.Материалы,,1);
   БИ.ИспользоватьСубконто(ВидыСубконто.Цены,Партия,1);
   БИ.ВыполнитьЗапрос(Дата1, Дата2, "10.5");
   БИ.ВыбратьСубконто(1);
   Пока БИ.ПолучитьСубконто(1)  =    1 Цикл
       БИ.ВыбратьСубконто(2);
       Пока БИ.ПолучитьСубконто(2)  =    1 Цикл
           БИ.ВыбратьСубконто(3);
           Пока БИ.ПолучитьСубконто(3)  =    1 Цикл
               
               Сообщить(СокрЛП("склад "+БИ.Субконто(1))+" код "+СокрЛП(БИ.Субконто(2))+" наименование "+СокрЛП(БИ.Субконто(2))+" ост сумма "+СокрЛП(БИ.СКД("С"))+" кол "+СокрЛП(БИ.СКД("К")));
                           
           КонецЦикла;
       КонецЦикла;
   КонецЦикла;
28 oleg_prg
 
01.06.13
21:06
БИ.ИспользоватьСубконто(ВидыСубконто.МестаХранения,,1);
аналитика может отличаться т.е. посмотри как называются субконто в плане счетов
29 zak555
 
01.06.13
21:08
(27) не взлетит
30 oleg_prg
 
01.06.13
21:16
(29) да я образно человеку написал код, чтобы он понимал от чего отталкиваться
вот еще пример как выгружать данные в текстовый фай
Текст = СоздатьОбъект("Текст");
   Текст.ДобавитьСтроку("Привет");

   Текст.Записать("D:\test.txt");
ну а если эта инфа не поможет, то лучше ТС пригласить специалиста или обратиться на сайт фрилансеров 1С )
31 oleg_prg
 
01.06.13
21:18
(27) pfvtybnm  БИ.ИспользоватьСубконто(ВидыСубконто.Цены,Партия,1); на БИ.ИспользоватьСубконто(ВидыСубконто.Цены,,1); при не забывая об аналитике, в данном примере аналитика может отличаться!!!
Пишу без проверки, так что ошибки в коде не исключаю
32 Злопчинский
 
01.06.13
21:19
(27) не взлетит.
33 oleg_prg
 
01.06.13
21:28
Процедура Сформировать()
   
   Текст = СоздатьОбъект("Текст");
   
   БИ  =    СоздатьОбъект("БухгалтерскиеИтоги");
   БИ.ИспользоватьСубконто(ВидыСубконто.МестаХранения,,1);
   БИ.ИспользоватьСубконто(ВидыСубконто.Материалы,,1);
   БИ.ИспользоватьСубконто(ВидыСубконто.Цены,,1);
   БИ.ВыполнитьЗапрос("01.06.2013", "01.06.2013", "10.5");
   БИ.ВыбратьСубконто(1);
   Пока БИ.ПолучитьСубконто(1)  =    1 Цикл
       БИ.ВыбратьСубконто(2);
       Пока БИ.ПолучитьСубконто(2)  =    1 Цикл
           БИ.ВыбратьСубконто(3);
           Пока БИ.ПолучитьСубконто(3)  =    1 Цикл
               
               Текст.ДобавитьСтроку(СокрЛП("склад "+БИ.Субконто(1))+" код "+СокрЛП(БИ.Субконто(2))+" наименование "+СокрЛП(БИ.Субконто(2))+" ост сумма "+СокрЛП(БИ.СКД("С"))+" кол "+СокрЛП(БИ.СКД("К")));
                           
           КонецЦикла;
       КонецЦикла;
   КонецЦикла;    
   
   Текст.Записать("D:\test.txt");
   
КонецПроцедуры
34 Duster
 
02.06.13
19:36
Наконец-то добрался до компьютера.
(33) Олег, спасибо Вам большое. Ваш код немного переделал - убрал получение и вывод той информации, которая мне не нужна.
Еще  Текст.ДобавитьСтроку(СокрЛП("склад "+БИ.Субконто(1))+" код "+СокрЛП(БИ.Субконто(2))+" наименование "+СокрЛП(БИ.Субконто(2))+...
тут после " код " и после " наименование " используется одно и то же субконто, выводится наименование. А как получить код?
Вот мой код:
Процедура Сформировать()
   
   Текст = СоздатьОбъект("Текст");
     
   БИ = СоздатьОбъект("БухгалтерскиеИтоги");
   БИ.ИспользоватьСубконто(ВидыСубконто.Материалы,,1);
   БИ.ВыполнитьЗапрос("02.06.2013", "02.06.2013", "10.5");

   БИ.ВыбратьСубконто(1);  
   
   Пока БИ.ПолучитьСубконто(1)  =    1 Цикл
 
       Текст.ДобавитьСтроку("???" + CHR(9) + СокрЛП(БИ.Субконто(1)) + Chr(9) + СокрЛП(БИ.СКД("К")));              
   
   КонецЦикла;    
 
   Текст.Записать("D:\test.txt");
   
КонецПроцедуры

И пример вывода в файл:
???    Автоматический выключатель 1.6кВт    1
???    Болт М8х15    20
???    Гайка М8    20
???    Изолента    3
???    Кабель 4мм2 3+1 жилы    20
???    Клеммная колодка для реле    20
???    Кронштейн    1
???    Лампочка 24V    10

На месте вопросов должен быть код. Как сделать, тоже не знаю.
Да, конфигурация на работе переписана: там код используется специфический - как у поставщика зап.частей. В типовой конфигурации не смог такого формата код ввести. Завтра уточню, может быть там другое поле.
35 Злопчинский
 
02.06.13
19:42
CHR(9)
Можно писать так:
"какой-тотекст"+СимволТабуляции+Какой-то текст
36 Злопчинский
 
02.06.13
19:42
вместо слагаемого "???" используй
БИ.Субконто(1).Код
37 Злопчинский
 
02.06.13
19:43
или если это кодпоставщика то
БИ.Субконто(1).тутИдентификаторРеквизитаТипаАртикулПоставщикаИзКарточкиТовара
38 Злопчинский
 
02.06.13
19:53
на. вот может пригодится выгрузка на фтп
.
   //****************************************************************************************************************************
   //БЛОК ВЫГРУЗКИ НА ФТП *******************************************************************************************************
   //****************************************************************************************************************************
   ТекстВыгрузки = СоздатьОбъект("Текст");
   ТекстВыгрузки.ДобавитьСтроку("open " + "xxx.xxx.xxx.xxx"); //IP адрес фтп-сервера
   ТекстВыгрузки.ДобавитьСтроку("тут логин");
   ТекстВыгрузки.ДобавитьСтроку("тут пароль");
   ТекстВыгрузки.ДобавитьСтроку("cd office"); //в какую папочку от корня
   ТекстВыгрузки.ДобавитьСтроку("put " + КаталогПользователя() + (ИмяПрайса+".csv"));
   ТекстВыгрузки.ДобавитьСтроку("bye");
   ТекстВыгрузки.Записать(КаталогПользователя() + "ftp.txt");
   ТекстВыгрузки = "";
   
   КомандаСистемы("ftp -s:" + КаталогПользователя() + "Ftp.txt>> " + (КаталогПользователя() + "report.txt"));
   ФС.УдалитьФайл(КаталогПользователя() + "ftp.txt");
   
   ТекстВыгрузки = СоздатьОбъект("Текст");
   ТекстВыгрузки.Открыть(КаталогПользователя() + "report.txt");
   КС = ТекстВыгрузки.КоличествоСтрок()-4; //если все нормально - то в этой строке файла должно быть соотв.сообщение
                                           //проверим его
   Попытка
       строкаКомплете = ТекстВыгрузки.ПолучитьСтроку(КС);
       Если  Найти(Нрег(строкаКомплете),"226 transfer complete") = 0
       Тогда а=1; а=а/0;
       КонецЕсли;
       тПротокол = ТекущееВремя()+" файл данных успешно отправлен на сервер интернет-магазина"+РазделительСтрок+тПротокол;
       Форма.Обновить();
       ТекстВыгрузки = "";
       ФС.УдалитьФайл(КаталогПользователя() + (ИмяПрайса+".csv"));
       ФС.УдалитьФайл(КаталогПользователя() + "report.txt");
   Исключение
       тПротокол = ТекущееВремя()+" ПРОИЗОШЛА ОШИБКА ВО ВРЕМЯ ЗАГРУЗКИ СФОРМИРОВАННОГО ФАЙЛА НА СЕРВЕР ИНЕТРНЕТ-МАГАЗИНА"+РазделительСтрок+тПротокол;
       тПротокол = ТекущееВремя()+ИмяПрайса+РазделительСтрок+тПротокол;
       Форма.Обновить();
       ТекстВыгрузки.Показать();
       ТекстВыгрузки = "";
   КонецПопытки;    
   //****************************************************************************************************************************
   //БЛОК ВЫГРУЗКИ НА ФТП *******************************************************************************************************
   //****************************************************************************************************************************
39 Duster
 
02.06.13
19:58
(36) Ага! Заработало.
000000012    Автоматический выключатель 1.6кВт    1
(37) Смысл уловил. Теперь на реальном объекте мне просто нужно будет правильно этот реквизит(или как это в 1С называется) задать.
(38) Так... фтп - это интересно. Вижу конструкцию
Попытка
Исключение
Конец попытки;
Надо это прикрутить на попытку записи в файл.
40 Duster
 
02.06.13
20:23
Процедура Сформировать()
   
   Текст = СоздатьОбъект("Текст");
     
   БИ = СоздатьОбъект("БухгалтерскиеИтоги");
   БИ.ИспользоватьСубконто(ВидыСубконто.Материалы,,1);
   БИ.ВыполнитьЗапрос("02.06.2013", "02.06.2013", "10.5");

   БИ.ВыбратьСубконто(1);  
   
   Пока БИ.ПолучитьСубконто(1) = 1 Цикл
       Текст.ДобавитьСтроку(БИ.Субконто(1).Код + CHR(9) + СокрЛП(БИ.Субконто(1)) + Chr(9) + СокрЛП(БИ.СКД("К")));              
   КонецЦикла;    
 
   Попытка
       Текст.Записать("D:\test.txt");    
       Сообщить(ТекущееВремя()  +" Файл " + Chr(34) + "D:\test.txt" + Chr(34) + " успешно записан.");
   Исключение  
       Сообщить(ОписаниеОшибки());
   КонецПопытки;
   
КонецПроцедуры

Пока оставляю так. Завтра опробую на пациенте )))

Спасибо большое.
41 Duster
 
02.06.13
21:30
Созрел вопрос: будет ли разделитель Tab (Chr(9)) уникальным? Если в наименовании запчасти введен пользователем случайно знак табуляции, возникнут проблемы. Да, его нельзя ввести непосредственно в строку "Наименование" с клавиатуры, но скопипастить получается. Кто какие разделители использует???
42 Злопчинский
 
03.06.13
03:22
Аlt+0135 ‡ можно - но его тоже можно с клавы...
.
ну и уникального разделителя вообще если так подходить нет возможности обеспечить.
.
перед выводом строки нормализуй ее, исключая недопустимые символы. а правильнее это делать в момент записи нового/измененного элемента справочника...
.
во-вторых, вряд ли среди 4000 позиций будет 3000 позиций с кривым символом. ну будет 1-2 позиции. нра этих позициях - если загрузка в инет магазин написана правильно - загрузк азаткнется, ибо где-нить закосячит что-нить.. или цена нулевая или еще что... а если вдруг и не закосячит и проетит 1-2 неправильные позиции в магазин - ну и хрен с ним. возможны два варианта - если это ходовые позиции - они будуь выловдены практически сразу, если ничего никто не заметит - это нафиг никому не нужно...
43 Duster
 
04.06.13
08:01
Точно! В самой выгрузке из 1С попробую обработать
44 zak555
 
04.06.13
08:03
куда файл будет загружаться ?
45 Злопчинский
 
04.06.13
12:15
(39) Надо это прикрутить на попытку записи в файл.
надо аккрутно крутить, а то потом тебе выкрутят яйца.
на заметку при работе с объектом ФС - могут давать ошибки, но не порождать исключительной ситуации
46 Duster
 
04.06.13
12:31
(44) Загружается уже. В базу MS ACCESS через VBA

(45) Я планировал это сделать перед добавлением строки в объект Текст через промежуточную строковую переменную
Примерно так:

   Пока БИ.ПолучитьСубконто(1) = 1 Цикл
      Поле1 = БИ.Субконто(1).Код;
      Поле2 = СокрЛП(БИ.Субконто(1));
      Поле3 = СокрЛП(БИ.СКД("К"));
      //Тут вырезать лишнее из каждой строковой переменной
      Текст.ДобавитьСтроку(Поле1 + CHR(9) + Поле2  + Chr(9) + Поле3);
   КонецЦикла;

Покурю справку по работе со строками.
47 Duster
 
04.06.13
12:45
Процедура Сформировать()
   
   Текст = СоздатьОбъект("Текст");
     
   БИ = СоздатьОбъект("БухгалтерскиеИтоги");
   БИ.ИспользоватьСубконто(ВидыСубконто.Материалы,,1);
   БИ.ВыполнитьЗапрос("03.06.2013", "03.06.2013", "10.5");

   БИ.ВыбратьСубконто(1);      
   
   Пока БИ.ПолучитьСубконто(1) = 1 Цикл
      Поле1 = СтрЗаменить(БИ.Субконто(1).Код, Chr(9), " ");
      Поле2 = СтрЗаменить(СокрЛП(БИ.Субконто(1)), Chr(9), " ");
      Поле3 = СтрЗаменить(СокрЛП(БИ.СКД("К")), Chr(9), " ");
      //Т.к. использую разделитель Tab, то в значениях полей этого символа быть не должно.
      // Заменяю их на пробелы

      Текст.ДобавитьСтроку(Поле1 + CHR(9) + Поле2  + Chr(9) + Поле3);
   КонецЦикла;
   
   
  //Пока БИ.ПолучитьСубконто(1) = 1 Цикл    
//            Текст.ДобавитьСтроку(БИ.Субконто(1).Код + CHR(9) + СокрЛП(БИ.Субконто(1)) + Chr(9) + СокрЛП(БИ.СКД("К")));              
//   КонецЦикла;    
 
   Попытка
       Текст.Записать("E:\test.txt");    
       Сообщить(ТекущееВремя()  +" Файл " + Chr(34) + "E:\test.txt" + Chr(34) + " успешно записан.");
   Исключение  
       Сообщить(ОписаниеОшибки());
   КонецПопытки;
   
КонецПроцедуры
48 Duster
 
04.06.13
12:54
Собственно, можно было без переменных Поле1, Поле2, Поле3.
49 Duster
 
04.06.13
12:59
Вот еще вопрос: как мне единицы измерения получить. Чтобы на выходе было
<Код> <Наименование> <Количество> <Ед.Измерения>