Имя: Пароль:
1C
1С v8
Создание Палтежных поручений (УПП 8.2)
0 Ser_Vlad
 
05.10.14
20:54
Доброго вечера Форумчане, если такое возможно, нужна помощь обработка "Создание ПлатежныхНоручений Исходящих "

при запуске обработки пишет Ошибка "Символ за границей массива", если нужно код сейчас выложу...
1 zulu_mix
 
05.10.14
20:57
не нужно
2 ОбычныйЧеловек
 
05.10.14
20:57
(0) Выкладывай, посмотрим.
3 Ser_Vlad
 
05.10.14
20:59
//Перем      ДатаПП;
Перем      ВидВыплаты ;
Перем      Сумма ;
Перем      Контрагент ;
Перем      Проект ;
Перем      НомерСчета ;
Перем      ИмяВидаРасчета ;
Перем      НазначениеПлатежа  ;
/////



///////////////////////////////////////////////////////////////////////////
//Служебные процедуры и функии

//Функция читает файл по переданному имени и возращает таблицу значений
Функция  ПолучитьТаблицуПлатежей(ИмяФайла)
    
    ТаблицаПлатежей = Новый ТаблицаЗначений;
    ТаблицаПлатежей.Колонки.Добавить("Сумма");
    ТаблицаПлатежей.Колонки.Добавить("НомерСчета");
    ТаблицаПлатежей.Колонки.Добавить("ИмяВидаРасчета");
    ТаблицаПлатежей.Колонки.Добавить("НазначениеПлатежа");                                  
    ТаблицаПлатежей.Колонки.Добавить("ВидВыплаты");
    ТаблицаПлатежей.Колонки.Добавить("Контрагент");
    ТаблицаПлатежей.Колонки.Добавить("Банк");
    ТаблицаПлатежей.Колонки.Добавить("Проект");
    Попытка
        ServiceManager = Новый ComОбъект("com.sun.star.ServiceManager");
        МетодЗагрузки = "ОО";
    Исключение
        Сообщить("Отсутствует приложение для загрузки файла");
    КонецПопытки;
    
    scr             = Новый ComОбъект("MSScriptControl.ScriptControl");    
    scr.language    = "javascript";
    scr.eval("MassivParametrov = new Array()");
    MassivParametrov = scr.eval("MassivParametrov");
    scr.AddObject("OpenOffice", ServiceManager);
    scr.eval("MassivParametrov[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
    scr.eval("MassivParametrov[0].Name='Hidden'");
    scr.eval("MassivParametrov[0].Value=true");
    
    ServiceManager = Новый ComОбъект("com.sun.star.ServiceManager");
    Desktop = ServiceManager.CreateInstance("com.sun.star.frame.Desktop");
    sv      = ServiceManager.createInstance("com.sun.star.ucb.FileContentProvider");
    
    
    Path    = sv.getFileURLFromSystemPath("", ИмяФайла);
    Doc = Desktop.LoadComponentFromURL(Path, "_blank", 0, MassivParametrov);
    
    
    Попытка
        Doc.lockControllers();
        Doc.addActionLock();
    Исключение
        Сообщить("Не удалось заблокировать файл: "+ИмяФайла);
        Возврат Неопределено;
    КонецПопытки;
    
    Sheets = Doc.GetSheets();;
    Документ = Sheets.GetByIndex(0);
    
    
    ТекСтрокаДок = 4; //НачальнаяСтрока;
    
    Пока Истина Цикл
        
        Проверка = СокрЛП(""+Документ.getCellByPosition(0, ТекСтрокаДок).getString());
        Если ПустаяСтрока(Проверка) Тогда
            Прервать;
        КонецЕсли;
        
        
        //Прочитать значения ячеек табличного документа
        БанкСтрока            = СокрЛП(""+Документ.getCellByPosition(0, ТекСтрокаДок).getString());
        ВидВыплатыСтрока      = СокрЛП(""+Документ.getCellByPosition(2, ТекСтрокаДок).getString());
        ИмяВидаРасчетаСтрока  = СокрЛП(""+Документ.getCellByPosition(3, ТекСтрокаДок).getString());
        КонтрагентСтрока      = СокрЛП(""+Документ.getCellByPosition(4, ТекСтрокаДок).getString());
        НазначениеПлатежа     = СокрЛП(""+Документ.getCellByPosition(5, ТекСтрокаДок).getString());
        НомерСчетаСтрока      = СокрЛП(""+Документ.getCellByPosition(6, ТекСтрокаДок).getString());
        ПроектСтрока          = СокрЛП(""+Документ.getCellByPosition(7, ТекСтрокаДок).getString());
        СуммаСтрока           = СокрЛП(""+Документ.getCellByPosition(8, ТекСтрокаДок).getString());
        
        
        //  Найти ссылки на объекты в ИБ по наименованию
        Банк              = Справочники.Банки.НайтиПоНаименованию(БанкСтрока, Истина);                  //Банк
        
        
        Если Найти(КонтрагентСтрока,"ГУДКСУ") > 0  Тогда
            ВидВыплаты    = Перечисления.ВидыОперацийППИсходящее.ПеречислениеНалога;                    //вид операции (Перечсиление Налога )
        Иначе
            ВидВыплаты    = Перечисления.ВидыОперацийППИсходящее.ПеречислениеЗП;                        //вид операции (Перечсиление ЗП )
        КонецЕсли;                
        
        
        
        Контрагент        = Справочники.Контрагенты.НайтиПоНаименованию(КонтрагентСтрока, Истина);      //Контрагент
        НомерСчета        = НомерСчетаСтрока;                                                           // номер счета
        //НомерСчета        = СтрЗаменить(НомерСчета,Символ(32),"");
        //НомерСчета        = СтрЗаменить(НомерСчета,Символ(160),"");
        Проект            = Справочники.Проекты.НайтиПоНаименованию(ПроектСтрока, Истина);              //Проект
        
        Если ЗначениеЗаполнено(СуммаСтрока) Тогда
            
            СуммаСтрока   = СтрЗаменить(СуммаСтрока,Символ(32),"");                                     //сумма
            СуммаСтрока   = СтрЗаменить(СуммаСтрока,Символ(160),"");
            Сумма = Число(СуммаСтрока);
            
        Иначе
            Сумма = 0;
        КонецЕсли;                                                                                                                                                                                              //ИмяВидаРасчета
        
        
        
        ИмяВидаРасчета    = Строка (СтрЗаменить(ИмяВидаРасчетаСтрока,Символ(160),""));                   //Имя вида расчета                                    //ИмяВидаРасчета                                                                  
        НазначениеПлатежа = Строка (НазначениеПлатежа);        
        //Добавить строки в таблицу из которой потом создать платежки
        НоваяСтрокаПлатеж = ТаблицаПлатежей.Добавить();
        НоваяСтрокаПлатеж.Банк             =  Банк;
        НоваяСтрокаПлатеж.ВидВыплаты       =  ВидВыплаты;
        НоваяСтрокаПлатеж.ИмяВидаРасчета   =  ИмяВидаРасчета;
        НоваяСтрокаПлатеж.Контрагент       =  Контрагент;
        НоваяСтрокаПлатеж.НазначениеПлатежа=  НазначениеПлатежа;
        НоваяСтрокаПлатеж.НомерСчета       =  НомерСчета;
        НоваяСтрокаПлатеж.Проект           =  Проект;
        НоваяСтрокаПлатеж.Сумма            =  Сумма;
        
        
        
        ТекСтрокаДок = ТекСтрокаДок+1;
        
        Попытка
            НоваяСтрокаПлатеж.Записать(РежимЗаписиДокумента.Запись);                  
            // //3.Записать документ
                                      
            Сообщить("Создан документ "+НоваяСтрокаПлатеж,СтатусСообщения.Обычное);     
        Исключение                 
            Сообщить(ОписаниеОшибки());
            Продолжить;
        КонецПопытки;

        
    КонецЦикла;
    //ПланСчетовСсылка.Хозрасчетный    
    
    Возврат ТаблицаПлатежей;
    
КонецФункции

Процедура СоздатьПлатежкиВИБ(ТаблицаПлатежей)
    ТабПЛ = ТаблицаПлатежей.Количество();
    ТабТк = 0;
    Для Каждого ТекСТрокаПлатежка ИЗ ТаблицаПлатежей Цикл
        ТабТк = ТабТк+1;              
        Если ТабТк = ТабПл Тогда
            //Возврат;
            Попытка    
                Сообщить("НЕ Создан документ "+ТекСТрокаПлатежка,СтатусСообщения.Обычное);
                // //3.Записать документ
            Исключение                 
                Сообщить(ОписаниеОшибки());
                Возврат;
                //Продолжить;
            КонецПопытки;
            
        КонецЕсли;
        
        Сообщить(ТекСТрокаПлатежка);
        
        ПлатежноПоручение = Документы.ПлатежноеПоручениеИсходящее.СоздатьДокумент();
        
        //1.Здесь заполнить реквизиты ШАПКИ документа
        //Орг,дату вид операции,сумму,контрагнет , ном сгенерировать (как написоно в событии при открытии)
        ПлатежноПоручение.Организация      =  Организация ;
        ПлатежноПоручение.Дата             =  ДатаПП;
        ПлатежноПоручение.ВидОперации      =  ВидВыплаты;
        ПлатежноПоручение.СуммаДокумента   =  Сумма;
        ПлатежноПоручение.Контрагент       =  Справочники.Контрагенты.НайтиПоНаименованию(Контрагент);
        ПлатежноПоручение.СчетУчетаДенежныхСредств = СчетУчета;
        // ПлатежноПоручение.НомерПоручения   =  ОбщегоНазначения.УстановитьНомерДокумента(ПлатежноПоручение);    ????? пока
        // ПлатежноПоручение.Статус         =  ПокаНе заполняем Финансист после проверки сам проставит  //????                                            02.10.2014 19:33 пока стоп
        ПлатежноПоручение.СчетОрганизации  =  Справочники.БанковскиеСчета.НайтиПоРеквизиту("НомерСчета",НомерСчета);
        ПлатежноПоручение.Ответственный    =  ПараметрыСеанса.ТекущийПользователь;     // глТекущийПользователь          
        ПлатежноПоручение.НазначениеПлатежа=  НазначениеПлатежа;    
        //2.Заполнить реквизиты таб части ( перечисление з/п  и перечисление налога)
        
        Если        
            НЕ ВидВыплаты      = Перечисления.ВидыОперацийППИсходящее.ПеречислениеНалога  Тогда
            
            ТабЧасть                           = ПлатежноПоручение.ПеречислениеЗаработнойПлаты.Добавить();
            
            ТабЧасть.Проект                    = Справочники.Проекты.НайтиПоНаименованию(Проект);
            ТабЧасть.ВидВзаиморасчетов         = Перечисления.ВидыВзаиморасчетовСРаботниками.ЗаработнаяПлата;
            ТабЧасть.СуммаДокумента            = Сумма;    //СуммаПлатежа было - исправил
            ТабЧасть.СчетУчета                 = СчетУчетаЗП;    //на форме  661
            ТабЧасть.СтатьяДвиженияДенежныхСредств =   Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоНаименованию(СокрЛП("З/П с налогами НА и С з/п"));                 
            
        Иначе      //НАЛОГИ
            
            ТабЧастьПеречислениеНалогов                    = ПлатежноПоручение.ПеречислениеНалогов.Добавить();
            ТабЧастьПеречислениеНалогов.СтатьяЗатрат       = Справочники.СтатьиЗатрат.НайтиПоНаименованию("23 Налоги по зарплате");
            ТабЧастьПеречислениеНалогов.Сумма                = Сумма;
            ТабЧастьПеречислениеНалогов.Ответственный        = ПараметрыСеанса.ТекущийПользователь;     //глТекущийПользователь
            
            
            
            // Субконто 1 , Субконто2, Субконто3
            
            Если
                Найти(ИмяВидаРасчета,СокрЛП("ЕСВ"))>0  И Найти(ИмяВидаРасчета,СокрЛП("работники"))>0
                
                Тогда
                
                ТабЧастьПеречислениеНалогов.СубконтоДт1    = Справочники.Налоги.НайтиПоКоду("ЕСВРаботники");   //СтрокаНВ.СубконтоДт1 = Справочники.Налоги.НайтиПоКоду("ЕСВ");
                
                ТабЧастьПеречислениеНалогов.СубконтоДт2    = Справочники.СтатьиНалоговыхДеклараций.НайтиПоНаименованию("Удержание ЕСВ с сотрудников (3,6 %)");
                
                ТабЧастьПеречислениеНалогов.СубконтоДт3    = Справочники.Проекты.НайтиПоНаименованию(Проект);                       
                
            ИначеЕсли
                
                Найти(ИмяВидаРасчета,СокрЛП("ЕСВ"))>0  И Найти(ИмяВидаРасчета,СокрЛП("работники"))>0 И Найти(ИмяВидаРасчета,СокрЛП("ФОТ"))>0
                
                Тогда
                
                ТабЧастьПеречислениеНалогов.СубконтоДт1    = Справочники.Налоги.НайтиПоКоду("ЕСВФОТРаботники");   //СтрокаНВ.СубконтоДт1 = Справочники.Налоги.НайтиПоКоду("ЕСВ");
                
                ТабЧастьПеречислениеНалогов.СубконтоДт2    = Справочники.СтатьиНалоговыхДеклараций.НайтиПоНаименованию("Начисление ЕСВ работодателями (36,76 - 49,7 %)");
                
                ТабЧастьПеречислениеНалогов.СубконтоДт3    = Справочники.Проекты.НайтиПоНаименованию(Проект);     
                
                
            ИначеЕсли
                
                Найти(ИмяВидаРасчета,СокрЛП("ЕСВ")) > 0  И    Найти(ИмяВидаРасчета,СокрЛП("(больничные)"))>0
                
                Тогда
                
                ТабЧастьПеречислениеНалогов.СубконтоДт1     = Справочники.Налоги.НайтиПоКоду("ЕСВФОТБольничные");                                          
                
                ТабЧастьПеречислениеНалогов.СубконтоДт2     = Справочники.СтатьиНалоговыхДеклараций.НайтиПоНаименованию("Начисление ЕСВ по больничным листам (33,2 %)");
                
                ТабЧастьПеречислениеНалогов.СубконтоДт3     = Справочники.Проекты.НайтиПоНаименованию(Проект);
                
            ИначеЕсли
                
                Найти(ИмяВидаРасчета,СокрЛП("ЕСВ")) > 0  И    Найти(ИмяВидаРасчета,СокрЛП("(больничные)"))>0 И Найти(ИмяВидаРасчета,СокрЛП("ФОТ"))>0
                
                Тогда
                
                ТабЧастьПеречислениеНалогов.СубконтоДт1     = Справочники.Налоги.НайтиПоКоду("ЕСВФОТБольничные");                                          
                
                ТабЧастьПеречислениеНалогов.СубконтоДт2     = Справочники.СтатьиНалоговыхДеклараций.НайтиПоНаименованию("Начисление ЕСВ по больничным листам (33,2 %)");
                
                ТабЧастьПеречислениеНалогов.СубконтоДт3     = Справочники.Проекты.НайтиПоНаименованию(Проект);
                
            ИначеЕсли
                
                Найти(ИмяВидаРасчета,СокрЛП("НДФЛ")) > 0              
                
                Тогда
                
                ТабЧастьПеречислениеНалогов.СубконтоДт1     = Справочники.Налоги.НайтиПоКоду("ЕСВФОТБольничные");                                          
                
                ТабЧастьПеречислениеНалогов.СубконтоДт2     = Справочники.СтатьиНалоговыхДеклараций.НайтиПоНаименованию("Начисление ЕСВ по больничным листам (33,2 %)");
                
                ТабЧастьПеречислениеНалогов.СубконтоДт3     = Справочники.Проекты.НайтиПоНаименованию(Проект);
                
                
            КонецЕсли;
            
        КонецЕсли;            
        Попытка
            ПлатежноПоручение.Записать(РежимЗаписиДокумента.Запись);                  
            // //3.Записать документ
            
            Сообщить("Создан документ "+ТекСТрокаПлатежка,СтатусСообщения.Обычное);     
        Исключение                 
            Сообщить(ОписаниеОшибки());
            Продолжить;
        КонецПопытки;
        
    КонецЦикла;
КонецПроцедуры


Процедура СоздатьПлатежкиИзФайла(ИмяФайла) Экспорт
    
    //1.Получим таблицу платежей из файла табличного документа
    ПолучитьТаблицуПлатежей(ИмяФайла);
    
    //2.По полученной таблице создадим платежки в ИБ
    
    //СоздатьПлатежкиВИБ(ТаблицаПлатежей);       // пока так надо
КонецПроцедуры


//ПараметрыСеанса.ТекущийПользователь
4 Ser_Vlad
 
05.10.14
21:00
а это на форме-

////////////////////////////////////////////////////////////
//Обработчики событий формы

Процедура КнопкаВыполнитьНажатие(Кнопка)
    СоздатьПлатежкиИзФайла(ПутьКФайлу);
КонецПроцедуры

Процедура ИмяФайлаНачалоВыбора(Элемент, СтандартнаяОбработка)
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогОткрытияФайла.ПолноеИмяФайла = ПутьКФайлу;
    ДиалогОткрытияФайла.Фильтр = "Excel(*.ods)|*.ods|Excel(*.ods)|*.ods|Все файлы|*.*";
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Заголовок = "Выберите файл";
    
    Если ДиалогОткрытияФайла.Выбрать() Тогда
        ПутьКФайлу = ДиалогОткрытияФайла.ПолноеИмяФайла;
    КонецЕсли;
    
КонецПроцедуры
5 Ser_Vlad
 
05.10.14
21:01
что то перекрутил с параметрами(а теперь не могу добить)
6 ОбычныйЧеловек
 
05.10.14
21:02
(3) предпологалалось, что ты строчку с ошибкой выложишь...давай ошибку - как она выходит (скопируй и сюда) а не своими словами
7 Jump
 
05.10.14
21:03
(5)Да ты не стесняйся, выкладывай сюда весь код из модуля, и желательно еще и конфигурацию полностью.
8 Ser_Vlad
 
05.10.14
21:07
{ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта(250)}: Ошибка при вызове метода контекста (Записать)
         ПлатежноПоручение.Записать(РежимЗаписиДокумента.Запись);
по причине:
Ошибка при выполнении обработчика - 'ПередЗаписью'
по причине:
{Документ.ПлатежноеПоручениеИсходящее.МодульОбъекта(2494)}: Индекс находится за границами массива
         ПлатежноПоручение.Записать(РежимЗаписиДокумента.Запись);
9 Ser_Vlad
 
05.10.14
21:08
Извиняюсь за неуклюжесть, в следующий раз буду аккуратней
10 Джинн
 
05.10.14
21:16
(3) За такое убивать нужно.
11 ОбычныйЧеловек
 
05.10.14
21:17
Убери Пыпытку и тогда система выдаст тебе настоящую ошибку в не эту отписку...
12 Ser_Vlad
 
05.10.14
21:18
За такое убивать нужно. ??? силенок хватит?
13 Ser_Vlad
 
05.10.14
21:18
ща поробую
14 Джинн
 
05.10.14
21:21
(12) Ваш искрометный юмор не меняет сути - за это нужно отбирать клавиатуру и давать метлу.
15 ОбычныйЧеловек
 
05.10.14
21:23
эм... а что такое "НоваяСтрокаПлатеж" ??? ты что пытаешься строку таблицы записать как документ?
16 Ser_Vlad
 
05.10.14
21:37
да точно , вот еще , ({ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта(250)}: Ошибка при вызове метода контекста (Записать)
         ПлатежноПоручение.Записать(РежимЗаписиДокумента.Запись);
по причине:
Ошибка при выполнении обработчика - 'ПередЗаписью'
по причине:
{Документ.ПлатежноеПоручениеИсходящее.МодульОбъекта(2494)}: Индекс находится за границами массива
         ПлатежноПоручение.Записать(РежимЗаписиДокумента.Запись);
)
17 ОбычныйЧеловек
 
05.10.14
21:41
(16) Я так понимаю этот искрометный юмор не закончится ни когда? :)  Правильно ли Я понимаю, что ты хочешь, что бы я нашел 10 отличий (16) от (8) ?
18 Ser_Vlad
 
