И сразу лирическое отступление
Бывало у вас такое, что вот скачиваешь нужную вроде бы обработку, а она встречает тебя парой полей ввода и кнопкой "Сделать". Нажимаешь, 1С что-то подзадумалась и все. Что произошло? Какие объекты были поправлены и как? Были ли проблемы? Может там в коде все обернуто в Попытки без сообщений об Исключениях, а все грандиозная работа обернута в одну транзакцию, которая в конце была отменена. В большинстве случаев, какая-то информация будет предоставлена через Сообщить(), реже - какой-то лог на форме.
Или тебе очень хочется, чтобы обработка была добавлена в справочник и выполнялась как регламентное задание. Но создатель такой вариант даже не рассматривал. Тебе надо - пиши СведенияОВнешнейОбработке, добавляй команду, перетягивай исполняемый код в модуль объекта, если он в форме весь описан.
С одной стороны, можно решить, что создатель обработки - просто поленился. Накидал вещь для решения задачи, и ему норм.
С другой - за день тебе может потребоваться написать несколько обработок, отчетов или печатных форм (особенно программисты "всей 1С" в компании в одном лице меня поймут). Каждую наполнять такими сомнительными плюшками "просто чтобы было" - времени нет практически никогда. Ну и да, лень писать одно и то же снова и снова - оно сжирает время, которое должно быть потрачено на описание логики обработки. Конечно, у всех есть какие-то свои шаблоны для такого, да и в интернете есть куча готовых для вставки кусков кода - нагуглил-вставил, но большинство, как правило, ограничивается вынужденным минимумом.
Собственно, данными шаблонами и попытаемся закрыть эти моменты.
Что это за шаблоны
Они с параметрами регистрации
Тут ничего сверхъестественного, но есть пара удобств.
- Версию обработки можно написать в комментарии к ней. В формате %Версия=N.N.N.N% За парсинг этого отвечает процедура в модуле объекта ПолучитьВерсиюОбработки()
- Имя обработки берется из Синонима. По аналогии с версией, за это отвечает процедура ПолучитьИмяОбработки()
- Есть процедура ПолучитьИдентификаторОбработки() - возвращает Имя обработки. Присутствует только в шаблоне Внешней обработки, используется для формирования идентификаторов команд и имени файла лога для сохранения по умолчанию.
- Для внешней обработки и внешней печатной формы наполнение команд вынесено в отдельную функцию ПолучитьМассивКоманд() Для удобства, а еще это важно для печ.формы, потому что используется на форме (выбор команды для исполнения) при отладке.
Сами команды при этом наполняются ничуть не проще и не сложнее. Вот пример
Функция ПолучитьМассивКоманд() Экспорт
МассивКоманд = Новый Массив;
// --------------------------------------------------------------------
МассивКоманд.Добавить(СтруктураКоманды(
"ПФ_MXL_ИмяМакета", "Внешняя ВПФ печатная форма", // Идентификатор, Представление
"ВызовСерверногоМетода", // Использование
Истина, "ПечатьMXL")); // ПоказыватьОповещение, Модификатор
// --------------------------------------------------------------------
МассивКоманд.Добавить(СтруктураКоманды(
"ПФ_MXL_ИмяМакета_НаКлиенте", "Внешняя ВПФ печатная форма (клиентский вызов)", // Идентификатор, Представление
"ВызовКлиентскогоМетода", // Использование
Истина, "ПечатьMXL")); // ПоказыватьОповещение, Модификатор
// --------------------------------------------------------------------
Возврат МассивКоманд;
КонецФункции
Функция ПолучитьМассивКоманд(ИмяОбъекта = "") Экспорт
Если ПустаяСтрока(ИмяОбъекта) Тогда
ИмяОбъекта = ПолучитьИмяОбработки();
КонецЕсли;
МассивКоманд = Новый Массив;
ИдентификаторОбработки = ПолучитьИдентификаторОбработки();
// --------------------------------------------------------------------
МассивКоманд.Добавить(СтруктураКоманды(
ИдентификаторОбработки, ИмяОбъекта, // Идентификатор команды, Представление команды
"ОткрытиеФормы", // Использование
Ложь, "")); // ПоказыватьОповещение, Модификатор
// --------------------------------------------------------------------
МассивКоманд.Добавить(СтруктураКоманды(
ИдентификаторОбработки + "_Клиент", ИмяОбъекта + " (На клиенте)", // Идентификатор команды, Представление команды
"ВызовКлиентскогоМетода", // Использование
Ложь, "")); // ПоказыватьОповещение, Модификатор
// --------------------------------------------------------------------
МассивКоманд.Добавить(СтруктураКоманды(
ИдентификаторОбработки + "_АВТО", ИмяОбъекта + " (АВТО)", // Идентификатор команды, Представление команды
"ВызовСерверногоМетода", // Использование
Ложь, "")); // ПоказыватьОповещение, Модификатор
// --------------------------------------------------------------------
Возврат МассивКоманд;
КонецФункции
- Если мы говорим об отчете на СКД, заходить в модуль обработки нам вообще не нужно. Указываем Имя обработки, Синоним и версию через Комментарий (опционально). Если нет никакой особенной логики, которую нужно описать ПриКомпоновкеРезультата или чего-то еще - нам там делать нечего. Все параметры регистрации будут заполнены. Ну может только указать исполнение в безопасном режиме (по умолчанию везде - Ложь) или Информацию.
Если же логика какая-то есть, особенно, когда мы используем общую ФормуОтчета - есть целая область, которая так и называется Общая_форма_ФормаОтчета. И уже там, без создания собственной формы, мы можем вытворять с СКД всякое. Как минимум - задать вычисляемые параметры для отчета.
Есть инструменты для дебага
- Для внешней печ.формы - есть форма обработки, в которой можно указать на нужный объект и выполнить любую из добавленных команд печати. Исполнение, естественно, можно ковырять в отладке, а результат увидеть тут же ТабДоке. При этом, каких-либо дополнительных действий, чтобы это работало, от разработчика не потребуется. Ну можно задать типы для переменной формы СсылкаНаОбъект, чтобы упростить выбор объекта для проверки, например.
- Для внешней обработки есть сразу несколько инструментов
- Лог - в виде реквизита обработки ЛогТекст, тип Строка. Для работы с логом в модуле обработки есть
Процедура Лог(Текст, Уровень = 0, Отделить = Ложь, Очистить = Ложь)
Где Уровень - это условный отступ при записи строки в лог.
- Ну чтобы было удобнее читать
- Когда мы обрабатываем какой-то объект и хотим логгировать разные последовательные этапы.
Отделить - вставить пустую строку перед добавляемой.
Очистить - очистит весь текущий лог и добавит строку.
На форме обработки эти процедуры также есть, для вызова &НаКлиенте - она абсолютно такая же, для вызова &НаСервере - у нее только изменено имя - ЛогС().
- Таблица проблемных объектов - как табличная часть обработки. Состоит из двух колонок - Объект (Любая ссылка) и Ошибка (Строка).
Заполняется из модуля или формы процедурой
Процедура ДобавитьПроблемныйОбъект(ОбъектСсылка, ТекстОшибки)
Сама таблица представлена на странице Лог, на таблице повешен обработчик Выбора, который открывает объект в строке. Процедура существует только для того, чтобы писать одну строку кода, а не две\три.
- Таблица созданных объектов - как табличная часть обработки. Состоит из одной колонки - Объект (Любая ссылка). Ее заполнение
Процедура ДобавитьСозданныйОбъект(ОбъектСсылка)
В остальном - все то же самое, что и для проблемных объектов.
- Сохранение строки лога в файл. Есть и на сервере, и на клиенте. И на форме в виде кнопки. Только выбор места сохранения я не описывал - мне... лень. Это еще ни разу не потребовалось, всегда достаточно указания пути в коде. Процедуры
// В модуле
Процедура СохранитьЛогВФайл(Каталог, ИмяФайла = "", Дописывать = Истина, Датировать = Истина, ФорматДаты = "ДФ=dd.MM.yyyy-HH.mm") Экспорт
// На форме
Процедура СохранитьЛогВФайл(Каталог, ИмяФайла = "", Дописывать = Истина, Датировать = Истина, ФорматДаты = "ДФ=dd.MM.yyyy-HH.mm", ВыбиратьКонтекст = Ложь)
Каталог - папка для сохранения файла лога. Если путь не найден - будет создан (в попытке).
ИмяФайла - когда не указано, берется ЛОГ_+Имя обработки
Дописывать - строка лога допишется в конец файла. Если Ложь - текст файла будет очищен перед записью.
Датировать - к имени файла будет добавлен суффикс в виде, который указан в переменной ФорматДаты.
ВыбиратьКонтекст (модуль формы) - если Истина, на клиенте будет показан диалог с тремя кнопками "На клиенте", "На сервере" и "Отмена" - это вопрос, в каком контексте выполнить сохранения лога.
Базовый скелет кода
- Для ВПФ - это полностью функциональная процедура печати, в которой остается только разделить логику формирования от разных команд (если требуется) и сформировать ТабДок.
- Для Внешней обработки - Форма, на которой есть вышеописанные механизмы дебага и ряд процедур для удобства:
&НаКлиенте
Функция ПроверкаЗаполнения_Клиент(ТекстОшибки)
&НаСервере
Функция ПроверкаЗаполнения_Сервер(ТекстОшибки)
&НаСервере
Функция Получить(ИмяРеквизита)
&НаСервере
Процедура Обновить(ИмяРеквизита, НовоеЗначение)
// Заготовки, которые уже вызываются из событий формы ПриСозданииНаСервере и ПриОткрытии
&НаСервере
Процедура УстановитьПараметрыСписка()
&НаСервере
Процедура УстановитьДоступность()
&НаКлиенте
Процедура ОбновитьОформление()
А также пара экспортных процедур в модуле обработки
Процедура УстановитьПометкуУдаления(Объект, НовоеЗначение, ВключаяПодчиненные = Истина) Экспорт
Процедура СохранитьИзмененияОбъекта(Объект, Загрузка = Ложь, ПроводитьДокумент = Ложь) Экспорт
- Для Внешней обработки с видами: Создание связанных объектов и Заполнение объектов - заготовки процедур ВыполнитьКоманду (на форме и в модуле). Для этого КлиентскийВызов и СерверныйВызов ветвится на две процедуры. Собственно, это все актуально и для просто Обработки, которая выполняется в Клиентском или Серверном вызове.
ЗаполнениеОбъектов(ИдентификаторКоманды, МассивОбъектов, КонтекстнаяПеременная);
СозданиеСвязанныхОбъектов(ИдентификаторКоманды, МассивОбъектов, КонтекстнаяПеременная);
// То есть код процедуры выглядит примерно так
Процедура ВыполнитьКоманду(ИдентификаторКоманды, МассивОбъектов = неопределено, КонтекстнаяПеременная = неопределено) Экспорт
Лог("Начало обработки на сервере: " + ТекущаяДата(),,, Истина);
ЗаполнениеОбъектов(ИдентификаторКоманды, МассивОбъектов, КонтекстнаяПеременная);
//СозданиеСвязанныхОбъектов(ИдентификаторКоманды, МассивОбъектов, КонтекстнаяПеременная);
Лог("Окончание обработки на сервере: " + ТекущаяДата(),, Истина);
СохранитьЛогВФайл("C:\",, Истина, Ложь);
КонецПроцедуры
- Для СКД - местами поднастроен макет. Ничего такого, на чем стоит заострять внимание. Вся суть шаблона - в модуле обработки, где можно понавешать выполнение процедур из общей формы отчета.
Процедура ОпределитьНастройкиФормы(ЭтаФорма, КлючВарианта, Настройки) Экспорт
Настройки.События.ПриСозданииНаСервере = Истина;
Настройки.События.ПередЗагрузкойВариантаНаСервере = Истина;
Настройки.События.ПриЗагрузкеВариантаНаСервере = Истина;
Настройки.События.ПриЗагрузкеПользовательскихНастроекНаСервере = Истина;
//Настройки.События.ПередЗагрузкойНастроекВКомпоновщик = Ложь;
//Настройки.События.ПередЗаполнениемПанелиБыстрыхНастроек = Ложь;
//Настройки.События.ПослеЗаполненияПанелиБыстрыхНастроек = Ложь;
//Настройки.События.ПриОпределенииИспользуемыхТаблиц = Ложь;
//Настройки.События.ПриОпределенииПараметровВыбора = Ложь;
//Настройки.События.ПриОпределенииСвойствЭлементовФормыНастрое = Ложь;
КонецПроцедуры
- Еще есть отчет-шаблон для добавления его как схемы запроса формирования сегмента (На примере сегмента партнеров в УТ-11). Но это такое.
Лирическое послесловие
Ни в коем случае не говорю "это все обязательно должно быть в ваших обработках". Это удобства, которые удовлетворяют моим рабочим потребностям и вкусам. Да, мне непривычно их отсутствие, когда что-то где-то скачиваю. И да, я прекрасно понимаю, какое это уныние - писать один и тот же код снова и снова. Даже копировать его откуда-то и адаптировать под текущую разработку. Я хочу проблему решать, а не писать процедуры для отладки потому, что задача сложная и могут быть проблемы при эксплуатации. У меня голова занята умными мыслями, а я в пятидесятый раз копирую и заполняю ПараметрыРегистрации.
Так и появляются шаблоны-заготовки. Просто сколько ни скачиваю чьи-либо узкоспециализированные обработки - такое ощущение, что они всегда сделаны через Файл-Создать-Внешняя обработка. Некоторые даже форму не рисуют, просто код в модуле и в конце Main(); И мне от этого грустно.
Естественно, это все не является какой-то грандиозной разработкой, поэтому можно просто скачать без рекламы и СМС. Ознакомиться, переделать под себя или взять куски, указать на косяк, предложить сделать по другому.
Тестировалось
- На УТ 11.4.11.55, БСП 3.0.3.164, Режим совместимости 8.3.12
- На самописке, БСП 2.3.6.92, Режим совместимости 8.3.9
- На платформах: 8.3.14.1630, 8.3.15.1830