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

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


"Менеджер обмена данными" - для партнеров 1С бесплатно.

Усилиями фирмы "1С" и ее партнеров за 7 лет программа "1С:Предприятие 7.7" стала стандартом на рынке учетных систем. Порядка миллиона пользователей наработали на этой платформе уникальные решения и терабайты данных. Многие из них пока не готовы отказаться от сделанных вложений, но хотят пользоваться технологическими преимуществами современных платформ. Одним из таких преимуществ является наличие доступного универсального механизма обмена данными.

Задача внедренца найти оптимальное решение и предложить его клиентам.

Требованиям по

  • ценовой доступности;
  • независимости от структур обменивающих баз;
  • наличию механизмов фильтрации и преобразования данных;
  • присутствию удобных интерфейсов для быстрой настройки нюансов обмена;
соответствует разработанный 7 лет назад компанией "ПиБи" "Менеджер обмена данными" для "1С:Предприятия 7.7". Около 20'000 пользователей и более 400 партнеров имеют успешный опыт внедрения этого продукта.

Сегодня компания "ПиБи" предоставляет уникальную возможность и остальным партнерам-франчайзи "1С" познакомиться с "Менеджером обмена данными", продемонстрировать его своим клиентам и испытать в реальных ситуациях, используя все преимущества официальной версии (подробная документация и бесплатная техническая поддержка). В комплект специальной бесплатной NFR-версии для партнеров помимо дистрибутива и двух руководств (в печатном и электронном виде) входит лицензия на использование "Менеджера обмена данными" с двумя базами данных.

NFR-версию можно заказать на сайте "ПиБи". Региональным партнерам компания "ПиБи" обеспечивает бесплатную доставку коробок.


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

v8: Универсальные интерактивные команды для ссылочных объектов
Автор: TormozIT

Иногда так хочется добавить какую-нибудь универсальную команду для всех документов или справочников. Но мысль об увеличении объема работы при обновлении каждый раз останавливает.

Идея проста! Используем ввод на основании.


Разложим все по полочкам. В типовых конфигурациях 90% форм списков и форм объектов ссылочного типа на командной панели в подменю "Ввод на основании" содержат действие "(Ввести на основании)". Это действие в режиме предприятия замещается списком синонимов типов объектов, которые можно вводить на основании текущего объекта. Это обстоятельство предоставляет нам отличную возможность замечательного нецелевого использования этого списка.

Бонус
При обновлении почти никаких забот. Только в случае добавления новых объектов придется доставить для них галочки во вводе на основании.

Для ввода на основании доступны следующие ссылочные типы объектов (в порядке их расположения в списке ввода на основании):
  • планы обмена
  • справочники
  • документы
  • планы видов характеристик
  • планы счетов
  • планы видов расчета
  • бизнес-процессы
  • задачи

Таким образом, только для этих типов можно будет применять наши команды. Но этого уже вполне достаточно.
Принципиальной разницы нет, какой тип выбрать для объектов-команд.
Я выбрал планы обмена, т.к. они идут первыми в списке, который формирует платформы для ввода на основании. К тому же планы обмена - в общем самый маленький раздел из перечисленных, что добавляет дополнительные удобства. Чтобы легко отличать объекты-команды от обычных объектов конфигурации рекомендую начинать их имена с префиска, скажем "кмд".
   
Для наглядности возьмем и создадим 2 универсальные команды "Запомнить" и "Использовать". Первая будет сохранять ссылку. Вторая будет ее использовать в форме.

1. Команда "Запомнить".


Итак, создаем новый план обмена. Даем ему имя "кмдЗапомнить", синоним "Запомнить".
Открыв закладку ввода на основании, мы неприятно удивимся, что средств для групповой установки флажков в этом диалоге нет. Здесь нужно каждый флажок установить персонально. Однако есть альтернатива (спасибо KAO111) - в конфигураторе есть возможность сразу выбрать группу объектов для ввода на основании. Для этого необходимо открыть дополнительные свойства объекта конфигурации (Alt+Shift+Enter), перейти на закладку "Ввод на основании" и снять флажок "Только выбранные".
Теперь создаем основную форму объекта (узла обмена). Она будет нужна только для обработки события ПередОткрытием, так что избавляемся от излишеств. Закрываем конструктор. Открываем модуль формы. Ссылка на основание доступна здесь через свойство ПараметрОснование расширения формы. Таким образом, весь функционал можно разместить здесь и не использовать обработку заполнения.
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    
    // Чтобы форма не открылась
    Отказ = Истина;

    // Может, ссылки еще не существует? надо сначала записать объект
    Если ЗначениеНеЗаполнено(ПараметрОснование) Тогда
        Предупреждение("Сначала запишите объект!");
        Возврат;
    КонецЕсли;

    // Тут удобно передать основание в какой-нибудь отчет или обработку.
    // Но в данном случае мы запоминаем его.
    СохранитьЗначение("БуферОбмена.Ссылка", ПараметрОснование);

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

2. Команда "Использовать".