05.10.14
21:51
нет отличия искать не нужно (просто нуно сегодня доделать) а я за неделю так набегался (читаю свои же ответы и самому смешно), я не очень силен в написании кода, поэтому и обратился за помощью...
19 Ser_Vlad
 
05.10.14
22:01
все, Все баеньки???
20 ОбычныйЧеловек
 
05.10.14
22:03
(19) чем тебе помочь? переписать за тебя код? я же сказал где у тебя ошибки - но ответа так и не получил.
21 Ser_Vlad
 
05.10.14
22:08
Убрал я энту строку , не помогло (это мне один "умный человек попосоветовал" , ну я и, "Чем Чорт не шутит" попробовал), все равно Шибка повторяется
22 ОбычныйЧеловек
 
05.10.14
22:13
(21) какую строку ты убрал? записать()? какая ошибка тогда повторяется?
23 Ser_Vlad
 
05.10.14
22:20
да убрал вот это <Попытка
            НоваяСтрокаПлатеж.Записать(РежимЗаписиДокумента.Запись);                  
            // //3.Записать документ
                                      
            Сообщить("Создан документ "+НоваяСтрокаПлатеж,СтатусСообщения.Обычное);     
        Исключение                 
            Сообщить(ОписаниеОшибки());
            Продолжить;
        КонецПопытки;

