Произвольный обработчик регистрации изменений

Пример протестирован на 3.4.2.3

Напишем обработчик регистрации изменений Регистра накопления.
Сформируем очередь по двум параметрам: «Период» и «Склад».

На этом примере вы сможете увидеть все основные моменты и понять принцип. Какой именно обработчик вы в итоге будете писать - это только ваше лично дело.

Создадим обработчик по инструкции: Как написать собственный обработчик?

Листинг обработчика
// Обработчик выполняется при изменении объекта данных (перед записью, при записи, при удалении) //Назначение: фиксация изменения данных в очереди выгрузки, в виде параметров источника //Параметры обработчика: //"Проект" - это ссылка на проект. //"СтрокаПроекта" - это номер строки проекта, начинается с единицы. //"Источник", зависит от типа объекта - если это регистр сведений или накопления, то в объекте будет набор записей, // если документ, то объект документа. См. переменную Источник в событиях перед записью и при записи. //"Объект" - устаревшее, то же что и "Источник", оставлено для совместимости. //"Очередь" - таблица очереди, через эту переменную возвращается результат. //"Результат" - устаревшее, оставлено для совместимости, возвращает результат в виде структуры или массива структур со свойсвами, аналогичными колонкам параметра "Очередь". //"Параметры" - параметры обработчика, тип соответствие. //"ВидОбъекта" - вид объекта 1С, "Справочники", "Документы" и т.д.. //"ИмяОбъекта" - имя объекта как оно задано в конфигураторе. //"ТекстОшибки" - значение этого параметра возвращается из обработчика и, если он не пустой, будет записан в лог и приведет к остановке выгрузки проекта //Доступные поля очереди: //СтрокаОчереди = Очередь.Добавить(); // - "КлючЗаписи", ключ записи обеспечивает уникальность записи в регистре, строка, не обязательное, если не заполнить, то заполняется как Строка(Новый УникальныйИдентификатор) // Например, // СтрокаОчереди.КлючЗаписи = Строка(Новый УникальныйИдентификатор); // - "РежимУдаления", возможные режимы удаления из очереди: "ПриУспешнойВыгрузке", "Всегда", "НеУдалять", строка или значение перечисления Экс_РежимыУдаленияЗаписейОчереди // Например, // СтрокаОчереди.РежимУдаления = Перечисления.Экс_РежимыУдаленияЗаписейОчереди.ПриУспешнойВыгрузке; // СтрокаОчереди.РежимУдаления = "ПриУспешнойВыгрузке"; // - "Параметры", структура параметров запроса или строка json, где ключом является параметр, а значением структура с типом и сериализаванным значением параметра, // Например, // СтрокаОчереди.Параметры = "{'Период': {'Тип': 'Дата', 'Значение': '" + XMLСтрока(НачалоМесяца) + "'}}"; // СтрокаОчереди.Параметры = Новый Структура("Период", НачалоМесяца); // - "Партиция", строка, должна совпадать со значением партиции в ClickHouse // Например, партиция задана через функцию toYYYYMM(`Период`), // СтрокаОчереди.Партиция = Формат(НачалоМесяца, "ДФ='yyyyMM'"); // - "Таблица", строка, не обязательное, справочно, имя таблицы приемника, если не заполнить заполняется как имя приемника // Например, // СтрокаОчереди.Таблица = "ТоварыНаСкладах"; // - "Комментарий", строка, не обязательное // Например, // СтрокаОчереди.Комментарий = Строка(Источник); ////////////////////////////////////////////////////////////////////////////// // Пример регистрации изменений периодического регистра по месяцам и складу ////////////////////////////////////////////////////////////////////////////// ИмяПараметра = "ПериодП"; //имя параметра в запросе, который ограничивает дату (параметр партицирования) ИмяПараметраСклад="Склад";//имя параметра в запросе, который ограничивает склад (параметр партицирования) Периодичность = "Месяц"; //для подстановки в запросе ТЗ = Источник.Выгрузить(, "Период,Склад"); Для каждого Строка Из ТЗ Цикл Строка.Период = НачалоМесяца(Строка.Период); КонецЦикла; ТЗ.Свернуть("Период,Склад"); Периодичность = ВРег(Периодичность); Если Периодичность = "ДЕНЬ" или Периодичность = "НЕДЕЛЯ" Тогда ФорматнаяСтрока = "ДФ='yyyyMMdd'"; ИначеЕсли Периодичность = "МЕСЯЦ" или Периодичность = "КВАРТАЛ" или Периодичность = "ПОЛУГОДИЕ" Тогда ФорматнаяСтрока = "ДФ='yyyyMM'"; ИначеЕсли Периодичность = "ГОД" Тогда ФорматнаяСтрока = "ДФ='yyyy'"; ИначеЕсли Периодичность = "ЧАС" Тогда ФорматнаяСтрока = "ДФ='yyyyMMddHHmmss'"; КонецЕсли; Для каждого Строка Из ТЗ Цикл ПериодСтроки = Строка.Период; СкладСтроки = Строка.Склад; Партиция = "(" + Формат(ПериодСтроки, ФорматнаяСтрока)+ ", '" + СкладСтроки + "')"; СтрокаОчереди = Очередь.Добавить(); СтрокаОчереди.Параметры = Новый Структура(""+ ИмяПараметра + "," + ИмяПараметраСклад, ПериодСтроки, СкладСтроки); СтрокаОчереди.Партиция = Партиция; КонецЦикла;

Начиная с версии 3.6.4.48 Экстрактора 1С, были добавлены два новых параметра:

  • ИсточникСобытия — измененный объект, параметр обработчиков событий.

  • Событие — имя события, строка: «ПередЗаписью», «ПриЗаписи», «ПередУдалением».

Пример листинга обработчика регистрации изменений с новыми параметрами
//"ИсточникСобытия" - измененный объект, параметр обработчиков событий. //"Событие" - имя события, строка: "ПередЗаписью", "ПриЗаписи", "ПередУдалением". //В событии "Перед записью" измененный объект находится в "ИсточникСобытия". //Используя новые переменные Событие и ИсточникСобытия //Можно, например, сделать сравнение, изменилось ли наименование объекта и отправить полученный результат //в событие "При записи", а потом выполнять наш обработчик только: Если Событие = "ПередЗаписью" Тогда // сравниваем Источник (Текущий записанный объект) и ИсточникСобытия (записываемые данные) //если наименования у них разные: Если Источник.Наименование<> ИсточникСобытия.Наименование тогда НаименованиеИзменилось = Истина; //---значит было изменение наименования Иначе НаименованиеИзменилось = Ложь; КонецЕсли; // передадим информацию в событие при записи, используя ДополнительныеСвойства ИсточникСобытия.ДополнительныеСвойства.Вставить("НаименованиеИзменилось", НаименованиеИзменилось); КонецЕсли; // добавив данные в дополнительные параметры ИсточникаСобытия, // мы можем обратиться к ним уже в событии "ПриЗаписи": // Если Событие = "ПриЗаписи" И Источник.ДополнительныеСвойства.НаименованиеИзменилось Тогда //здесь должен быть текст вашего обработчика, //который вы хотите выполнять только если наименование изменилось //.... КонецЕсли; ////здесь возможно еще какой-то текст обработчика