Аналогично создаем команду "Использовать".
Хотелось бы получить доступ к той форме (в случае формы объекта) или элементу формы (в случае формы списка), откуда вызвали команду. В модуле формы нам предоставляется такая возможность через использование свойства ВладелецФормы.
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)

    // Чтобы форма не открылась
    Отказ = Истина;

    // Может, ссылки еще не существует? надо сначала записать объект
    Если ЗначениеНеЗаполнено(ПараметрОснование) Тогда
        Предупреждение("Сначала запишите объект!");
        Возврат;
    КонецЕсли;

    лСсылка = ВосстановитьЗначение("БуферОбмена.Ссылка");
    <Текст программы с использованием ВладелецФормы, ПараметрОснование и лСсылка>

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


Как поступить с теми формами, в которых нет подменю ввода на основании?


В случае, если флажок "Автозаполнение" у нужной командной панели формы отключен и разработчики формы не добавили туда подменю ввода на основании, вы не увидите нужного вам списка в режиме предприятия. В этом случае можно добавить его туда вручную, а можно использовать более элегантный метод, программно добавляющий необходимое подменю в обработчике ПриОткрытии. Так как действие "(Ввести на основании)" является предопределенным, программно его создать, к сожалению, нельзя! Но можно обойти это ограничение. Создадим в одной из форм наших объектов-команд командную панель и добавим туда ввод на основании в режиме конфигуратора. Эта форма все равно никогда не открывается, так что используем ее как шаблон. Перед открытием нужной формы будем проверять наличие в заданной командной панели необходимого подменю, и, если его там не обнаружим, то скопируем его из нашей формы-шаблона.

Пример реализации:

Добавляем в форме объекта "кмдЗапомнить" командную панель "ДействияФормы".
Создаем там подменю с типом "Ввести на основании".
В глобальном модуле размещаем функцию
// Добавляет, если отсутствует, команду ввода на основании в командную панель формы.
//
// Параметры:
//  пФорма       – Форма - где расположена командная панель, в которую добавляем.
//
Процедура ЛксДобавитьВводНаОснованииВКоманднуюПанель(пФорма)

    МассивИменКомандныхПанелей = Новый Массив;
    МассивИменКомандныхПанелей.Добавить("ДействияФормы");
    МассивИменКомандныхПанелей.Добавить("КоманднаяПанельФормы");
    МассивИменКомандныхПанелей.Добавить("ОсновныеДействияФормы");
    Для Каждого ИмяКоманднойПанели Из МассивИменКомандныхПанелей Цикл
        КоманднаяПанель = пФорма.ЭлементыФормы.Найти(ИмяКоманднойПанели);
        Если КоманднаяПанель <> Неопределено Тогда 
            Прервать;
        КонецЕсли;
    КонецЦикла;
    Если КоманднаяПанель <> Неопределено Тогда 
        МакетФормы = ПланыОбмена.кмдЗапомнитьВБуфере.ПолучитьФормуНовогоУзла();
        КоманднаяПанельМакета = МакетФормы.ЭлементыФормы.ДействияФормы;
        КнопкаМакета = КоманднаяПанельМакета.Кнопки[0];
        Если НЕ КоманднаяПанель.Автозаполнение Тогда
            Кнопки = КоманднаяПанель.Кнопки;
            Если КоманднаяПанель.ВыравниваниеКнопок = ВыравниваниеКнопокКоманднойПанели.Право Тогда 
                Индекс = 0;
            Иначе
                Индекс = Кнопки.Количество();
            КонецЕсли;
            Для Каждого КнопкаФормы Из Кнопки Цикл
                Если      КнопкаФормы.Текст = "На основании" Тогда
                    Индекс = Неопределено;
                    Прервать;
                //ИначеЕсли КнопкаФормы.Текст = "Скопировать"  Тогда 
                //    Индекс = пКоманднаяПанель.Кнопки.Индекс(КнопкаФормы) + 1;
                КонецЕсли;
            КонецЦикла;
            Если Индекс <> Неопределено Тогда 
                КнопкаВводаНаОсновании = Кнопки.Вставить(Индекс, "ПодменюНаОсновании" );
                ЗаполнитьЗначенияСвойств(КнопкаВводаНаОсновании, КнопкаМакета, , "Имя, Действие, ПорядокКнопок");
                КнопкаВводаНаОсновании.Кнопки.Добавить("Действие", ТипКнопкиКоманднойПанели.Действие, ,
                                                                         КнопкаМакета.Кнопки[0].Действие);
                КнопкаВводаНаОсновании.ПорядокКнопок = ПорядокКнопокКоманднойПанели.Возр;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры // ЛксДобавитьВводНаОснованииВКоманднуюПанель()

Теперь в теле обработчика ПриОткрытии любой формы можно вызывать эту процедуру. При отсутствии подменю ввода на основании она будет добавлять его в логический (в зависимости от типа выравнивания) конец найденной командной панели, список которых задан в массиве МассивИменКомандныхПанелей в порядке убывания приоритета. Алгоритм конечно предусматривает далеко не все возможные варианты, но на типовых отрабатывает почти всегда.

Итоги.


Полезность описанного метода создания универсальных интерактивных команд трудно переоценить. Пользуюсь этими командами каждый рабочий день! В платформах 8.0 и 8.1 на текущий момент отсутствует какая либо альтернатива этому методу.
Можно развить идею и сделать только один объект-команду. В него поместить все необходимые функции. А пользователю при активации этой команды предоставлять возможность выбора конкретной функции. Получится что то вроде универсального контекстного меню ссылочных объектов.
 

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

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



В избранное