Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Волшебство программирования на 1С:Предприятие 7.7 и 8.0



Волшебство программирования на 1С:Предприятие 7.7 и 8.0

Компания "ПиБи" приглашает на работу в Москве на должности экспертов и ведущих экспертов отдела внедрений 1С.

Собеседования проводятся 7 дней в неделю с 9.00 до 21.00.

Условия работы:
* Абсолютно БЕЛАЯ зарплата - 40'000-80'0000 рублей "на руки"
* Отпуска
* Больничные
* Компенсация проезда
* Мобильный телефон с оплаченной связью
* Ноутбук
* Постоянное повышение квалификации за счет компании
* Помощь с арендой жилья
* Корпоративные мероприятия
* Офис м. Савеловская
* Реальные возможности административного роста
* В зависимости от текущих задач работа в офисе или у клиентов (не более 1-2 клиентов в день)

Требования:
* Опыт программирования 1С 7.7 или 8.0 от 2-х лет.
* Знания предметных отраслей. Особенно приветствуется знание МСФО и финансового учета.
* Желательно наличие сертификатов "1С:Специалист" и "1С:Профессионал"
* Умение общаться
* Стремление к профессиональному и/или административному росту

Компания "ПиБи"
mailto:lider@pb.ru
URL: www.pb.ru
тел. (495) 105-51-59 (многоканальный)

v8: Программное добавление полей в построителе отчета

Программное выполнение интерактивных действия табличного поля, отображающего доступные поля. Это действия "Добавить в условия", "Добавить в поля", "Добавить в порядок", "Добавить в строки", "Добавить в колонки".Автор статьи: PR | Редакторы:
Последняя редакция №3 от 07.02.07 | История
URL: http://kb.mista.ru/article.php?id=469

Ключевые слова: Добавление, поле, построитель, отчет, интерактивное, действие, доступное, измерение, строки, колонки, отбор, порядок.


Если, скажем, для отчета на базе построителя отчета на форму поместить табличное поле, в котором в качестве данных указать доступные поля построителя отчета, то можно обнаружить, что у табличного поля появляется контекстное меню со следующим списком элементов: "Добавить в условия", "Добавить в поля", "Добавить в порядок", "Добавить в строки", "Добавить в колонки".

Это конечно очень хорошо.
Например можно запрограммировать обработку событий "Drag&Drop" и таскать поля в условия, выбранные поля и т. д.
Плохо другое, то, что программно эти действия выполнить нельзя.
Точнее можно, но не одной строкой, типа, например "ДобавитьВПорядок("Код")".

Поэтому приходится делать все самому.

Приведу небольшой пример с Drag&Drop.
В примере будет рассмотрено, как перетаскивать поля из доступных в измерения строки.
При желании по аналогии можно реализовать таким же способом перетаскивание полей и в условия, выбранные поля, порядок и измерения колонки.

Сначала на форму отчета с использованием построителя отчета добавляем табличные поля, отображающие доступные поля и измерения строки.

У обоих табличных полей включаем галочки "Разрешить начало перетаскивания" и "Разрешить перетаскивание".

Для табличного поля, отображающего доступные поля, создаем обработчик события "Выбор":
Процедура ДоступныеПоляВыбор(Элемент, ВыбраннаяСтрока, 
                             Колонка, СтандартнаяОбработка) Экспорт
    
    ИмяПоля = ВыбраннаяСтрока.Имя;
    
    Пока (ПостроительОтчета.ИзмеренияСтроки.Найти(ИмяПоля) <> Неопределено)
        ИЛИ (ПостроительОтчета.ИзмеренияКолонки.Найти(ИмяПоля) <> Неопределено) Цикл

        ИмяПоля = ИмяПоля + "1";
    КонецЦикла;
    
    Поле = ПостроительОтчета.ИзмеренияСтроки.Добавить(ВыбраннаяСтрока.ПутьКДанным, ИмяПоля, ТипИзмеренияПостроителяОтчета.Элементы);
    
    ЭтаФорма.ЭлементыФормы.ИзмеренияСтроки.ТекущаяСтрока = Поле;
    
    СтандартнаяОбработка = Ложь;
    
КонецПроцедуры


Для табличного поля, отображающего измерения строки, создаем обработчики событий "Проверка перетаскивания", "Окончание перетаскивания" и "Перетаскивание":
Процедура ИзмеренияСтрокиПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Колонка)
    
    Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("ПолеНастройки") Тогда

        СтандартнаяОбработка = Ложь;
    ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("ИзмерениеПостроителяОтчета") Тогда
    
        Если ПостроительОтчета.ИзмеренияСтроки.Найти(ПараметрыПеретаскивания.Значение.Имя) = Неопределено Тогда

            СтандартнаяОбработка = Ложь;
        ИначеЕсли ПараметрыПеретаскивания.Значение <> Строка Тогда
        
            ИндексЗначенияПеретаскивания = ПостроительОтчета.ИзмеренияСтроки.Индекс(ПараметрыПеретаскивания.Значение);
            
            Если Строка <> Неопределено Тогда

                
                ИндексСтроки = ПостроительОтчета.ИзмеренияСтроки.Индекс(Строка);
                
                Если ИндексЗначенияПеретаскивания > ИндексСтроки Тогда
                    СтандартнаяОбработка = Ложь;
                ИначеЕсли (ИндексЗначенияПеретаскивания + 1) < ИндексСтроки Тогда

                    СтандартнаяОбработка = Ложь;
                КонецЕсли;
                
            ИначеЕсли ИндексЗначенияПеретаскивания < (ПостроительОтчета.ИзмеренияСтроки.Количество() - 1) Тогда
                СтандартнаяОбработка = Ложь;
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЕсли;
    

