Обработка данных при запуске 1С. Встраиваем код в общий модуль

04.05.26

Разработка - БСП (Библиотека стандартных подсистем)

Если у вас была такая ситуация, что при запуске 1С требовалось обработать какой-либо код, то здесь мы будем рассматривать именно эту ситуацию.

Введение


Думаю, у многих случалась такая ситуация, когда нужно при запуске 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, "Вас поздравляют!");
	КонецЕсли; 
КонецПроцедуры

Здесь мы можем пользоваться объектами, и обработка будет выполняться при запуске приложения.


Заключение


В заключении можно сказать, что самая длительная часть в данной задаче это поиск места. Но если ты хорошо ориентируешься в объектах БСП, время этого поиска значительно сократится.

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

БСП (Библиотека стандартных подсистем) Программист Платные (руб)

Синтакс-помощник БСП - cправочник по библиотекам стандартных подсистем и электронных документов. В состав справочника входит описание экспортных процедур и функций, размещенных в областях кода ПрограммныйИнтерфейс БСП и БЭД.

3254 руб.

21.11.2024    13051    46    24    

52

Механизмы платформы 1С Программист Бесплатно (free)

Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?

16.07.2025    32723    TitanLuchs    108    

149

Механизмы платформы 1С WEB-интеграция Программист 1С:Предприятие 8 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    33482    dsdred    106    

149

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    29269    bayselonarrend    22    

177
Для отправки сообщения требуется регистрация/авторизация