Имя: Пароль:
 
1C
1С v8
Как свернуть ТЗ 1с 8.2
0 Raid
 
09.10.17
09:18
ДД!
Есть обработчик по загрузке файлов .csv в Бухгалтерия для Казахстана, редакция 2.0, разработка для Казахстана: (2.0.24.10)

Реализации создаются норм, но только не устраивает что на каждую сткроку файла создается отдельная накладная. Помогите прописать чтоб сворачивался по реквизиту склада и таб часть сгруппировывалась по номенклатуре. Заранее спасибо!

Текст = Новый ТекстовыйДокумент;
        Текст.Прочитать(transaction, КодировкаТекста.UTF8);
        Для ш=1 по Текст.КоличествоСтрок() Цикл
            Стр = СокрЛП(Текст.ПолучитьСтроку(ш));        
            Если СокрЛП(Стр) = "" Тогда
                Продолжить;
            КонецЕсли;
        ошибка = 0;    
        КонецЦикла;
        
        сообщить("Обработка файла начата.",СтатусСообщения.Информация);
                
        тбОплат = новый ТаблицаЗначений;
        тбОплат.Колонки.Добавить("KKM_SERIAL_ID");
        тбОплат.Колонки.Добавить("KKM_RNM");
        тбОплат.Колонки.Добавить("Data");
        тбОплат.Колонки.Добавить("FISCAL_FEATURE");
        тбОплат.Колонки.Добавить("CHECK_TYPE");
        тбОплат.Колонки.Добавить("CASHER_SURNAME");
        тбОплат.Колонки.Добавить("CASHER_NAME");
        тбОплат.Колонки.Добавить("CASHER_IIN");
        тбОплат.Колонки.Добавить("PRODUCT_NAME");
        тбОплат.Колонки.Добавить("PRODUCT_COUNT");
        тбОплат.Колонки.Добавить("PRODUCT_PRICE");
        тбОплат.Колонки.Добавить("PRODUCT_SUMM");
                
         Для ш=1 по Текст.КоличествоСтрок() Цикл
            Стр = СокрЛП(Текст.ПолучитьСтроку(ш));      
            Если СокрЛП(Стр) = "" Тогда
                продолжить;
            КонецЕсли;
            
        ошибка = 0;
        стрОплат= тбОплат.Добавить();
        //стрОплат.Номер = ДанныеКолонки(стр,1,ошибка,ш,"число");
        стрОплат.KKM_SERIAL_ID =сокрЛП(ДанныеКолонки(стр,2,ошибка,ш,"Строка"));
        стрОплат.Data = ДанныеКолонки(стр,4,ошибка,ш,"Дата");
        стрОплат.CASHER_SURNAME =сокрЛП(ДанныеКолонки(стр,7,ошибка,ш,"Строка"));
        стрОплат.CASHER_NAME=сокрЛП(ДанныеКолонки(стр,8,ошибка,ш,"Строка"));
        стрОплат.CASHER_IIN=сокрЛП(ДанныеКолонки(стр,9,ошибка,ш,"Строка"));
        стрОплат.PRODUCT_NAME=сокрЛП(ДанныеКолонки(стр,10,ошибка,ш,"Строка"));
        стрОплат.PRODUCT_COUNT=ДанныеКолонки(стр,11,ошибка,ш,"число");
        стрОплат.PRODUCT_PRICE=ДанныеКолонки(стр,12,ошибка,ш,"число");
        стрОплат.PRODUCT_SUMM=ДанныеКолонки(стр,13,ошибка,ш,"число");
        
            
        Пновый=0;
        новномер="";
        первый=1;
        колдок=0;
        
        //КонецЦикла;
        Для каждого стр из тбОплат цикл
            Если Пновый=0 тогда
                                
                        
            ДокРасх = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
                                      
                первый=0;
                        
                ДокРасх.Дата = ЭлементыФормы.ДатаДока.Значение;
                ДокРасх.Контрагент = СпрКлиент.НайтиПоКоду("000000241");
                ДокРасх.Организация = Справочники.Организации.НайтиПоКоду("000000001");
                ДокРасх.ВалютаДокумента = Константы.ВалютаРегламентированногоУчета.Получить();
                ДокРасх.УчитыватьКПН=ИСТИНА;
                ДокРасх.ВидУчетаНУ=Справочники.ВидыУчетаНУ.НУ;
                Отбор = Новый Структура;
                Отбор.Вставить("Валюта", ДокРасх.ВалютаДокумента);
                ДокРасх.КурсВзаиморасчетов = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ДокРасх.Дата, Отбор).Курс;
                ДокРасх.СуммаВключаетНДС=истина;
                ДокРасх.КратностьВзаиморасчетов= РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ДокРасх.Дата, Отбор).кратность;
                ДокРасх.СчетУчетаРасчетовСКонтрагентом=ПланыСчетов.Типовой.КраткосрочнаяДебиторскаяЗадолженностьПокупателейИЗаказчиков;//1210
                ДокРасх.СчетУчетаРасчетовПоАвансам = ПланыСчетов.Типовой.КраткосрочныеАвансыПолученные;
                ДокРасх.Ответственный = ПараметрыСеанса.ТекущийПользователь;;
                ДокРасх.ВидОперации=перечисления.ВидыОперацийРеализацияТоваров.ПродажаКомиссия;
                Скл= СпрСклад.НайтиПоРеквизиту("ID", стрОплат.KKM_SERIAL_ID);
                                                            
                Если  Скл=СпрСклад.ПустаяСсылка() тогда
                    НовыйСклад=СпрСклад.СоздатьЭлемент();
                    НовыйСклад.ID = стрОплат.KKM_SERIAL_ID;
                    НовыйСклад.Наименование = стрОплат.KKM_SERIAL_ID;
                    НовыйСклад.Записать();
                    ДокРасх.Склад = НовыйСклад;
                    Сообщить("Создан Склад с ID " + стрОплат.KKM_SERIAL_ID,статусСообщения.Информация);
                иначе
                    ДокРасх.Склад = Скл;
                    
                КонецЕсли;    
                ДокРасх.Комментарий = "Загружено из WEB кассы";

                ДокРасх.ДоговорКонтрагента=ДокРасх.Контрагент.ОсновнойДоговорКонтрагента;
                    
                СтрокаТабличнойЧасти = Стр;
                Пновый = 1;
                ДокР = ДокРасх.Товары.Добавить();
                Если стрОплат.PRODUCT_NAME = "Алтын (Altyn)"  тогда
                    номен = СпрНом.НайтиПоКоду("00000000311");
                Иначе
                    номен = СпрНом.НайтиПоКоду("00000000312");
                КонецЕсли;
                Если  номен = СпрНом.ПустаяСсылка()или номен = неопределено тогда
                      Сообщить("Не найден товар с наименованием " + стрОплат.PRODUCT_NAME, СтатусСообщения.Информация);
                продолжить;
                КонецЕсли;

                ДокР.Номенклатура = номен;
                ДокР.Количество = стрОплат.PRODUCT_COUNT;
                ДокР.Цена = стрОплат.PRODUCT_PRICE;
                ДокР.Сумма = ДокР.Количество * ДокР.Цена;
                ДокР.Коэффициент=1;
                ДокР.ЕдиницаИзмерения  = номен.БазоваяЕдиницаИзмерения;
                ДокР.СтавкаНДС=УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глТекущийПользователь, "ОсновнаяСтавкаНДС");
                ДокР.СчетУчетаБУ=ПланыСчетов.Типовой.НайтиПоКоду("1332");//1332
                ДокР.СчетУчетаНДСПоРеализации=ПланыСчетов.Типовой.НалогНаДобавленнуюСтоимость; //3130
                ДокР.НДСВидОперацииРеализации=спрВидыРеализации.НайтиПоКоду("000001");//Продажа товаров, оказание услуг, выполнение работ на территории РК
                ДокР.СчетДоходовБУ=ПланыСчетов.Типовой.НайтиПоКоду("6012");//6012
                Если номен.Код =  "00000000311" тогда
                ДокР.СубконтоДоходовБУ1=спрДох.НайтиПоКоду("000000009");//Выручка от продажи Алтын
                иначе
                ДокР.СубконтоДоходовБУ1=спрДох.НайтиПоКоду("000000008");//Выручка от продажи Алтын
                КонецЕсли;
                ДокР.СубконтоДоходовБУ2=Справочники.НоменклатурныеГруппы.НайтиПоКоду("000000001");
                ДокР.СубконтоДоходовБУ3= Справочники.ПодразделенияОрганизаций.НайтиПоРеквизиту("ID", стрОплат.KKM_SERIAL_ID);
                ДокР.СчетСписанияСебестоимостиБУ=ПланыСчетов.Типовой.СебестоимостьРеализованнойПродукцииИОказанныхУслуг;//7010
                ДокР.СубконтоСписанияСебестоимостиБУ1=спрСтатьиЗатр.НайтиПоКоду("000000099");//Списание себестоимости лотерейных билетов
                ДокР.СубконтоСписанияСебестоимостиБУ2 =Справочники.НоменклатурныеГруппы.НайтиПоКоду("000000001");
                ДокР.СубконтоСписанияСебестоимостиБУ3 = Справочники.ПодразделенияОрганизаций.НайтиПоРеквизиту("ID", стрОплат.KKM_SERIAL_ID);

                
                ДокР.СчетУчетаНУ=ПланыСчетов.Налоговый.Товары;//н211
                ДокР.СчетДоходовНУ=ПланыСчетов.Налоговый.ДоходыОтПродажи;//н710
                ДокР.СчетСписанияСебестоимостиНУ=ПланыСчетов.Налоговый.СебестоимостьПроданныхТоваров;//н810
                ДокР.СубконтоДоходовНУ1=спрДох.НайтиПоКоду("000000009");//Выручка от продажи Алтын
                ДокР.СубконтоДоходовНУ2=ДокР.Номенклатура ; //товар
                ДокР.СубконтоСписанияСебестоимостиНУ1=спрСтатьиЗатр.НайтиПоКоду("000000099");
                                    
            КонецЕсли;
            Продолжить;

            
        КонецЦикла;
        
            ДокРасх.УстановитьВремя(РежимАвтоВремя.ТекущееИлиПоследним);
        Если пров=1 тогда
            ДокРасх.Записать(РежимЗаписиДокумента.Запись);
            Попытка
                ДокРасх.записать(РежимЗаписиДокумента.Проведение);
            Исключение
            КонецПопытки;
        иначе
            ДокРасх.Записать(РежимЗаписиДокумента.Запись);
            
            колдок=колдок+1;
        КонецЕсли;
        
        Сообщить("записан Расходная накладная "+ДокРасх.Номер,СтатусСообщения.Информация);
