Введение
Думаю, у многих случалась такая ситуация, когда нужно при запуске 1С обработать какое-либо действие. При этом, если вам нужно обратиться к каким-либо объектам конфигурации, то свой код можно вставить не везде, так как они еще не проинициализированы.
Получается, делаем вывод - нужно найти место в конфигурации, где объекты уже проинициализированы и ждут вашего кода с обработкой. (Когда-то пришлось очень долго искать это место).
Разберем это на примере расширения //infostart.ru/1c/reports/2389961/.
Поиск места вставки кода
Обычно во многих курсах, не буду говорить, что во всех, показывают место для вставки кода для обработки в модуле самой конфигурации.
![]()
Но попытки вставить код в этом месте оказались тщетными. Так как модуль содержит методы, которые выполняются еще до инициализации приложения. Ниже вставка из модуля с методами:
#Область ОбработчикиСобытий
Процедура ПередНачаломРаботыСистемы()
Процедура ПриНачалеРаботыСистемы()
Процедура ПередЗавершениемРаботыСистемы(Отказ, ТекстПредупреждения)
Процедура ОбработкаПолученияФормыВыбораПользователейСистемыВзаимодействия(НазначениеВыбора,
Процедура ПриВыбореДействияСообщенияСистемыВзаимодействия(Сообщение, Действие)
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
Процедура ПриГлобальномПоиске(СтрокаПоиска, ПланПоиска)
Процедура ПриВыбореРезультатаГлобальногоПоиска(ЭлементРезультата, СтандартнаяОбработка)
Процедура ПриВыбореДействияРезультатаГлобальногоПоиска(ЭлементРезультата, Действие)
Процедура ОбработкаПереходаПоНавигационнойСсылке(ДанныеПереходаПоНавигационнойСсылке, СтандартнаяОбработка)
Процедура ОбработкаФормированияКомандВходящегоЗапросаПоделиться(ДанныеЗапросаПоделиться, Команды)
#КонецОбласти
Тем самым, если вставить код, который будет обрабатываться с использованием данных предприятия в этом месте, приложение не сможет даже запуститься. Поэтому нужно найти такое место для вставки кода, где приложение уже инициализируется, но еще не запустится.
Рассмотрим объекты конфигурации, в которых такое возможно. Для обычного запуска приложения в типовых конфигурациях встроено БСП (Библиотека стандартных подсистем), поэтому ищем в общих модулях конфигурации с пометкой "Переопределямый".
Всего в конфигурации переопределяемых модулей большое количество, поэтому искать нужно в тех модулях, которые не отвечают за что-то определенное, а отвечают за приложение в целом. К примеру, это может быть модуль ОбщегоНазначения.
Так как мы с вами рассматриваем вставку кода на примере, то мы будем поздравлять пользователя с днем рождения, а значит, нам нужен модуль, который будет показывать оповещение пользователю, что его поздравляют.
Значит, нам нужен модуль, который сможет отработать на клиентской части приложения. Ищем модуль с пометкой "Клиент".
Из всех перечисленных замечаний можно сделать вывод, что нам подойдет общий модуль с названием "ОбщегоНазначенияКлиентПереопределяемый". В этом модуле есть процедура, которая выполняется после инициализации приложения, нужно найти Процедуру ПослеНачалаРаботыСистемы () Экспорт.
В ней уже содержится код:
Процедура ПослеНачалаРаботыСистемы() Экспорт
ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске();
ЭтоМобильныйКлиент = МобильныйКлиентБПКлиент.ЭтоМобильныйКлиент();
Если ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда
// Собор статистики по системам налогообложения организаций
ПодключитьОбработчикОжидания("Подключаемый_ДобавитьСтатистикуПоСНООрганизаций", 0.1, Истина);
Если ПараметрыРаботыКлиента.Свойство("ИспользуетсяНедоступныйВидОрганизации") Тогда
ОткрытьФорму("Справочник.Организации.Форма.ИспользуетсяНедоступнаяФункциональность");
// Если используется недоступная функциональность, то ничего больше не показываем - только окно недоступной функциональности.
Возврат;
КонецЕсли;
Если ПараметрыРаботыКлиента.Свойство("ИспользуетсяНедоступнаяСистемаНалогообложения") Тогда
ОткрытьФорму("РегистрСведений.НастройкиСистемыНалогообложения.Форма.ИспользуетсяНедоступнаяФункциональность");
// Если используется недоступная функциональность, то ничего больше не показываем - только окно недоступной функциональности.
Возврат;
КонецЕсли;
Если ПараметрыРаботыКлиента.Свойство("ИспользуетсяНедоступнаяФункциональность") Тогда
ФункциональностьПрограммыКлиент.ПоказатьПредупреждениеОбИспользованииНедоступнойФункциональности(
ПараметрыРаботыКлиента);
// Если используется недоступная функциональность, то ничего больше не показываем - только окно недоступной функциональности.
Возврат;
КонецЕсли;
ИнтерфейсОбновлен = Ложь;
// В чистой базе устанавливается специальный интерфейс начала работы.
РежимНачалаРаботы = "";
Если ПараметрыРаботыКлиента.Свойство("АктивироватьПрограмму")
Или ПараметрыРаботыКлиента.ПоказыватьБыстрыйСтарт Тогда
НачальноеЗаполнениеВызовСервера.ПодготовитьДанныеДляЗаполненияПриложения();
РежимНачалаРаботы = ?(ПараметрыРаботыКлиента.Свойство("АктивироватьПрограмму"), "АктивацияПрограммы", "БыстрыйСтарт");
ОбщегоНазначенияБПВызовСервера.УстановитьИнтерфейсНачалаРаботы(РежимНачалаРаботы);
Если Не ПараметрыРаботыКлиента.Свойство("СкрытьРабочийСтолПриНачалеРаботыСистемы") Тогда
ОбновитьИнтерфейс();
ИнтерфейсОбновлен = Истина;
КонецЕсли;
// Иначе отображается монитор интернет-поддержки, очень важные новости,
// а также в режиме интеграции с банком устанавливается стандартный интерфейс.
Иначе
// ИнтернетПоддержкаПользователей
ИнтернетПоддержкаПользователейКлиент.ПриНачалеРаботыСистемы(Неопределено);
// Конец ИнтернетПоддержкаПользователей
КонецЕсли;
Если Не ЭтоМобильныйКлиент Тогда
ДокументооборотСКОКлиент.ПослеЗапускаСистемы();
ФинОтчетностьВБанкиКлиент.ПослеЗапускаСистемы();
КонецЕсли;
// 1. Регистрация, путеводители, справочная информация
Если ЭтоМобильныйКлиент Тогда
//В мобильном клиенте обрабатывает только быстрый старт
Если ПараметрыРаботыКлиента.Свойство("ПоказыватьБыстрыйСтартПриРегистрации")
И ПараметрыРаботыКлиента.ПоказыватьБыстрыйСтартПриРегистрации Тогда
Если ПараметрыРаботыКлиента.Свойство("ПараметрыБыстрогоСтартаПриРегистрации") Тогда
ОбщегоНазначенияБПКлиент.ОткрытьБыстрыйСтарт(
ПараметрыРаботыКлиента.ПараметрыБыстрогоСтартаПриРегистрации);
Иначе
ОбщегоНазначенияБПКлиент.ОткрытьБыстрыйСтарт();
КонецЕсли;
КонецЕсли;
ИначеЕсли Не ЗначениеЗаполнено(РежимНачалаРаботы)
И ПараметрыРаботыКлиента.Свойство("ОткрытьМониторНалоговИОтчетности")
И ПараметрыРаботыКлиента.ОткрытьМониторНалоговИОтчетности Тогда
ОбщегоНазначенияБПКлиент.ОткрытьМониторНалоговИОтчетности();
ИначеЕсли ПараметрыРаботыКлиента.Свойство("ПоказыватьБыстрыйСтартПриРегистрации")
И ПараметрыРаботыКлиента.ПоказыватьБыстрыйСтартПриРегистрации Тогда
Если ПараметрыРаботыКлиента.Свойство("ПараметрыБыстрогоСтартаПриРегистрации") Тогда
ОбщегоНазначенияБПКлиент.ОткрытьБыстрыйСтарт(
ПараметрыРаботыКлиента.ПараметрыБыстрогоСтартаПриРегистрации);
Иначе
ОбщегоНазначенияБПКлиент.ОткрытьБыстрыйСтарт();
КонецЕсли;
ИначеЕсли ПараметрыРаботыКлиента.Свойство("ОткрытьПомощникРегистрации")
И ПараметрыРаботыКлиента.ОткрытьПомощникРегистрации Тогда
ОбщегоНазначенияБПКлиент.ОткрытьРегистрацияОрганизации(ПараметрыРаботыКлиента.НавигацияНомерШага);
Если ПараметрыРаботыКлиента.ПоказатьНачалоРаботыВСервисе Тогда
// Ссылки на основные разделы программы для предпринимателей в сервисе
ОбщегоНазначенияБПКлиент.ОткрытьНачалоРаботыВСервисе();
КонецЕсли;
ИначеЕсли ПараметрыРаботыКлиента.Свойство("ОткрытьПомощникВнесенияИзменений")
И ПараметрыРаботыКлиента.ОткрытьПомощникВнесенияИзменений Тогда
ОбщегоНазначенияБПКлиент.ОткрытьПомощникВнесенияИзменений(ПараметрыРаботыКлиента.НавигацияНомерШага);
Если ПараметрыРаботыКлиента.ПоказатьНачалоРаботыВСервисе Тогда
// Ссылки на основные разделы программы для предпринимателей в сервисе
ОбщегоНазначенияБПКлиент.ОткрытьНачалоРаботыВСервисе();
КонецЕсли;
ИначеЕсли ПараметрыРаботыКлиента.ПоказатьОписаниеИзмененийСистемы Тогда
// При обновлении версии открываем только описание изменений,
// если не выполняется процесс регистрации организации.
ИначеЕсли ПараметрыРаботыКлиента.ПоказатьНачалоРаботыВСервисе
И НЕ ПараметрыРаботыКлиента.Свойство("АктивироватьПрограмму")
И НЕ ПараметрыРаботыКлиента.ПоказыватьБыстрыйСтарт Тогда
// Ссылки на основные разделы программы для предпринимателей в сервисе
ОбщегоНазначенияБПКлиент.ОткрытьНачалоРаботыВСервисе();
ИначеЕсли ПараметрыРаботыКлиента.ПоказатьЗнакомствоСРедакциейВ30 Тогда
// Знакомство с редакцией 3.0
ОбщегоНазначенияБПКлиент.ОткрытьНачинаемРаботатьВ30(ПараметрыРаботыКлиента.ИмяОбработкиЗнакомствоСРедакциейВ30);
КонецЕсли;
// 2. Окна, которые требуют от пользователя каких-либо действий
Если ЭтоМобильныйКлиент Тогда
//В мобильном клиенте нет возможности выполнять сервисные действия
ИначеЕсли ПараметрыРаботыКлиента.ПоказатьОписаниеИзмененийСистемы Тогда
// При обновлении версии открываем только описание изменений,
// если не выполняется процесс регистрации организации.
ИначеЕсли ПараметрыРаботыКлиента.ПоказатьСвертку Тогда
// Свертка базы (продолжение работы)
ОбщегоНазначенияБПКлиент.ОткрытьСверткуБазы();
ИначеЕсли ПараметрыРаботыКлиента.ФормированиеОстатковПоНДС Тогда
// Открытие формы "Налоги и отчеты" для формирования остатков,
// необходимых для начала ведения раздельного учета НДС.
// Форма открывается при включении раздельного учета НДС в Простом интерфейсе,
// после перезапуска приложения.
ОбщегоНазначенияБПКлиент.ОткрытьНалогиИОтчетыДляФормированияОстатковПоНДС(ПараметрыРаботыКлиента);
ИначеЕсли ПараметрыРаботыКлиента.ПоказатьПредложитьОбновитьВерсиюПрограммы Тогда
// Информация о необходимости обновить конфигурацию
ОбщегоНазначенияБПКлиент.ПредупредитьОНеобходимостиОбновленияПрограммы(ПараметрыРаботыКлиента);
ИначеЕсли ПараметрыРаботыКлиента.ПоказатьВключитьОсновнойИнтерфейс Тогда
// Предложение включить основной интерфейс
ОбщегоНазначенияБПКлиент.ПредложитьИспользоватьОсновнойИнтерфейс(
ПараметрыРаботыКлиента.ВариантПредложенияВключитьОсновнойИнтерфейс);
КонецЕсли;
Если ПараметрыРаботыКлиента.Свойство("ПоказатьПомощникИсключенияИзПрослеживаемости")
И Не ЭтоМобильныйКлиент Тогда
ОбщегоНазначенияБПКлиент.ОткрытьФормуПомощникаИсключенияИзПрослеживаемости(ПараметрыРаботыКлиента.ПоказатьПомощникИсключенияИзПрослеживаемости);
КонецЕсли;
Если Не ИнтерфейсОбновлен
И ПараметрыРаботыКлиента.Свойство("ОбновитьИнтерфейс")
И ПараметрыРаботыКлиента.ОбновитьИнтерфейс Тогда
ОбновитьИнтерфейс();
КонецЕсли;
Если ПараметрыРаботыКлиента.Свойство("ПроверкаДатИзмененияПроцентныхСтавокПоЗаймам")
И ПараметрыРаботыКлиента.ПроверкаДатИзмененияПроцентныхСтавокПоЗаймам Тогда
ОбщегоНазначенияБПКлиент.ОткрытьПроверкуДатИзмененияПроцентныхСтавокПоЗаймам();
КонецЕсли;
ОповещенияПлатформыСамозанятыеКлиент.ПослеНачалаРаботы();
УведомленияОтФНСАУСНКлиент.ПослеНачалаРаботы();
//В мобильном клиенте отключим оповещения для неподдерживаемой функциональности
Если Не ЭтоМобильныйКлиент Тогда
НадежностьБанковКлиент.ПослеНачалаРаботыСистемы();
ЗаявкиНаКредитКлиент.ПослеНачалаРаботыСистемы();
ЗаявкиНаОткрытиеСчетаКлиент.ПослеНачалаРаботыСистемы();
СервисСверкиРасчетовКлиент.ПослеНачалаРаботы();
ОбменСКонтрагентамиБПКлиент.ПослеНачалаРаботыСистемы();
ЭлектронноеВзаимодействиеКлиент.ПослеНачалаРаботыСистемы();
РегламентированнаяОтчетностьКлиент.ПослеНачалаРаботыСистемы();
// ИнтеграцияС1СДокументооборотом
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтеграцияС1СДокументооборотом") Тогда
МодульИнтеграцияС1СДокументооборотБазоваяФункциональностьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль(
"ИнтеграцияС1СДокументооборотБазоваяФункциональностьКлиент");
МодульИнтеграцияС1СДокументооборотБазоваяФункциональностьКлиент.ПослеНачалаРаботыСистемы();
КонецЕсли;
// Конец ИнтеграцияС1СДокументооборотом
// РекламныйСервис
РекламныйСервисКлиент.ПослеНачалаРаботыСистемы();
// Конец РекламныйСервис
//ГосИС
ОбщегоНазначенияИСКлиент.ПослеНачалаРаботыСистемы();
//Конец ГосИС
// при обновлении версии проверяем настройки обновления драйверов оборудования
Если ПараметрыРаботыКлиента.ТребуетсяОбновлениеДрайверов Тогда
МенеджерОборудованияБПКлиент.ОткрытьФормуОбновлениеДрайверов();
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Не ЭтоМобильныйКлиент Тогда
// ЗарплатаКадры
ЗарплатаКадрыКлиент.ПослеНачалаРаботыСистемы();
// Конец ЗарплатаКадры
Иначе
Если ПараметрыРаботыКлиента.Свойство("ИдентификаторПолучателяPushУведомлений") Тогда
PushУведомленияКлиент.ПослеНачалаРаботыСистемы(ПараметрыРаботыКлиента.ИдентификаторПолучателяPushУведомлений);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Несмотря на то, что это переопределяемый модуль, он может быть на поддержке и недоступен для редактирования. Здесь можно рассмотреть два варианта: открыть модуль для редактирования, оставив его на поддержке, либо добавить процедуру в расширение и редактировать уже в расширении. Но мы с вами примем правильное решение и не будем трогать замок модуля, так как это может испортить типовой код и сказаться многими проблемами. Добавим модуль в расширение с параметром &После. Так код выполнится после необходимых действий в типовой конфигурации.
Вставим код в расширение:
&После("ПослеНачалаРаботыСистемы")
Процедура СДРПослеНачалаРаботыСистемы()
ЧеловекСеанса = ПользователиКлиент.ТекущийПользователь();
ДатаЧела = СДР_ОбщегоНазначенияСервер.ПолучитьДатуПользователя(ЧеловекСеанса);
ИмяЧела = СДР_ОбщегоНазначенияСервер.ПолучитьИмяПользователя(ЧеловекСеанса);
Если НЕ ЗначениеЗаполнено(ДатаЧела) Тогда
Возврат;
КонецЕсли;
Если НачалоДня(ТекущаяДата()) = НачалоДня(ДатаЧела)
Тогда
ПредупреждениеАсинх("С днем рождения, "+ ИмяЧела, 10, "Вас поздравляют!");
КонецЕсли;
КонецПроцедуры
Здесь мы можем пользоваться объектами, и обработка будет выполняться при запуске приложения.
Заключение
В заключении можно сказать, что самая длительная часть в данной задаче это поиск места. Но если ты хорошо ориентируешься в объектах БСП, время этого поиска значительно сократится.
Вступайте в нашу телеграмм-группу Инфостарт