>
24 Ser_Vlad
 
05.10.14
22:20
все равно индекс за границей...
25 ОбычныйЧеловек
 
05.10.14
22:24
(23) нет, ну ты точно издеваешься...

Расскажи мне,что делает вот эта строка (я с тааким удовольствием послушаю)
НоваяСтрокаПлатеж.Записать(РежимЗаписиДокумента.Запись);

???
26 Banned
 
05.10.14
22:29
(25) Ты не поверишь... Попытка записи строки....
27 Ser_Vlad
 
05.10.14
22:31
Я же сказал что все это (23) вырезано (и изначально даже не планировалось быть)
28 Ser_Vlad
 
05.10.14
22:32
и все равно "ошибки"
29 ОбычныйЧеловек
 
05.10.14
22:34
(26) поверю, но не пойму.
(27) отключи все попытки...тогда система скажет тебе ошибку по "человечески" так сказать...ты нифига их все не убрал.
30 Ser_Vlad
 
05.10.14
22:36
аа понял , ща секундочку....
31 Ser_Vlad
 
05.10.14
22:40
{ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта(141)}: Итератор для значения не определен
    Для Каждого ТекСТрокаПлатежка ИЗ ТаблицаПлатежей Цикл



Отсутствует приложение для загрузки файла
Не удалось заблокировать файл: C:\Users\Desktop\ОтчетТест.ods
32 ОбычныйЧеловек
 