1 r_i_n_i_k
 
09.10.17
09:19
ТЗ.Свернуть не?)
2 CountR
 
09.10.17
09:20
ТС красавчик... Такую портянку вытащил - изучайте, помогите мне!
3 igorPetrov
 
09.10.17
09:21
(0) Твою мать...
4 Raid
 
09.10.17
09:28
(1) добавить еще одну таблицу добавить туда колонку и по нему во второй свернуть?
5 igorPetrov
 
09.10.17
09:30
(4) Две.
6 CountR
 
09.10.17
09:33
Самый простой алгоритм:

Сворачиваешь ТЗ по реквизиту склада и по номенклатуре. Если в ТЗ есть что нибудь еще, типа цены или характеристики - то эти колонки тоже включаешь в группируемые, чтобы не потерялись.
Суммируемые колонки сам определишь, обычно это количество, или сумма.

Далее сортируешь по реквизиту склада и перебираешь в цикле строки. Если реквизит склада изменился - то создаешь новый документ.
7 Raid
 
09.10.17
09:35
(6)  Спасибо пробую
8 Raid
 
09.10.17
09:50
Сворачиваю по номеру кассы, при загрузке файла грузиться только последняя срока, что не так делаю??

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("НомерКассы");
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(transaction, КодировкаТекста.UTF8);
ТЗ.Очистить();
Для ш=1 по Текст.КоличествоСтрок() Цикл
Стр = СокрЛП(Текст.ПолучитьСтроку(ш));        
Если СокрЛП(Стр) = "" Тогда
Продолжить;
КонецЕсли;
ошибка = 0;    
KKM_SERIAL_ID = СокрЛП(Лев(Стр,Найти(Стр,Разд)-1));
    Стр = Прав(Стр,СтрДлина(Стр)-Найти(Стр,Разд));
    
    НоваяСтрока = ТЗ.Добавить();
    НоваяСтрока.НомерКассы = KKM_SERIAL_ID;
    
