# Паттерны наименования ## Обработчики > Направление Класс Тип ### Название ``` Получить Справочник ФизическиеЛица ``` ### Имя ``` ПолучитьСправочникФизическиеЛица ``` # Универсальные функции ## Общее Из xdto пакета автоматически распознаются **только** типы: - строка - число - булево > Все остальное нужно обрабатывать! ## Отказ от регистрации в исходящие сообщения ``` Контекст.ЗаписываемыйОбъект.ДополнительныеСвойства.Вставить("СШПНеобрабатывать", Истина); Контекст.ЗаписываемыйОбъект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов"); Контекст.ЗаписываемыйОбъект.ДополнительныеСвойства.Вставить("адаптер_УстановленЗапретВыгрузкиОбъекта"); ``` ## Проведение документа ### Перед записью ``` Если ЗагружаемыйОбъект.Проведен Тогда Контекст.Вставить("Провести", Истина); ЗагружаемыйОбъект.Проведен = Ложь; ИначеЕсли Не ЗагружаемыйОбъект.Проведен И Не ЗагружаемыйОбъект.ЭтоНовый() И ЗагружаемыйОбъект.Ссылка.Проведен Тогда Контекст.Вставить("Провести", Ложь); КонецЕсли; ``` ### После попытки ``` Если Не Контекст.Свойство("ИнформацияОбОшибке") Тогда ВыполнитьФункцию("Провестидокумент", КонтекстРеализацииТоваровУслуг); КонецЕсли; ``` ## Поместить в очередь другой обработчик Помещается согласно типу на странице основное. Супер странная логика. ``` сшпПользовательскиеМетоды.ПоместитьВОчередьИсходящих("Справочник.ФизическиеЛица.БезРегистров", ОбъектОбработки.Ссылка); ``` > Пример: в обработчике Получить Справочник ФизическиеЛица ## Поместприть в очередь с проверкой Помещает ссылку в очередь, если элемент отсутствует в очереди со статусом Новый ``` ВыполнитьФункцию( "ПоместитьВОчередьИсходящихСПроверкой", "Справочник.Контрагенты.БезСвязанныхОбъектов", ОбъектОбработки ); ``` ## Не обновлять полное имя Актуально для документов, вроде Поступления ``` Контекст.Вставить("НеОбновлятьПолноеИмя", Истина); ``` ## Отменить обработку входящего сообщения ``` ВыполнитьФункцию("ОтменитьОбработкуСообщения", Контекст, "Контрагент по МДМ ключу не найден"); ОтменитьТранзакцию(); Перейти ~Выход; ``` В конце: ``` ~Выход: ``` ## Отложить обработку сообщения ``` ОтложитьОбработкуСообщения(Контекст, Задержка) ``` ``` Если Не ЗначениеЗаполнено(Контекст.ДанныеОбъектаВ1с[0].ФизическоеЛицо) И КоличествоПопытокОжидания < 10 Тогда Задержка = 5; СостояниеСообщения = Перечисления.сшпСтатусыСообщений.ОжиданиеОбработки; ОтменитьТранзакцию(); Перейти ~Выход; КонецЕсли; И в конце добавить: ~Выход: ``` ## Отложить потом отменить ``` Если Не ЗначениеЗаполнено(ДанныеОбъектаВ1с.Владелец) Тогда Если КоличествоПопытокОжидания < 10 Тогда ВыполнитьФункцию("ОтложитьОбработкуСообщения", Контекст, 10); Иначе ВыполнитьФункцию( "ОтменитьОбработкуСообщения", Контекст, НСтр("ru = 'Не найден владелец.'") ); КонецЕсли; ОтменитьТранзакцию(); Перейти ~Выход; КонецЕсли; ``` ## Сразу отправлять назад ``` Если Контекст.ЗаписываемыйОбъект.ДополнительныеСвойства.Свойство("СШПНеобрабатывать") Тогда Контекст.ЗаписываемыйОбъект.ДополнительныеСвойства.Удалить("СШПНеобрабатывать"); КонецЕсли; ``` ## Контекст Структура с различными параметрамми и данными для обработки объекта. ## Инициализировать контекст записи объекта ``` ВыполнитьФункцию("ИнициализироватьКонтекстЗаписиОбъекта", Контекст); ``` ## НайтиСоздатьОбъект ## ЗаполнитьОбъект ## ЗаписатьОбъект ## ОбработатьИсключениеПриЗаписиОбъекта # Методы схем ## Получение свойст ``` C+ ДоговорЕРП = (bool) InitMessage.Properties.GetProperty("ДоговорЕРП").GetValue(); ДоговорУТ = (bool) InitMessage.Properties.GetProperty("ДоговорУТ").GetValue(); ДоговорДО = (bool) InitMessage.Properties.GetProperty("ДоговорДО").GetValue(); ДоговорБСО = (bool) InitMessage.Properties.GetProperty("ДоговорБСО").GetValue(); Convert.ToString(ТоварыИсточник.НДС) ``` # Трансформации ## Пример ``` ВтДокументПоступлениеТоваровУслуг.Дата = ДокументИмпПриемкаСтроительныхРаботУслуг.Дата; ВтДокументПоступлениеТоваровУслуг.ПометкаУдаления = ДокументИмпПриемкаСтроительныхРаботУслуг.ПометкаУдаления; ВтДокументПоступлениеТоваровУслуг.Проведен = ДокументИмпПриемкаСтроительныхРаботУслуг.Проведен; ВтДокументПоступлениеТоваровУслуг.ДатаВходящегоДокумента = ДокументИмпПриемкаСтроительныхРаботУслуг.ДатаВходящегоДокумента; ВтДокументПоступлениеТоваровУслуг.Комментарий = ДокументИмпПриемкаСтроительныхРаботУслуг.Комментарий; ВтДокументПоступлениеТоваровУслуг.КратностьВзаиморасчетов = ДокументИмпПриемкаСтроительныхРаботУслуг.КратностьВзаиморасчетов; ВтДокументПоступлениеТоваровУслуг.КурсВзаиморасчетов = ДокументИмпПриемкаСтроительныхРаботУслуг.КурсВзаиморасчетов; ВтДокументПоступлениеТоваровУслуг.НДСВключенВСтоимость = ДокументИмпПриемкаСтроительныхРаботУслуг.НДСВключенВСтоимость; ВтДокументПоступлениеТоваровУслуг.НомерВходящегоДокумента = ДокументИмпПриемкаСтроительныхРаботУслуг.НомерВходящегоДокумента; ВтДокументПоступлениеТоваровУслуг.СуммаВключаетНДС = ДокументИмпПриемкаСтроительныхРаботУслуг.СуммаВключаетНДС; ВтДокументПоступлениеТоваровУслуг.РучнаяКорректировка = ДокументИмпПриемкаСтроительныхРаботУслуг.РучнаяКорректировка; ВтДокументПоступлениеТоваровУслуг.ЕстьРасхождения = ДокументИмпПриемкаСтроительныхРаботУслуг.ЕстьРасхождения; ВтДокументПоступлениеТоваровУслуг.СуммаВключаетНДС = ДокументИмпПриемкаСтроительныхРаботУслуг.СуммаВключаетНДС; ВтДокументПоступлениеТоваровУслуг.ЭтоУниверсальныйДокумент = ДокументИмпПриемкаСтроительныхРаботУслуг.ЭтоУниверсальныйДокумент; ВтДокументПоступлениеТоваровУслуг.СуммаГарантийногоУдержания = ДокументИмпПриемкаСтроительныхРаботУслуг.СуммаГарантийногоУдержания; ВтДокументПоступлениеТоваровУслуг.Д_СуммаЗачетенныхАвансов = ДокументИмпПриемкаСтроительныхРаботУслуг.Д_СуммаЗачетенныхАвансов; ВтДокументПоступлениеТоваровУслуг.Д_СуммаВозмещаемыхУслуг_Общая = ДокументИмпПриемкаСтроительныхРаботУслуг.Д_СуммаВозмещаемыхУслуг; CommonFunctions.CopyMatchingProperties(ДокументИмпПриемкаСтроительныхРаботУслуг.ВалютаДокумента, ВтДокументПоступлениеТоваровУслуг.ВалютаДокумента); CommonFunctions.CopyMatchingProperties(ДокументИмпПриемкаСтроительныхРаботУслуг.ДоговорКонтрагента, ВтДокументПоступлениеТоваровУслуг.ДоговорКонтрагента); CommonFunctions.CopyMatchingProperties(ДокументИмпПриемкаСтроительныхРаботУслуг.Контрагент, ВтДокументПоступлениеТоваровУслуг.Контрагент); CommonFunctions.CopyMatchingProperties(ДокументИмпПриемкаСтроительныхРаботУслуг.Организация, ВтДокументПоступлениеТоваровУслуг.Организация); CommonFunctions.CopyMatchingProperties(ДокументИмпПриемкаСтроительныхРаботУслуг.Ответственный, ВтДокументПоступлениеТоваровУслуг.Ответственный); CommonFunctions.CopyMatchingProperties(ДокументИмпПриемкаСтроительныхРаботУслуг.СчетУчетаРасчетовПоАвансам, ВтДокументПоступлениеТоваровУслуг.СчетУчетаРасчетовПоАвансам); CommonFunctions.CopyMatchingProperties(ДокументИмпПриемкаСтроительныхРаботУслуг.СчетУчетаРасчетовСКонтрагентом, ВтДокументПоступлениеТоваровУслуг.СчетУчетаРасчетовСКонтрагентом); CommonFunctions.CopyMatchingProperties(ДокументИмпПриемкаСтроительныхРаботУслуг.Грузоотправитель, ВтДокументПоступлениеТоваровУслуг.Грузоотправитель); CommonFunctions.CopyMatchingProperties(ДокументИмпПриемкаСтроительныхРаботУслуг.Грузополучатель, ВтДокументПоступлениеТоваровУслуг.Грузополучатель); CommonFunctions.CopyMatchingProperties(ДокументИмпПриемкаСтроительныхРаботУслуг.СчетУчетаРасчетовПоТаре, ВтДокументПоступлениеТоваровУслуг.СчетУчетаРасчетовПоТаре); foreach (var Element in ДокументИмпПриемкаСтроительныхРаботУслуг.Услуги) { var NewElement = ВтДокументПоступлениеТоваровУслуг.Услуги.AddElement(); CommonFunctions.CopyMatchingProperties(Element, NewElement); CommonFunctions.CopyMatchingProperties(Element.СчетЗатрат, NewElement.СчетЗатрат); CommonFunctions.CopyMatchingProperties(Element.СчетЗатратНУ, NewElement.СчетЗатратНУ); CommonFunctions.CopyMatchingProperties(Element.Субконто1, NewElement.Субконто1); CommonFunctions.CopyMatchingProperties(Element.Субконто2, NewElement.Субконто2); CommonFunctions.CopyMatchingProperties(Element.Субконто3, NewElement.Субконто3); CommonFunctions.CopyMatchingProperties(Element.СчетУчетаНДС, NewElement.СчетУчетаНДС); } foreach (var Element in ДокументИмпПриемкаСтроительныхРаботУслуг.ЗачетАвансов) { var NewElement = ВтДокументПоступлениеТоваровУслуг.ЗачетАвансов.AddElement(); NewElement.СуммаЗачета = Element.СуммаЗачета; } ``` # Обработчики ## Эталонный отправки из платформ в 1с ``` Попытка НачатьТранзакцию(); Контекст = Новый Структура; Контекст.Вставить("ЭтотОбъект", ЭтотОбъект); ВыполнитьФункцию("ИнициализироватьКонтекстЗаписиОбъекта", Контекст); ВыполнитьФункцию("НайтиСоздатьОбъект", Контекст); ВыполнитьФункцию("ЗаполнитьОбъект", Контекст); ВыполнитьФункцию("ЗаписатьОбъект", Контекст); ЗафиксироватьТранзакцию(); Исключение Если ТранзакцияАктивна() Тогда ОтменитьТранзакцию(); КонецЕсли; Контекст.Вставить("ИнформацияОбОшибке", ИнформацияОбОшибке()); ВыполнитьФункцию("ОбработатьИсключениеПриЗаписиОбъекта", Контекст); КонецПопытки; ``` ## Расширение функционала универсальных функций ### Сначала документ записывается, затем проводится если был проведен ``` Если ЗагружаемыйОбъект.Проведен Тогда Контекст.Вставить("РежимЗаписи", РежимЗаписиДокумента.Проведение); КонецЕсли; ``` ### Удобное встраивание вместо БА ``` ЗагружаемыйОбъект = Контекст.ЗаписываемыйОбъект; ПреобразованнаяСтруктура = Контекст.ПреобразованныеДанные[0]; ``` ### Поиск значений ``` ПараметрыПоиска = ОбщегоНазначения.СкопироватьРекурсивно(Контекст); // СчетКапВложенийБУ ИмяПоляИсточник = "СчетЗатрат"; ИмяПоляПриемник = "СчетКапВложенийБУ"; ОписаниеТипа = Новый ОписаниеТипов("ПланСчетовСсылка.Хозрасчетный"); ЗначениеСвойства = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(СтрокаУслуги, ИмяПоляИсточник); ЗначениеСвойстваВ1с = ВыполнитьФункцию("ЗначениеРеквизита", ЗначениеСвойства, ОписаниеТипа, ПараметрыПоиска, ИмяПоляИсточник); СтрокаЗатраты[ИмяПоляПриемник] = ЗначениеСвойстваВ1с; ``` # Примеры ## Создание нескольких типов в обработчике отправки в 1с ``` Попытка НачатьТранзакцию(); Контекст = Новый Структура; Контекст.Вставить("ЭтотОбъект", ЭтотОбъект); ВыполнитьФункцию("ИнициализироватьКонтекстЗаписиОбъекта", Контекст); Контекст.Вставить("ЗаписываемыйОбъект", ВыполнитьФункцию("НайтиКонтрагентаПоКонтексту", Контекст)); ВыполнитьФункцию("НайтиСоздатьОбъект", Контекст); ВыполнитьФункцию("ЗаполнитьОбъект", Контекст); КонтекстПартнера = Новый Структура; КонтекстПартнера.Вставить("ТипДанных", "Справочник.Партнеры"); КонтекстПартнера.Вставить("ЭтотОбъект", ЭтотОбъект); ВыполнитьФункцию("ИнициализироватьКонтекстЗаписиОбъекта", КонтекстПартнера); КонтекстПартнера.ПреобразованныеДанные[0].Идентификатор = XMLСтрока(Новый УникальныйИдентификатор); Если ЗначениеЗаполнено(Контекст.ЗаписываемыйОбъект.Партнер) Тогда КонтекстПартнера.Вставить("ЗаписываемыйОбъект", Контекст.ЗаписываемыйОбъект.Партнер.ПолучитьОбъект()); КонецЕсли; ВыполнитьФункцию("НайтиСоздатьОбъект", КонтекстПартнера); ВыполнитьФункцию("ЗаполнитьОбъект", КонтекстПартнера); КонтекстПартнера.ЗаписываемыйОбъект.Клиент = Истина; КонтекстПартнера.ЗаписываемыйОбъект.Поставщик = Истина; КонтекстПартнера.ЗаписываемыйОбъект.ПрочиеОтношения = Истина; ВыполнитьФункцию("ЗаписатьОбъект", КонтекстПартнера); Если Не ЗначениеЗаполнено(Контекст.ЗаписываемыйОбъект.Партнер) Тогда Контекст.ЗаписываемыйОбъект.Партнер = КонтекстПартнера.ЗаписываемыйОбъект.Ссылка; КонецЕсли; Если ЗначениеЗаполнено(Контекст.ЗаписываемыйОбъект.Партнер) Тогда ПартнерыИКонтрагенты.ЗаписатьИерархиюПартнера(Контекст.ЗаписываемыйОбъект.Партнер); КонецЕсли; СтруктураОбъекта = КонтекстПартнера.ПреобразованныеДанные[0]; Если Контекст.ЗаписываемыйОбъект.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо И Контекст.ЗаписываемыйОбъект.СтранаРегистрации = Справочники.СтраныМира.Россия Тогда Контекст.ЗаписываемыйОбъект.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо; ИначеЕсли Контекст.ЗаписываемыйОбъект.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо И Контекст.ЗаписываемыйОбъект.СтранаРегистрации <> Справочники.СтраныМира.Россия Тогда Контекст.ЗаписываемыйОбъект.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицоНеРезидент; ИначеЕсли Контекст.ЗаписываемыйОбъект.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо И ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(СтруктураОбъекта, "ИндивидуальныйПредприниматель") <> Истина Тогда Контекст.ЗаписываемыйОбъект.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо; ИначеЕсли Контекст.ЗаписываемыйОбъект.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо И ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(СтруктураОбъекта, "ИндивидуальныйПредприниматель") = Истина Тогда Контекст.ЗаписываемыйОбъект.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ИндивидуальныйПредприниматель; КонецЕсли; Контекст.ЗаписываемыйОбъект.ДополнительныеСвойства.Вставить("ИгнорироватьКонтрольИНН"); Контекст.ЗаписываемыйОбъект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов"); ВыполнитьФункцию("ЗаписатьОбъект", Контекст); ЗафиксироватьТранзакцию(); Исключение Если ТранзакцияАктивна() Тогда ОтменитьТранзакцию(); КонецЕсли; Контекст.Вставить("ИнформацияОбОшибке", ИнформацияОбОшибке()); ВыполнитьФункцию("ОбработатьИсключениеПриЗаписиОбъекта", Контекст); КонецПопытки; ```