05.10.14
22:52
(31) Вот интересно - тебе ошибка, что нить говорит? (мне почему-то кажется, что нет). Мой тебе совет - вызовите специалиста - все сделает за 5-10 минут.
33 Ser_Vlad
 
05.10.14
23:02
хорошо совет принят, но тогда откуда получается так что Таблица значений заполняется данными из Файла (я понял что ты имеешь ввиду "Вот интересно - тебе ошибка, что нить говорит?" ) ,Вообщем с файлом и его чтением думаю все ок если (Возврат ТаблицаПлатежей;) заполняется данными. ИЛИ нет? Давайте так если есть желание помочь, я буду благодарен, а советы раздавать (как и получать ...)  как нибудь потом
34 ОбычныйЧеловек
 
05.10.14
23:08
(33) у тебя вместо ТаблицыЗначений вернулось Неопределено - вот и  ошибка возникает. А вот почему ТаблицаЗначений не заполнилось - вот это уже вопрос - понять это ты сможешь если отладчиком по процедуре заполнения пробежишься..но суди по ошибке - система не может считать данные с файла
35 Ser_Vlad
 
05.10.14
23:11
так вот и я том же , если выставить попытки, то ТаблицыЗначений - красивенько заполнена, Воот я и зарылся на этом,
36 ОбычныйЧеловек
 
05.10.14
23:15
(35) Ты попытки надеюсь просто убрал а не закоментарил там весь код?
37 Ser_Vlad
 
05.10.14
23:26
ну да, может еще раз выложить код модуля, надеюсь никто не умрет от этого (потом темку наверное можно удалить), ?
Серьезно (меня немного подвел человек(), а так уже горит доработать, а мой опыт не позволяет сделать быстро)
AdBlock убивает бесплатный контент. 1Сергей