Как осуществляется переход на БП 3.0
Перевод с БП 2.0 на БП 3.0, как гласит официальная информация 1С, не требует ввода остатков и осуществляется почти стандартным образом. Что значит «почти»? Это значит, что даже, если конфигурация находится на поддержке, то уж совсем просто - через поиск доступных конфигураций ничего не получится. То есть, если пройти по цепочке «Конфигурация -> Поддержка - Обновить конфигурацию - Поиск доступных обновлений», то обновление на БП 3.0 найдено не будет.
И что же делать? Допустим, вы хотите обновиться на релиз 3.0.24.9 .Заходите на сайт http://users.v8.1c.ru/ и скачиваете полный дистрибутив БП 3.0.24.9. Устанавливаете его.
Важно понимать, с какого релиза БП 2.0 можно уйти на данный релиз. Это написано в файле Readme релиза 3.0.24.9 и можно почитать на сайте http://users.v8.1c.ru/ (конечно, если есть пароль) Для нашего примера написано следующее : «Для перехода на версию 3.0.24 необходимо использовать версию конфигурации "Бухгалтерия предприятия" не ниже 2.0.51» Другими словами, тот тестовый переход, который я затеял не вполне корректен. Ведь у меня исходная версия БП - 2.0.50.3. Ну да ладно. Речь пойдет не об ошибках перевода конфигурации… И да, он прошел! Причем, практически без ошибок.
Вывод первый –внимательно сопоставлять конфигурации при переходе!
Теперь заходим в конфигуратор 2.0.51 и «Конфигурация -> Поддержка -> Обновить конфигурацию -> Выбор файла обновления». Выбираем cf-файл релиза3.0.24.9
После этого, в общем-то, механизм стандартный. У меня уже после обновления при первом запуске обновленной конфигурации вылетела ошибка, связанная с изменением в БП 3.0 механизма свойств по сравнению с оным в БП 2.0 и пришлось немного похимичить, но это, как говорится, частный случай…
На 16.09.2014 ситуация немного изменилась, причем в лучшую сторону. Сегодня уже выпущен релиз Бухгалтерия предприятия, редакция 3.0, версия 3.0.35.28 и в составе дистрибутива есть «Дистрибутив обновления для перехода с редакции 2.0». Если использовать именно этот дистрибутив, то обновлять можно через автоматический поиск обновлений, что немного упрощает организацию процесса.
Что с внешними отчетами, внешними обработками и внешними печатными формами?
Если говорить односложно, но дипломатично, то не очень… Придется всё это добро переписывать под управляемое приложение, это раз, ведь на сегодняшний день конверторов нет (если я ошибаюсь, надеюсь, коллеги поправят). А второй неприятный пункт в том, что механизмы их прикручивания к конфигурации радикально изменились. Но есть и один бонус…
Где подключать внешние обработки, отчеты, формы и прочее в БП 3.0 в 1С-Предприятии?
Внешнее в БП 3.0 бывает разного вида.
Чтобы подключить оное добро необходимо в разделе «Администрирование» на панели навигации воспользоваться пунктом меню (или как его назвать в терминах управляемого приложения?) “Дополнительные отчеты и обработки”. Дальше – всё довольно прозрачно…
А можно ли подключить обработку или отчет к новому разделу, который я создал сам?
Конечно можно, но для этого необходимо внести изменения в конфигурацию. В типовой БП 3.0 оное добро накрепко связано с разделами, которые жестко прописаны в коде. Да-да, подсистемы верхнего уровня, к которым можно приделать внешний отчет или обработку прописаны в коде. Чтобы подключить отчет или обработку к новому разделу, необходимо внести изменения в следующие процедуры:
- ДополнительныеОтчетыИОбработкиПереопределяемый.ОпределитьРазделыСДополнительнымиОтчетами()
- ДополнительныеОтчетыИОбработкиПереопределяемый.ОпределитьРазделыСДополнительнымиОбработками()
Процедура ОпределитьРазделыСДополнительнымиОтчетами(Разделы) Экспорт
//Здесь добавляются стандартные подсистемы в типовой конфигурации
…
Разделы.Добавить(Метаданные.Подсистемы.Администрирование);
//Вызываем самописанную процедуру, которая добавляет новые разделы
ДобавитьРазделыБН(Разделы)
КонецПроцедуры
//
Процедура ДобавитьРазделыБН(Разделы)
Разделы.Добавить(Метаданные.Подсистемы.БН);
КонецПроцедуры
//Разделы - массив
Ниже приводится стек вызовов, который приводит к вызову процедуры ОпределитьРазделыСДополнительнымиОтчетами(Разделы)
В результате вышеописанного колдунства, появится возможность разместить отчет или обработку в этом новом разделе. В нашем случае, появилась возможность разместить «Простой внешний отчет» в разделе «Менеджеру». «Менеджеру» - синоним подсистемы с именем БН, которая и добавляется в процедуре.
Можно ли подключить отчет так, чтобы он был доступен из каждого раздела, в том числе и такого, которого нет в форме списка разделов командного интерфеса?
Мне не удалось, хотя и не исключаю такую возможность. Если у кого-то получилось, надеюсь на поделиться.
По логике вещей, можно было бы предположить, что если сняты все флажки с разделов, то мы будем иметь дело с общим отчетом или обработкой, однако, это не так. Такой безфлажковый отчет или обработка попросту не будут доступны пользователю ни в одном из разделов. Логика, безусловно, в этом есть, и критиковать ее смысла не вижу. Предлагаю относиться, как к природному явлению
А где обещанный бонус по внешним отчетам, обработкам и печатным формам?
Бонус от 1С, на мой взгляд, выглядит так. Теперь перенести базовый алгоритм печати из встроенной печатной формы во внешнюю стало ну очень просто и, главное быстро (просто было и раньше в БП 2.0). С чем это связано? Как ни удивительно, с тем, что теперь мы не должны привязывать алгоритм к реквизиту СсылкаНаОбъект, ибо реквизитов у печатных форм теперь нет. То, что нет реквизитов приводит к усложнению кода в части регистрации печатной формы в конфигурации, но зато, появляется бонус. Такая вот диалектика.
В БП 3.0 алгоритм печати попросту копируется из встроенной печатной формы и потом допиливается по эскизу заказчика.
Почему это реальный бонус. Да потому, что присабачивать алгоритм к реквизиту СсылкаНаОбъект было муторно и противно. Кто делал это для в БП 2.0, например, для Счетов-Фактур, тот знает… Пока оно там переделаешь… Теперь же нужно просто владеть копипастом.
Бонусов для внешних отчетов и обработок пока не усмотрел. Если кто-то из читателей заметил, буду рад услышать.
Как создать дополнительную (внешнюю) печатную форму
Распишу механизм на примере внешней печатной формы “Счет на оплату покупателям” для документа СчетНаОплатуПокупателю.
Обозначу главные ключевые моменты.
- Старые печатные формы под БП 2.0, которые работали в обычном приложении не подойдут, все интерфейсные вещи гарантированно придется переписывать. Алгоритмы можно переносить, но, скорее всего их так же придется адаптировать.
- В печатных формах для БП 3.0 (релиз 3.0.24.9) отсутствует реквизит СсылкаНаОбъект, по которому БП 2.0 опрееляла, к какому объекту относится внешняя печатная форма. Регистрация печатной формы через механизм макетов, как в БП 2.0 (в макете задавалось полное имя объекта, для которого производилась регистрация) так же отсутствует.
- Чтобы зарегистрировать дополнительную печатную форму необходимо в модуле обработки прописать две стандартных функции и одну процедуру:
- Функция СведенияОВнешнейОбработке() Экспорт
- Функция ПолучитьТаблицуКоманд()
- Процедура ДобавитьКоманду
Разберу эти функции и процедуры подробно.
Функция СведенияОВнешнейОбработке() Экспорт
// Структура, в которой сохраняются параметры регистрации внешней печатной формы
ПараметрыРегистрации = Новый Структура;
// МассивНазначений определяет, к какому объекту (например, к какому документу) относится печатная форма
МассивНазначений = Новый Массив;
// Первый параметр, который мы должны указать - это какой вид обработки системе должна зарегистрировать.
// Допустимые типы:
//ДополнительнаяОбработка,
//ДополнительныйОтчет,
//ЗаполнениеОбъекта,
//Отчет,
//ПечатнаяФорма,
//СозданиеСвязанныхОбъектов
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
// Как мы помним, у нас нет реквизита СсылкаНаобъект.
// Вместо него используется массив МассивНазначений
// Можно задать имя в таком виде: Документ.* - в этом случае обработка будет подключена ко всем //документам в системе, которые поддерживают механизм ВПФ
МассивНазначений .Добавить("Документ.СчетНаОплатуПокупателю");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений );
// Теперь зададим имя, под которым ВПФ будет зарегистрирована в справочнике внешних обработок
//Речь идет именно о справочнике обработок. Пользователь, нажав на кнопку «Печать» в документе увидит иное…
ПараметрыРегистрации.Вставить("Наименование", "Счет на оплату покупателю");
// Зададим использование безопасного режима, чтобы было всё безопасно и никто ничего не боялся.
// (см. метод УстановитьБезопасныйРежим)
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
// Следующие два параметра - прописывают информацию к обработке
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("Информация", "Дополнительная печатная форма ""Счет на оплату покупателю"" к документу СчетНаОплатуПокупателю");
// Создадим таблицу команд
ТаблицаКоманд = ПолучитьТаблицуКоманд();
// Добавим команду в таблицу команд
ДобавитьКоманду(ТаблицаКоманд, "Счет на оплату(внеш)", "СчетЗаказВнеш1", "ВызовСерверногоМетода", Истина, "ПечатьMXL");
//формат вызова:ТаблицаКоманд, Представление , Идентификатор, Использование, //ПоказыватьОповещение = Ложь, Модификатор = ""
//Для нашего примера:
//Представление = "Счет на оплату(внеш)"
//Нажав на кнопку «Печать» пользователь как раз и увидит "Счет на оплату(внеш)"
//Обратите внимание на идентификатор.
//В нашем примере, Идентификатор = “СчетЗаказВнеш1”
//На него будет еще ссылка в другой процедуре и это очень важно. Если указать не тот идентификатор в этой второй процедуре, то всё перекосит. Кроме того, этот идентификатор можно будет использовать для того, чтобы переопределить стандартную, вшитую в конфигурацию БП 3.0 печатную форму. Но об этом колдунстве попозже.
// Таблица команд сохраняется в параметры регистрации обработки
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
// Теперь вернем системе наши параметры
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
// Создание новой ТЗ
Команды = Новый ТаблицаЗначений;
// Представление – поле, которое говорит, что увидит пользователь, нажав на кнопку «Печать»
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
// Имя нашего макета, что бы могли отличить вызванную команду в обработке печати
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
// Определяем способ вызова команды обработки
// Возможные варианты:
// - ОткрытиеФормы - в этом случае в колонке “Идентификатор” должно быть указано имя формы, которое должна будет открыть система
// - ВызовКлиентскогоМетода - вызвать клиентскую экспортную процедуру из модуля формы обработки
// - ВызовСерверногоМетода - вызвать серверную экспортную процедуру из модуля объекта обработки
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
// Следующий параметр указывает, необходимо ли показывать оповещение при начале и завершению работы обработки. Не имеет смысла при открытии формы
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
// Для печатной формы должен содержать строку ПечатьMXL
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
// Добавляем команду в таблицу команд по переданному описанию.
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
//А вот теперь, тот самый бонус….
//Просто копируем алгоритм печати из модуля менеджера документа СчетНаОплатуПочупателю. Единственное отличие состоит в том, что вместо общего макета, использую макет из данной печатной формы.
//---------------------------------------------------------------------------------------------
//Фактическая часть, отвечающая за подбор данных для печати и их выводе на печать
//Ниже-просто скопированные процедуры из менеджера документа
//Макет берем из ВПФ
// //Макет = УправлениеПечатью.ПолучитьМакет("ОбщийМакет.ПФ_MXL_М11");
// Макет = ПолучитьМакет("ПФ_MXL_М11");
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Устанавливаем признак доступности печати покомплектно.
ПараметрыВывода.ДоступнаПечатьПоКомплектно = Истина;
// Проверяем, нужно ли для макета ПКО формировать табличный документ.
// Формируем табличный документ и добавляем его в коллекцию печатных форм.
//УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм,"М11","М11 (Требовние-накладная)",ПечатьМ11(МассивОбъектов, ОбъектыПечати));
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "СчетЗаказВнеш1", "Счет на оплату", ПечатьДокумента(МассивОбъектов, ОбъектыПечати));
//Обратите внимание, что используется именно тот идентификатор, который мы задали в функции СведенияОВнешнейОбработке
КонецПроцедуры
Что сделать, чтобы внешнюю печатную форму можно было использовать в режиме групповой печати
Во-первых, о чем идет речь? В БП 3.0 нет сервисной обработки «Групповая печать справочников и документов». Зато в полный рост работает механизм множественного выделения объектов.
Пусть у нас открыт список документов «Счет на оплату покупателю». Тогда, чтобы выделить все те документы, которые имеются в этом списке, можно нажать Ctrl A (в частности, можно отобрать документы в заданном диапазоне и нажать Ctrl A и будут выделены только они, а те, что вне диапазона останутся без выделения). Можно, удерживая Ctrl, щелкать мышкой по строкам, а можно, удерживая Shift, нажимать «Стрелку вниз».
В результате, получится примерно такая картина:
Если нажать на кнопку «Печать» и выбрать, скажем, «Счет на оплату(внеш)», то хотелось бы получить счета по всем выделенным объектам.
Для достижения такого результата необходимо в алгоритме печати учесть это множественное выделение. Для этого нужно понимать, что ссылки на выделенные объекты передаются в процедуру Печать() в массиве МассивОбъектов.
В алгоритме нужно учесть отбор источников данных с учетом этой особенности, при выводе печатной формы необходимо учитывать, что в общем случае, это печатная форма не одного объектов, а нескольких.
В типовых встроенных печатных формах (которые я смотрел) этот вопрос решен. Их можно взять за образец при разработке своей дополнительной печатной формы.
Как устроен механизм печати встроенных печатных форм
В качестве объекта исследований возьмем документ СчетНаОплатуПокупателю. О чем речь? В форме списка документа и в форме документа отображается такая кнопка со стрелочкой «Печать», нажав на которую, получаем список печатных форм документа.
Попытаемся ответить на несколько вопросов:
Печать из карточки документа и из списка документов позволяет вывести один и тот же перечень видов печатных форм или нет?
Да, это один и тот же перечень.
Где программно задается перечень видов печатных форм и как?
В модуле менеджера документа есть процедура ДобавитьКомандыПечати(КомандыПечати). Именно в ней и формируется данный перечень печатных форм.
Обратите внимание на идентификатор. Помните, я обещал рассказать, как подменить стандартную печатную форму. Так вот, если идентификатор внешней печатной формы совпадет с идентификатором встроенной печатной формы, то будет печататься внешняя вместо встроенной. Колдунство тестировалось на релизе БП 3.0.24.9. и как будет после или было до сказать не могу. Возможно, что и так же…
- То окно, в которое выводится подготовленная печатная форма это что за объект конфигурации и каковы его особенности?
Объект, который позволяет лицезреть печатную форму это: ОбщаяФорма.ПечатьДокументов
Справа снизу расположено больо-шо-ое поле табличного документа с именем ПечатнаяФормаОбразец. И при беглом осмотре внешней печатной формы можно подумать, что именно в него и выводится печатная форма. Но это не так, всё на много интереснее.
Реквизиты, куда выводится печатная форма создаются динамически в процедуре Форма.ПечатьДокументов.МодульФормы. СоздатьРеквизитыИЭлементыФормыДляПечатныхФорм(КоллекцияПечатныхФорм). Эти реквизиты добавляются в таблицу значений «НастройкиПечатныхФорм», которая выведена в форму в конфигураторе, но сокрыта от пользовательских глаз. Именно эту таблицу значений мы и видим слева в окне формы в конфигураторе.
Если, например, посмотреть в отладчике, какой будет создан реквизит для внешней печатной формы документа СчетНаОблатуПокупателю (файл печатной формы прилагается к данной статье), то обнаружим, что имя реквизита, который добавляется в НастройкиПечатныхФорм будет «ПечатнаяФорма1». Реквизит будет размещен на форме динамически на странице с именем «СтраницаПечатнаяФорма1». Кому интересно в деталях, может покопаться с отладчиком в процедуре СоздатьРеквизитыИЭлементыФормыДляПечатныхФорм
Обратиться к полю табличного документа можно так:
ИмяРеквизита = ‘ПечатнаяФорма1’;
…ЭтаФорма[ИмяРеквизита]…
Разумеется, это обращение должно происходить уже после того, как реквизит будет создан. Упомяну, что процедура СоздатьРеквизитыИЭлементыФормыДляПечатныхФорм вызывается из процедуры ПриСозданииНаСервере.
Зачем сие знание может понадобится? Ну, допустим, если вы захотите сделать какую-то свою рассылку документов по e-mail, не влезая и не меняя типовые механизмы, а просто по отдельной кнопочке… Или вам вдруг понадобилось сделать что-либо протевоестественное, скажем, с шапкой сформированной печатной формы ну, допустим, заменить слово «Номенклатура» на «Наш товар», а макет менять не хотите, ибо заказчик может потом и передумать J … В общем, может пригодиться.
Что знает печатная форма о данных объекта-владельца и как она это знает?
В модуле формы ОбщаяФорма.ПечатьДокументов доступны параметры формы, что не удивительно.В процедуре ПриСозданииНаСервере() доступно, в частности: Параметры.ПараметрыИсточника.ОбъектыНазначения
Это массив строк. Параметры.ПараметрыИсточника.ОбъектыНазначения[0].Ссылка – даст ссылку на первый из объектов, для которого производится печать. Из этой ссылкми можно, в частности, взять контрагента, а из контрагента, скажем, адрес для отправки e-mail.
Как подменить стандартную печатную форму внешней
Если идентификатор внешней печатной формы совпадет с идентификатором встроенной печатной формы, то будет печататься внешняя вместо встроенной.
Механизм прав и ролей в БП 3.0.24.9
В БП 3.0.24.9 механизм прав и ролей на уровне приложения выглядит следующим образом. Основной правообразующей единицей для пользователя является профиль групп доступа. Пользователю добавляют профили. А профиль, в свою очередь состоит из ролей, определенных на уровне конфигурации. Профиль как бы «собирается» из различных ролей, а каждая из ролей определяется в конфигураторе.
В БП 3.0.24.9 имеются предопределенные профили.
Но можно создать и собственный профиль. В моем случае это профиль «менеджер».
В моем профиле только одна роль. Эта роль полностью определяет возможность работы менеджера. Это новая не типовая роль, созданная мной. Почему только одна и почему новая, а не использована суперпозиция стандартных ролей. Например, можно было бы создать роль с каким-то специфическим доступом к тем или иным объектам конфигурации, включить ее в профиль «Менеджер», а пользовател. Назначить два профиля – «Менеджер» и «Только просмотр».
В моем случае камнем преткновения стала панель разделов. Мне нужно оставить в ней только «Рабочий стол» и новый раздел «Менеджеру», а всё остальное убрать. Назначение стандартных ролей через какой-либо профиль гарантированно добавляет в панель разделов «стандарнтые» разделы, которые мне не нужны.
Что бы было понятно, какую картинку должен получить мой менеджер, приведу скриншот, ради которого я и создал роль. Я бы убрал еще и «Рабочий стол», но, увы рабочий стол убрать нельзя.
Добавление профиля группы доступа осуществляется через Администрирование --> Профили групп доступа.
Пользователю назначается профиль так: Администрирование --> Пользователи -->[Выбрать пользователя] --> Права доступа
Не могу добавить новую роль в профиль, что делать?
Была такая беда. Создал я новую роль и хотел добавить ее в профиль группы доступа, но БП 3.0.24.9 обругала меня вот так, когда я в окне профиля группы доступа нажал на кнопку «Записать и закрыть».
Оказывается, в БП 3.0.24.9 есть справочник «Идентификатор объектов метаданных», в котором присутствует описание метаданных конфигрурации. В ряде ситуаций конфигурация требует, чтобы новые объекты присутствовали в этом справочнике. Зачем? Вопрос опять же риторический. А потому что!
Справочник «Идентификатор объектов метаданных» выглядит примерно так.
И в этом справочнике должна быть наша злополучная роль! Дабы ее добавить можно воспользоваться инструкцией, которая приведена в окне-ругательстве. Во-первых, можно увеличить номер версии конфигурации, чтобы при запуске обновились данные. Я так не делал, так что не скажу, сколь прекрасен этот метод. А можно, как я запустить некую обработку.Остается понять, что это за обработка и где ее взять.
А называется она «ИнструментыРазработчикаОбновлениеВспомогательныхДанных.epf» (не верьте окну-ругательству), а берется она из Библиотеки Стандартных Подсистем. Ставите БСП, сохраняете обработку, как внешнюю и запускаете. В результате увидите такое вот прекрасное окно:
Я выбрал «Обновлять всё» и нажал на «Обновить». После этого стало возможно добавить мою новую роль в профиль доступа.
Где взять БСП.
Скачать последнюю версию с http://users.v8.1c.ru. Я устанавливал БСП 2.1.6.5, хотя уже есть и свежее.
Где взять описание БСП
http://its.1c.ru/db/bspdoc#browse:13:-1:50001
THE END