В любой конфигурации 1С 7.7 изменения и доработки, сделанные в отчетах, обработках, требуют для сохранения монопольный режим. Для этого требуется «выгонять» всех пользователей из базы, или же программисту приходится сохранение изменений переносить на внерабочее время. А если эти изменения нужны пользователям срочно? Предлагаемое решение позволяет преодолеть это неудобство, как для программиста, так и для пользователей.
Релиз платформы 1С 7.7 не имеет значения, как и релиз и вид конфигурации, задействована внешняя компонента FormEx v. 2.0.5.124, чтобы получить полный тип вызываемого отчета, обработки.
Идея, лежащая в основе решения. Отчет или обработка, подлежащие доработке, сохраняются как внешние, и для вызова их, внешних, производится с использованием коммутационного файла, как некоего посредника, в котором указывается, где будет расположен внешний вариант того или иного отчета, обработки.
Суть решения состоит в формате коммутационного файла и в функции, расположенной в Глобальном модуле конфигурации, которая, после прочтения этого коммутационного файла, возвращает значения:
1 - если внешний отчет, обработка находится в ..\EXTFORMS базы;
2 - если в другом указанном месте; в этом случае возвращается также место расположения соответствующего фала отчета, обработки;
0 - указывает, что будет выполняться внутренний отчет, обработка из конфигурации.
По этим, возвращенным функцией данным, происходит открытие формы отчета, обработки из каталога ..\EXTFORMS, либо из указанного места расположения внешнего отчета, обработки стандартной процедурой: ОткрытьФорму("Отчет",, ФайлВнешней), где ФайлВнешней — переменная с путём к внешнему отчету, либо из конфигурации.
Коммутационный файл должен располагаться в каталоге базы, у меня, например, он называется «StrtExtProc.txt». Тип этого файла текстовый. В начале располагается описание ключей управления, как памятка. Точка с запятой (;) в первой позиции строки содержимого файла указывает, что эта строка исключается из анализа содержимого, нечто вроде комментария в языке программирования.
; StrtExtProc.txt - файл настроек управленим вызова отчетов и обработок базы 1С
;
; РАЗМЕСТИТЬ В КАТАЛОГЕ БАЗЫ
;
; кофигурации или как внешнего отчета/обработки.
;
; Ключи управления;
; /N[<Пользователь>] - код элемента справочника пользователи, как он задан в базе
; /R[<ПолноеИмяОбъекта>] - имя отчета/обработки, как оно задано в конфигурации
; /O[<1 или 0>] - режим запуска: 1 - внешний; 0 - из конфигурации
; /F[<путь к файлу>] - путь к файлу внешней обработки/отчета
;
; Пустая строка или строка, начинающаяся с символа ";" не анализируются.
;
; Ключи управления со своими параметрами в строке могут следовать в любом порядкке.
; Текст значения параметра (в квадратных скобках) не должен содержать предшествующих или
; заключительных пробелов. Например, так нельзя: /R[ Отчет.АвтоПрайс ]
; Пример строки со всеми параметрами:
;/R[Отчет.АвтоПрайс] /O[1] /N[Глазьев] /F[\\TEST1C\smp-2020-nn\EXTFORMS\РаскладкаППМаркета.ert]
;
; Шаблон строки:
;/N[] /R[] /O[] /F[]
;
/O[1] /R[Отчет.АнализОборотов]
/O[1] /R[Обработка.ОбъединениеРасходных] /F[\\yugmp\1C\2024\EXTFORMS\ОбъединениеРасходных_2.ert]
/O[1] /R[Отчет.ПредзаказПоДатеВыхода]
/O[1] /R[Отчет.ПрайсПоНаименованиям] /N[Глазьев]
/O[1] /R[Отчет.ПрайсПоНаименованиям] /N[Плашкина]
/O[1] /R[Отчет.ПрайсПоНаименованиям] /N[Плашкина1]
/O[1] /R[Отчет.ВывозВозвратПродажа_Нов] /F[\\yugmp\1C\2024\EXTFORMS\ВывозВозвратПродажа_Нов_Стриж.ert] /N[Стрижакова]
;/O[1] /R[Отчет.Взаиморасчеты] /N[Глазьев] /F[\\yugmp\1C\2024\EXTFORMS\Взаиморасчеты - копия.ert]
Чтобы предлагаемое решение действовало, для каждого отчета, обработки конфигурации, необходимо в модуле формы в предопределенной процедуре «ПриОткрытии» («OnOpen») прописать следующие строки, располагаемые в самом начале процедуры:
Процедура ПриОткрытии()
ФормаРасш = СоздатьОбъект("РасширениеФормы");
ПолныйТипОбъекта = ФормаРасш.ПолныйТипОбъекта();
ПолныйТипОбъекта = СтрЗаменить(ПолныйТипОбъекта, ".Форма", "");
ФайлВнешней = "";
Если ВнешнийЗапускОбъекта(Контекст, ПолныйТипОбъекта, ФайлВнешней) = 2 Тогда
ОткрытьФорму("Отчет",, ФайлВнешней);
СтатусВозврата(0);
Возврат;
ИначеЕсли ВнешнийЗапускОбъекта(Контекст, ПолныйТипОбъекта) = 1 Тогда
// ВНИМАНИЮ ПРОГРАММИСТА: в следующей строке нужно заменить
// "АнализСчета" на имя соответствующего отчета, обработки, как оно задано в конфигурации
ОткрытьФорму("Отчет",, КаталогИБ()+"EXTFORMS\АнализСчета.ert");
СтатусВозврата(0);
Возврат;
КонецЕсли;
// **********************
. . .
КонецПроцедуры
R03;
Более того, в каждом новом отчете, обработке, добавляемых в конфигурацию, нужна процедура «ПриОткрытии». А вот, когда внутренний отчет, обработка сохраняются как внешние, приведённых выше строк кода в этой процедуре быть не должно.
После всех несложных, описанных выше доработок, можно будет без внесения изменений в конфигурацию сохранить любой отчет, обработку, как внешнюю, внести изменения, доработать их, в соответствии с заданием пользователя, добавить строку в коммутационный файл, и всё… отчет, обработка работает уже по-новому. Пользователь открывает в меню программы тот же отчет и видит, что он работает в соответствии с его требованиями. Что и нужно!
В принципе, при необходимости можно подставить вообще произвольный отчет, обработку вместо любого отчета, обработки. Я, вообще на будущее, создал в конфигураторе отчет с именем «ОтчетВременно» и вывел его в меню всех интерфейсов. Таким образом можно пользователям предоставить к вызову любой внешний отчет или обработку, которых нет в конфигурации, например, когда разрабатывается и пока тестируется что-то новое. В последствии этот новый отчет встраивается в конфигурацию и выводится уже штатно в меню соответствующих интерфейсов.
Вот такие удобства имеет предлагаемое решение универсального вызова отчетов, обработок в 1С 7.7.
В архиве находятся файлы:
Функция_в_Глоб_Модуль.txt — функция в Глобальный модуль
Проц_При_Открытии.txt — процедура ПриОткрытии
StrtExtProc.txt — коммутационный файл