КонецЦикла;
ТЗ.Свернуть("НомерКассы",)
9 CountR
 
09.10.17
11:04
Либо в текстовом документе только одна строка, либо строк несколько - но все с одинаковым значением. По этой причине в каждой новой строке ТЗ одинаковое значение номера кассы:

НоваяСтрока.НомерКассы = KKM_SERIAL_ID

Если код приведен полностью, то строка:
Стр = Прав(Стр,СтрДлина(Стр)-Найти(Стр,Разд));
лишняя, так как в начале цикла переменной Стр присвоится новое значение.

Удобно проверять заполнение ТЗ правильными значениями в отладчике. Выделяешь слово ТЗ, нажимаешь Shift-F9, затем на значении ТЗ в открывшемся окне - F2 (вычислить значение)
10 igorPetrov
 
09.10.17
11:11
(8) "что не так делаю??" - пишешь с ошибками.
11 Tatitutu
 
09.10.17
11:19
Если номен.Код =  "00000000311" тогда
                ДокР.СубконтоДоходовБУ1=спрДох.НайтиПоКоду("000000009")//Выручка от продажи Алтын

                иначе
                ДокР.СубконтоДоходовБУ1=спрДох.НайтиПоКоду("000000008")//Выручка от продажи Алтын

                КонецЕсли;

Алтын - однако !
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.