КонецПроцедуры

Процедура ИзмеренияСтрокиОкончаниеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
    
    Если ПараметрыПеретаскивания.Действие <> ДействиеПеретаскивания.Отмена Тогда
        ПостроительОтчета.ИзмеренияСтроки.Удалить(ПараметрыПеретаскивания.Значение);
    КонецЕсли;
    

КонецПроцедуры

Процедура ИзмеренияСтрокиПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Колонка)
    
    Если ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена Тогда
        Возврат;
    КонецЕсли;
    
    Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("ИзмерениеПостроителяОтчета")
        И (ПостроительОтчета.ИзмеренияСтроки.Индекс(ПараметрыПеретаскивания.Значение) <> -1) Тогда

        
        Если Строка = Неопределено Тогда
            Смещение = ПостроительОтчета.ИзмеренияСтроки.Количество() - 
                                   ПостроительОтчета.ИзмеренияСтроки.Индекс(ПараметрыПеретаскивания.Значение);
        Иначе
            
            Смещение = ПостроительОтчета.ИзмеренияСтроки.Индекс(Строка) - 
                                 ПостроительОтчета.ИзмеренияСтроки.Индекс(ПараметрыПеретаскивания.Значение);
            
            Если Смещение > 0 Тогда

                Смещение = Смещение - 1;
            КонецЕсли;
            
        КонецЕсли;
        
        ПостроительОтчета.ИзмеренияСтроки.Сдвинуть(ПараметрыПеретаскивания.Значение, Смещение);
        
        ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
        
    Иначе
        
        Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("ИзмерениеПостроителяОтчета") Тогда

            
            ИмяПоля = ПараметрыПеретаскивания.Значение.Имя;
            
            Пока (ПостроительОтчета.ИзмеренияСтроки.Найти(ИмяПоля) <> Неопределено)
                ИЛИ (ПостроительОтчета.ИзмеренияКолонки.Найти(ИмяПоля) <> Неопределено) Цикл
                ИмяПоля = ИмяПоля + "1";
            КонецЦикла;
            
            Если Строка = Неопределено Тогда

                Поле = ПостроительОтчета.ИзмеренияСтроки.Добавить(ПараметрыПеретаскивания.Значение.ПутьКДанным, ИмяПоля, 
                                   ПараметрыПеретаскивания.Значение.ТипИзмерения, ПараметрыПеретаскивания.Значение.Макет, 
                                   ПараметрыПеретаскивания.Значение.МакетИерархии);
            Иначе
                Поле = ПостроительОтчета.ИзмеренияСтроки.Вставить(ПараметрыПеретаскивания.Значение.ПутьКДанным, ИмяПоля, 
                                   ПараметрыПеретаскивания.Значение.ТипИзмерения, ПараметрыПеретаскивания.Значение.Макет, 
                                   ПараметрыПеретаскивания.Значение.МакетИерархии, 
                                   ПостроительОтчета.ИзмеренияСтроки.Индекс(Строка));
            КонецЕсли;
            
        ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("ПолеНастройки") Тогда

            
            ИмяПоля = ПараметрыПеретаскивания.Значение.Имя;
            
            Пока (ПостроительОтчета.ИзмеренияСтроки.Найти(ИмяПоля) <> Неопределено)
                ИЛИ (ПостроительОтчета.ИзмеренияКолонки.Найти(ИмяПоля) <> Неопределено) Цикл
                ИмяПоля = ИмяПоля + "1";
            КонецЦикла;
            
            Если Строка = Неопределено Тогда

                Поле = ПостроительОтчета.ИзмеренияСтроки.Добавить(ПараметрыПеретаскивания.Значение.ПутьКДанным, 
                                 ИмяПоля, ТипИзмеренияПостроителяОтчета.Элементы);
            Иначе
                Поле = ПостроительОтчета.ИзмеренияСтроки.Вставить(ПараметрыПеретаскивания.Значение.ПутьКДанным, 
                                 ИмяПоля, ТипИзмеренияПостроителяОтчета.Элементы, , , ПостроительОтчета.ИзмеренияСтроки.Индекс(Строка));
            КонецЕсли;
            
        КонецЕсли;
        
        Элемент.ТекущаяСтрока = Поле;
        
    КонецЕсли;
    
КонецПроцедуры


После выполненных манипуляций табличные поля можно будет таскать из доступных полей в измерения строки.

Официальный сайт рассылки - www.mista.ru
Волшебный форум -
www.forum.mista.ru
Книга знаний - www.kb.mista.ru

С уважением,
Станислав Митичкин (Волшебник)
stasmit@mail.ru



В избранное