diff --git a/build.gradle.kts b/build.gradle.kts index ae72d26..59e9c65 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -42,6 +42,7 @@ dependencies { implementation("org.commonmark", "commonmark-ext-heading-anchor", commonmarkVersion) testImplementation("org.junit.jupiter", "junit-jupiter-api", "6.0.3") + testImplementation("org.junit.jupiter", "junit-jupiter-params", "6.0.3") testImplementation("org.assertj", "assertj-core", "3.27.7") testImplementation("org.mockito", "mockito-core", "5.21.0") testImplementation("org.sonarsource.sonarqube", "sonar-testing-harness", sonarQubeVersion) { diff --git a/src/main/java/com/github/_1c_syntax/bsl/sonar/BSLHighlighter.java b/src/main/java/com/github/_1c_syntax/bsl/sonar/BSLHighlighter.java index dc51425..b3c75a7 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/sonar/BSLHighlighter.java +++ b/src/main/java/com/github/_1c_syntax/bsl/sonar/BSLHighlighter.java @@ -28,11 +28,13 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Tokenizer; import org.eclipse.lsp4j.Range; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.sensor.SensorContext; +import org.sonar.api.batch.sensor.highlighting.NewHighlighting; import org.sonar.api.batch.sensor.highlighting.TypeOfText; import javax.annotation.Nullable; @@ -45,6 +47,7 @@ import java.util.Set; import java.util.stream.Collectors; +@Slf4j @RequiredArgsConstructor public class BSLHighlighter { @@ -158,19 +161,29 @@ public void saveHighlighting(InputFile inputFile, DocumentContext documentContex highlightingData.stream() .filter(HighlightingData::isActive) - .forEach(data -> - highlighting.highlight( - data.getRange().getStart().getLine(), - data.getRange().getStart().getCharacter(), - data.getRange().getEnd().getLine(), - data.getRange().getEnd().getCharacter(), - data.getType() - ) - ); + .forEach(data -> applyHighlighting(highlighting, data, inputFile)); highlighting.save(); } + private static void applyHighlighting( + NewHighlighting highlighting, + HighlightingData data, + InputFile inputFile + ) { + try { + highlighting.highlight( + data.getRange().getStart().getLine(), + data.getRange().getStart().getCharacter(), + data.getRange().getEnd().getLine(), + data.getRange().getEnd().getCharacter(), + data.getType() + ); + } catch (IllegalArgumentException e) { + LOGGER.error("Unable to highlight file {}", inputFile, e); + } + } + public void highlightToken( Token token, Collection highlightingData, @@ -184,6 +197,11 @@ public void highlightToken( var charPositionInLine = token.getCharPositionInLine(); var tokenText = token.getText().stripTrailing(); + var newlineIndex = tokenText.indexOf('\n'); + if (newlineIndex >= 0) { + tokenText = tokenText.substring(0, newlineIndex).stripTrailing(); + } + var range = Ranges.create( line, charPositionInLine, diff --git a/src/test/java/com/github/_1c_syntax/bsl/sonar/BSLHighlighterTest.java b/src/test/java/com/github/_1c_syntax/bsl/sonar/BSLHighlighterTest.java index cc94581..5c37788 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/sonar/BSLHighlighterTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/sonar/BSLHighlighterTest.java @@ -30,6 +30,8 @@ import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Vocabulary; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.sensor.highlighting.TypeOfText; import org.sonar.api.batch.sensor.internal.SensorContextTester; @@ -45,6 +47,7 @@ import java.util.stream.IntStream; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatNoException; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -130,6 +133,56 @@ void testMergeHighlightingTokens() { } + @ParameterizedTest(name = "{0}") + @ValueSource(strings = { + // Tab-indented query: ensures tabs producing position differences do not crash highlighting. + "highlightLongQuery.bsl", + // СГРУППИРОВАТЬ ПО on separate BSL continuation lines -> single multiline SDBL token. + "highlightCrmQuery.bsl", + // ИНДЕКСИРОВАТЬ ПО on separate lines (reproduces PR #424 comment from ERP 2.5 module). + "highlightErpIndexByQuery.bsl", + // Real-world reproducer from issue #318 (CRM_КлиентыСервер.bsl attachment). + "CRM_КлиентыСервер.bsl" + }) + void testHighlightingDoesNotThrowOnFile(String fileName) { + // given + context = SensorContextTester.create(Path.of(".")); + highlighter = new BSLHighlighter(context); + var baseDirName = "src/test/resources/examples"; + var path = Path.of(baseDirName, fileName); + documentContext = BSLLSBinding.getServerContext().addDocument(path.toUri()); + BSLLSBinding.getServerContext().rebuildDocument(documentContext); + inputFile = Tools.inputFileBSL(fileName, Path.of(baseDirName).toFile()); + + // when/then - should not throw, even for multiline SDBL tokens or tab-indented queries + assertThatNoException().isThrownBy(() -> + highlighter.saveHighlighting(inputFile, documentContext) + ); + } + + @Test + void testSaveHighlightingWithInvalidTokenPosition() { + // given + context = SensorContextTester.create(Path.of(".")); + highlighter = new BSLHighlighter(context); + documentContext = mock(DocumentContext.class); + + // Create a token with position exceeding line length + var token = new CommonToken(BSLLexer.IF_KEYWORD, "Если"); + token.setLine(1); + token.setCharPositionInLine(20); + + when(documentContext.getTokens()).thenReturn(List.of(token)); + + // Create InputFile with short content (line has less than 20 characters) + inputFile = Tools.inputFileBSL(FILE_NAME, BASE_DIR, "А = 1;"); + + // when/then - should not throw + assertThatNoException().isThrownBy(() -> + highlighter.saveHighlighting(inputFile, documentContext) + ); + } + private void testHighlighting(Vocabulary vocabulary, Map highlightingMap) { // given initContext(vocabulary); diff --git "a/src/test/resources/examples/CRM_\320\232\320\273\320\270\320\265\320\275\321\202\321\213\320\241\320\265\321\200\320\262\320\265\321\200.bsl" "b/src/test/resources/examples/CRM_\320\232\320\273\320\270\320\265\320\275\321\202\321\213\320\241\320\265\321\200\320\262\320\265\321\200.bsl" new file mode 100644 index 0000000..2bfa5b9 --- /dev/null +++ "b/src/test/resources/examples/CRM_\320\232\320\273\320\270\320\265\320\275\321\202\321\213\320\241\320\265\321\200\320\262\320\265\321\200.bsl" @@ -0,0 +1,2856 @@ + +//////////////////////////////////////////////////////////////////////////////// +// Клиенты сервер +// +//////////////////////////////////////////////////////////////////////////////// +#Область СлужебныеПроцедурыИФункции + +//////////////////////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ПАРТНЕРАМИ И КЛ + +// Функция отделяет часть наименования физического лица (обращение и ФИО). +// +// Параметры: +// ИсходнаяСтрока - Строка - Строка наименования, у которого надо отделить часть. +// +// Возвращаемое значение: +// Строка - Выделенная часть наименования. +// +Функция ВыделитьЧастьНаименованияКонтактногоЛица(ИсходнаяСтрока) Экспорт + Буфер = СокрЛ(ИсходнаяСтрока); + ПозицияПослПробела = Найти(Буфер, " "); + Если ПозицияПослПробела = 0 Тогда + ИсходнаяСтрока = ""; + Возврат Буфер; + КонецЕсли; + ВыделенноеСлово = СокрЛП(Лев(Буфер, ПозицияПослПробела)); + ИсходнаяСтрока = Сред(ИсходнаяСтрока, ПозицияПослПробела + 1); + Возврат ВыделенноеСлово; +КонецФункции // ВыделитьЧастьНаименованияКонтактногоЛица() + +// Функция определяет пол человека по его имени. +// +// Параметры: +// Имя – Строка – Имя, по последней букве которого пытаемся определить пол. +// +// Возвращаемое значение: +// ПеречислениеСсылка – Пол человека, определенный по его имени. +// +Функция ОпределитьПол(Имя) Экспорт + СписокМужскихИсключений = Новый СписокЗначений; + СписокМужскихИсключений.Добавить("ИЛЬЯ"); + СписокМужскихИсключений.Добавить("НИКОЛА"); + СписокМужскихИсключений.Добавить("САВВА"); + СписокМужскихИсключений.Добавить("КУЗЬМА"); + СписокМужскихИсключений.Добавить("НИКИТА"); + СписокМужскихИсключений.Добавить("ДАНИЛА"); + СписокМужскихИсключений.Добавить("ЕМЕЛЯ"); + СписокЖенскихИсключений = Новый СписокЗначений; + СписокЖенскихИсключений.Добавить("ЛЮБОВЬ"); + Окончание = ВРег(Прав(СокрП(Имя),1)); + Если (Найти("АЯ",Окончание) И СписокМужскихИсключений.НайтиПоЗначению(ВРег(Имя)) = Неопределено) Или + СписокЖенскихИсключений.НайтиПоЗначению(ВРег(Имя)) <> Неопределено Тогда // Вероятно женщина + Пол = ПредопределенноеЗначение("Перечисление.ПолФизическогоЛица.Женский"); + Иначе + Пол = ПредопределенноеЗначение("Перечисление.ПолФизическогоЛица.Мужской"); + КонецЕсли; + Возврат Пол; +КонецФункции // ОпределитьПол() + +// Фукнция возвращает вид партнера Компания/Частное лицо. +Функция ПолучитьВидПартнера(Партнер) Экспорт + Если ТипЗнч(Партнер) = Тип("СправочникСсылка.Партнеры") Тогда + Возврат Партнер.ЮрФизЛицо; + Иначе + Возврат Перечисления.КомпанияЧастноеЛицо.ПустаяСсылка(); + КонецЕсли; +КонецФункции + +//////////////////////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ПОЛНОТЕКСТОВОГО ПОИСКА + +// Процедура проверяет и добавляет обязательные элементы списка выбора поля поиска. +// +// Параметры: +// СписокВыбора - СписокЗначений - Список выбора поля поиска. +// +Процедура СкорректироватьСоставСпискаВыбораПоляПоиска(СписокВыбора) Экспорт + МассивУдалить = Новый Массив(); + МассивУдалить.Добавить("[Поиск по полному названию]"); + МассивУдалить.Добавить("[ПоискПоПолномуНазванию]"); + МассивУдалить.Добавить("[Поиск]"); + МассивУдалить.Добавить("[Поиск по подстроке]"); + МассивУдалить.Добавить("[ПоискПоПодстроке]"); + + Для Каждого ЗначениеУдалить Из МассивУдалить Цикл + Пока СписокВыбора.НайтиПоЗначению(ЗначениеУдалить) <> Неопределено Цикл + СписокВыбора.Удалить(СписокВыбора.НайтиПоЗначению(ЗначениеУдалить)); + КонецЦикла; + КонецЦикла; +КонецПроцедуры + +// Процедура сохраняет настройки полнотекстового поиска. +// +Процедура ПолнотекстовыйПоискПриЗакрытииНаСервере(Форма, ИмяНастройкиПоискПоПодстроке) Экспорт + Попытка CRM_ХранилищеНастроек.Сохранить(ИмяНастройкиПоискПоПодстроке,, Форма.ПоискПоПодстроке); + Исключение КонецПопытки; +КонецПроцедуры + +// Процедура определяет доступность полнотекстового поиска в формах списка и выбора справочника. +// +// Параметры: +// Форма - УправляемаяФорма - Форма, для которой определяется доступность. +// ИмяНастройкиИсторияПоиска - Строка - Идентификатор настройки истории поиска. +// ИмяНастройкиПоискПоПодстроке - Строка - Идентификатор настройки флага поиска по подстроке. +// +Процедура ДоступностьПолнотекстовыйПоискСписок(Форма, ИмяНастройкиИсторияПоиска, ИмяНастройкиПоискПоПодстроке) Экспорт + // Настроим видимость элементов. + Форма.РасширенныйПоиск = Ложь; + Если ПолучитьФункциональнуюОпцию("ИспользоватьПолнотекстовыйПоиск") И ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() = РежимПолнотекстовогоПоиска.Разрешить Тогда + Попытка + ПоискПоПодстрокеСохр = CRM_ХранилищеНастроек.Загрузить(ИмяНастройкиПоискПоПодстроке); + Если ТипЗнч(ПоискПоПодстрокеСохр) = Тип("Булево") Тогда + Форма.ПоискПоПодстроке = ПоискПоПодстрокеСохр; + КонецЕсли; + Исключение + КонецПопытки; + + Попытка + Если Форма.ПоискПоПодстроке Тогда + Форма.Элементы.СтрокаПоиска.ПодсказкаВвода = НСтр("ru='[Поиск по подстроке]';en='[Поиск по подстроке]'"); + Иначе + Форма.Элементы.СтрокаПоиска.ПодсказкаВвода = НСтр("ru = '[Поиск по полному названию]'"); + КонецЕсли; + Форма.Элементы.СтрокаПоиска.Подсказка = Форма.Элементы.СтрокаПоиска.ПодсказкаВвода; + Исключение + КонецПопытки; + + ИсторияПоиска = ХранилищеОбщихНастроек.Загрузить(ИмяНастройкиИсторияПоиска); + Если ИсторияПоиска <> Неопределено Тогда + Попытка Форма.СтрокаПоискаСписокВыбора.ЗагрузитьЗначения(ИсторияПоиска); + Исключение Форма.Элементы.СтрокаПоиска.СписокВыбора.ЗагрузитьЗначения(ИсторияПоиска); + КонецПопытки; + КонецЕсли; + + Попытка СкорректироватьСоставСпискаВыбораПоляПоиска(Форма.СтрокаПоискаСписокВыбора); + Исключение СкорректироватьСоставСпискаВыбораПоляПоиска(Форма.Элементы.СтрокаПоиска.СписокВыбора); + КонецПопытки; + + Форма.ИндексППДАктуален = ПолнотекстовыйПоиск.ИндексАктуален(); + + Иначе + Форма.Элементы.СтрокаПоиска.Видимость = Ложь; + + Попытка Форма.Элементы.ГруппаПоиск.Видимость = Ложь; + Исключение КонецПопытки; + Попытка Форма.Элементы.ФормаНайти.Видимость = Истина; + Исключение КонецПопытки; + Попытка Форма.Элементы.ФормаОтменитьПоиск.Видимость = Истина; + Исключение КонецПопытки; + Попытка Форма.Элементы.Найти.Видимость = Истина; + Исключение КонецПопытки; + Попытка Форма.Элементы.ОтменаПоиска.Видимость = Истина; + Исключение КонецПопытки; + Попытка Форма.Элементы.ОтменитьПоиск.Видимость = Истина; + Исключение КонецПопытки; + + КонецЕсли; + +КонецПроцедуры // ДоступностьПолнотекстовыйПоискСписок() + +// Процедура определяет доступность полнотекстового поиска в формах списка и выбора справочника "Партнеры". +// +// Параметры: +// Форма - УправляемаяФорма - Форма, для которой определяется доступность. +// +Процедура ДоступностьПолнотекстовыйПоискСписокПартнеры(Форма) Экспорт + ДоступностьПолнотекстовыйПоискСписок(Форма, "ИсторияПоискаПартнеров", "ПартнерыФормаСпискаПоискПоПодстроке"); +КонецПроцедуры // ДоступностьПолнотекстовыйПоискСписокПартнеры() + +// Процедура определяет доступность полнотекстового поиска в формах списка Бизнес-процессов. +// +// Параметры: +// Форма - УправляемаяФорма - Форма, для которой определяется доступность. +// +Процедура ДоступностьПолнотекстовыйПоискСписокБизнесПроцессы(Форма) Экспорт + ДоступностьПолнотекстовыйПоискСписок(Форма, "ИсторияПоискаБизнесПроцессов", "БизнесПроцессыФормаСпискаПоискПоПодстроке"); +КонецПроцедуры // ДоступностьПолнотекстовыйПоискСписокБизнесПроцессы() + +// Функция находит партнеров по заданным условиям. +// +// Параметры: +// Форма - УправляемаяФорма - Форма, на которой выполняется поиск. +// +// Возвращаемое значение: +// Строка - Текст ошибки +// +Функция НайтиПартнеровПолнотекстовыйПоиск(Форма) Экспорт + ТаблицаОснований = Форма.РеквизитФормыВЗначение("Основания"); + // Получим результаты поиска + Попытка + СтрокаДляПоиска = ?(Форма.ПоискПоПодстроке, "" + Форма.СтрокаПоиска + "*", Форма.СтрокаПоиска); + Исключение + СтрокаДляПоиска = Форма.СтрокаПоиска; + КонецПопытки; + ТекстОшибки = CRM_МетодыМодулейОбъектовСправочников.НайтиПартнеров(СтрокаДляПоиска, ТаблицаОснований); + Если ТекстОшибки = Неопределено Тогда + // Удалим элемент из истории поиска если он там был. + НомерНайденногоЭлементаСписка = Форма.СтрокаПоискаСписокВыбора.НайтиПоЗначению(Форма.СтрокаПоиска); + Пока НомерНайденногоЭлементаСписка <> Неопределено Цикл + Форма.СтрокаПоискаСписокВыбора.Удалить(НомерНайденногоЭлементаСписка); + НомерНайденногоЭлементаСписка = Форма.СтрокаПоискаСписокВыбора.НайтиПоЗначению(Форма.СтрокаПоиска); + КонецЦикла; + // Поставим элемент на первое место. + Форма.СтрокаПоискаСписокВыбора.Вставить(0, Форма.СтрокаПоиска); + Пока Форма.СтрокаПоискаСписокВыбора.Количество() > 100 Цикл + Форма.СтрокаПоискаСписокВыбора.Удалить(Форма.СтрокаПоискаСписокВыбора.Количество() - 1); + КонецЦикла; + ХранилищеОбщихНастроек.Сохранить("ИсторияПоискаПартнеров", , Форма.СтрокаПоискаСписокВыбора.ВыгрузитьЗначения()); + // Возвращаем таблицу оснований. + Форма.ЗначениеВРеквизитФормы(ТаблицаОснований, "Основания"); + // Устанавливаем отбор по списку найденных партнеров. + #Если НЕ ВнешнееСоединение Тогда + CRM_ОбщегоНазначенияКлиентСервер.ИзменитьЭлементОтбораСписка(Форма.Список, "Ссылка", + ТаблицаОснований.ВыгрузитьКолонку("Партнер"), Истина, ВидСравненияКомпоновкиДанных.ВСписке); + #КонецЕсли + Форма.Элементы.СтрокаПоиска.ЦветФона = ЦветаСтиля.ЦветФонаПоля; + + СкорректироватьСоставСпискаВыбораПоляПоиска(Форма.СтрокаПоискаСписокВыбора); + + Возврат Неопределено; + КонецЕсли; + Форма.Элементы.СтрокаПоиска.ЦветФона = ЦветаСтиля.ОшибкаПолнотекстовыйПоискФон; + + СкорректироватьСоставСпискаВыбораПоляПоиска(Форма.СтрокаПоискаСписокВыбора); + + Возврат ТекстОшибки; +КонецФункции // НайтиПартнеровПолнотекстовыйПоиск() + +// Функция находит партнеров по заданным условиям. +// +// Параметры: +// Форма - УправляемаяФорма - Форма, на которой выполняется поиск. +// +// Возвращаемое значение: +// Строка - Текст ошибки +// +Функция НайтиБизнесПроцессыПолнотекстовыйПоиск(Форма) Экспорт + ТаблицаОснований = Форма.РеквизитФормыВЗначение("Основания"); + // Получим результаты поиска + Попытка + СтрокаДляПоиска = ?(Форма.ПоискПоПодстроке, "" + Форма.СтрокаПоиска + "*", Форма.СтрокаПоиска); + Исключение + СтрокаДляПоиска = Форма.СтрокаПоиска; + КонецПопытки; + ТекстОшибки = БизнесПроцессы.CRM_БизнесПроцесс.НайтиБизнесПроцессы(СтрокаДляПоиска, ТаблицаОснований); + Если ТекстОшибки = Неопределено Тогда + // Удалим элемент из истории поиска если он там был. + НомерНайденногоЭлементаСписка = Форма.СтрокаПоискаСписокВыбора.НайтиПоЗначению(Форма.СтрокаПоиска); + Пока НомерНайденногоЭлементаСписка <> Неопределено Цикл + Форма.СтрокаПоискаСписокВыбора.Удалить(НомерНайденногоЭлементаСписка); + НомерНайденногоЭлементаСписка = Форма.СтрокаПоискаСписокВыбора.НайтиПоЗначению(Форма.СтрокаПоиска); + КонецЦикла; + // Поставим элемент на первое место. + Форма.СтрокаПоискаСписокВыбора.Вставить(0, Форма.СтрокаПоиска); + Пока Форма.СтрокаПоискаСписокВыбора.Количество() > 100 Цикл + Форма.СтрокаПоискаСписокВыбора.Удалить(Форма.СтрокаПоискаСписокВыбора.Количество() - 1); + КонецЦикла; + ХранилищеОбщихНастроек.Сохранить("ИсторияПоискаБизнесПроцессов", , Форма.СтрокаПоискаСписокВыбора.ВыгрузитьЗначения()); + // Возвращаем таблицу оснований. + Форма.ЗначениеВРеквизитФормы(ТаблицаОснований, "Основания"); + Форма.Элементы.Список.Отображение = ОтображениеТаблицы.Список; + // Устанавливаем отбор по списку найденных партнеров. + #Если НЕ ВнешнееСоединение Тогда + CRM_ОбщегоНазначенияКлиентСервер.ИзменитьЭлементОтбораСписка(Форма.Список, "Ссылка", + ТаблицаОснований.ВыгрузитьКолонку("БизнесПроцесс"), Истина, ВидСравненияКомпоновкиДанных.ВСписке); + #КонецЕсли + Форма.Элементы.СтрокаПоиска.ЦветФона = ЦветаСтиля.ЦветФонаПоля; + Возврат Неопределено; + КонецЕсли; + Форма.Элементы.СтрокаПоиска.ЦветФона = ЦветаСтиля.ОшибкаПолнотекстовыйПоискФон; + Возврат ТекстОшибки; +КонецФункции // НайтиПартнеровПолнотекстовыйПоиск() + +// Процедура создает регламентное задание для оповещения о дне рождения. +// +// Параметры: +// Нет. +// +Процедура СоздатьЗадачиПоздравленияСДнемРождения() Экспорт + + // #ГК-ИН 20240410 { + Возврат; + // #ГК-ИН 20240410 } + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ТекДата", НачалоДня(CRM_ОбщегоНазначенияСервер.ПолучитьТекущуюДатуСеанса())); + Запрос.УстановитьПараметр("ПустаяДата", '00010101'); + Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Партнеры.Ссылка, + | Партнеры.Наименование, + | Партнеры.ДатаРождения КАК ДатаРождения, + | Партнеры.ОсновнойМенеджер, + | ""Партнер"" КАК ВидСправочника, + | NULL КАК РольКонтактногоЛица, + | NULL КАК Должность, + | NULL КАК Владелец + |ИЗ + | Справочник.Партнеры КАК Партнеры + |ГДЕ + | Партнеры.ДатаРождения <> &ПустаяДата + | И Партнеры.ОсновнойМенеджер <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + | И ДОБАВИТЬКДАТЕ(Партнеры.ДатаРождения, ГОД, ГОД(&ТекДата) - ГОД(Партнеры.ДатаРождения)) = &ТекДата + | И Партнеры.CRM_НапоминатьОДнеРождения + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | КонтактныеЛицаПартнеров.Ссылка, + | КонтактныеЛицаПартнеров.Наименование, + | КонтактныеЛицаПартнеров.ДатаРождения, + | КонтактныеЛицаПартнеров.Владелец.ОсновнойМенеджер, + | ""КЛ"", + | КонтактныеЛицаПартнеров.CRM_РольКонтактногоЛица, + | КонтактныеЛицаПартнеров.CRM_Должность, + | КонтактныеЛицаПартнеров.Владелец + |ИЗ + | Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров + |ГДЕ + | КонтактныеЛицаПартнеров.ДатаРождения <> &ПустаяДата + | И КонтактныеЛицаПартнеров.Владелец.ОсновнойМенеджер <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + | И ДОБАВИТЬКДАТЕ(КонтактныеЛицаПартнеров.ДатаРождения, ГОД, ГОД(&ТекДата) - ГОД(КонтактныеЛицаПартнеров.ДатаРождения)) = &ТекДата + | И КонтактныеЛицаПартнеров.CRM_НапоминатьОДнеРождения"; + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + ТемаНапоминания = НСтр("ru = 'Поздравить с днем рождения: '") + Строка(Выборка.Ссылка) + ?(Выборка.ВидСправочника = "КЛ"," (" + + Строка(Выборка.Владелец) + ")",""); + ОписаниеНапоминания = ?(Выборка.ВидСправочника = "КЛ", ?(НЕ ЗначениеЗаполнено(Выборка.РольКонтактногоЛица), "", + "Роль: " + Выборка.РольКонтактногоЛица + Символы.ПС) + ?(НЕ ЗначениеЗаполнено(Выборка.Должность), "", "Должность: " + + Выборка.Должность + Символы.ПС),""); + Исполняется = Строка(Окр((CRM_ОбщегоНазначенияСервер.ПолучитьТекущуюДатуСеанса() - Выборка.ДатаРождения)/(60*60*24*365))); + ОписаниеНапоминания =ТемаНапоминания + Символы.ПС+ ОписаниеНапоминания + НСтр("ru = 'Дата рождения: '") + + Формат(Выборка.ДатаРождения, "ДФ=dd.MM.yyyy") +Символы.ПС + НСтр("ru = 'Исполняется лет: '") + Исполняется; + Менеджер = РегистрыСведений.CRM_Напоминания.СоздатьМенеджерЗаписи(); + Менеджер.Предмет = Выборка.Ссылка; + Менеджер.Пользователь = Выборка.ОсновнойМенеджер; + Менеджер.ДатаНачала = НачалоДня(CRM_ОбщегоНазначенияСервер.ПолучитьТекущуюДатуСеанса()); + Менеджер.ДатаОповещения = НачалоДня(CRM_ОбщегоНазначенияСервер.ПолучитьТекущуюДатуСеанса()); + Менеджер.ДатаАктуальности = НачалоДня(CRM_ОбщегоНазначенияСервер.ПолучитьТекущуюДатуСеанса()) + 60 * 60 * 24; + Менеджер.Содержание = ОписаниеНапоминания; + Менеджер.Важность = Перечисления.ВариантыВажностиВзаимодействия.Высокая; + Менеджер.Записать(); + + КонецЦикла; +КонецПроцедуры // СоздатьЗадачиПоздравленияСДнемРождения() + +//////////////////////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ РАБОТЫ С ЖУРНАЛОМ ОБЪЕКТОВ КЛИЕНТА + +// Функция возвращает упорядоченный массив со всеми корректными элемента ПВХ. +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// Массив - Упорядоченный массив со всеми корректными элемента ПВХ. +// +Функция ПолучитьВсеЭлементыПВХОбъектыЖурнала(ПроверятьПрава = Ложь) Экспорт + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ОбъектыЖурнала.Ссылка КАК Ссылка, + | ОбъектыЖурнала.Наименование КАК Наименование, + | ОбъектыЖурнала.ТипЗначения КАК ТипЗначения + |ИЗ + | ПланВидовХарактеристик.CRM_ОбъектыЖурналаДокументов КАК ОбъектыЖурнала + |ГДЕ + | НЕ ОбъектыЖурнала.ПометкаУдаления + |УПОРЯДОЧИТЬ ПО + | Наименование ВОЗР + |"); + Если ПроверятьПрава Тогда + МассивОбъектов = Новый Массив(); + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Если Выборка.ТипЗначения.Типы().Количество() > 0 Тогда + Попытка + ОбъектМетаданных = Метаданные.НайтиПоТипу(Выборка.ТипЗначения.Типы()[0]); + Исключение + ОбъектМетаданных = Неопределено; + КонецПопытки; + Если ОбъектМетаданных <> Неопределено Тогда + Если Не ПравоДоступа("Чтение", ОбъектМетаданных) Тогда + Продолжить; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + МассивОбъектов.Добавить(Выборка.Ссылка); + КонецЦикла; + + Возврат МассивОбъектов; + Иначе + Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + КонецЕсли; +КонецФункции // ПолучитьВсеЭлементыПВХОбъектыЖурнала() + +// Функция возвращает имя метаданных типа "Документ.CRM_Взаимодействие" по ссылке на элемент ПВХ. +// +// Параметры: +// ПВХСсылка - ПланВидовХарактеристикСсылка - Ссылка на элемент ПВХ. +// +// Возвращаемое значение: +// Неопределено или Строка - Имя метаданных типа "Документ.CRM_Взаимодействие". +// +Функция ПолучитьПолноеИмяМетаданныхОбъектаПоСсылкеНаПВХОбъектыЖурнала(ПВХСсылка) Экспорт + Если НЕ ЗначениеЗаполнено(ПВХСсылка) Тогда Возврат Неопределено; КонецЕсли; + Попытка + Тип = ПВХСсылка.ТипЗначения.Типы()[0]; + МетаданныеПоТипу = Метаданные.НайтиПоТипу(Тип); + Если МетаданныеПоТипу = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + Попытка + ИмяБазовогоТипаПоОбъектуМетаданных = ОбщегоНазначения.ВидОбъектаПоТипу(Тип); + Исключение + ИмяБазовогоТипаПоОбъектуМетаданных = Неопределено; + КонецПопытки; + Если НЕ ЗначениеЗаполнено(ИмяБазовогоТипаПоОбъектуМетаданных) Тогда + Возврат Неопределено; + КонецЕсли; + Возврат ИмяБазовогоТипаПоОбъектуМетаданных + "." + МетаданныеПоТипу.Имя; + Исключение + Возврат Неопределено; + КонецПопытки; +КонецФункции // ПолучитьПолноеИмяМетаданныхОбъектаПоСсылкеНаПВХОбъектыЖурнала() + +// Функция возвращает ссылку на элемент ПВХ по метаданным объекта или по полному имени метаданных объекта. +// +// Параметры: +// МетаданныеОбъектаИлиПолноеИмяМетаданныхОбъекта - МетаданныеОбъекта или Строка - Метаданные объекта +// или полное имя метаданных объекта. +// +// Возвращаемое значение: +// Неопределено или Массив - Массив ссылок на элемент ПВХ. +// +Функция ПолучитьСсылкуПВХОбъектыЖурналаПоМетаданнымОбъекта(МетаданныеОбъектаИлиПолноеИмяМетаданныхОбъекта) Экспорт + МетаданныеОбъекта = Неопределено; + Если ТипЗнч(МетаданныеОбъектаИлиПолноеИмяМетаданныхОбъекта) = Тип("Строка") Тогда + Попытка МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(МетаданныеОбъектаИлиПолноеИмяМетаданныхОбъекта); + Исключение МетаданныеОбъекта = Неопределено; + КонецПопытки; + Иначе + МетаданныеОбъекта = МетаданныеОбъектаИлиПолноеИмяМетаданныхОбъекта; + КонецЕсли; + Если МетаданныеОбъекта = Неопределено Тогда Возврат Неопределено; КонецЕсли; + СсылочныйТипПоМетаданным = CRM_ОбщегоНазначенияСервер.ПолучитьСсылочныйТипПоМетаданнымОбъекта(МетаданныеОбъекта); + Если СсылочныйТипПоМетаданным = Неопределено Тогда + Возврат Неопределено; + Иначе + Возврат ПолучитьСсылкуПВХОбъектыЖурналаПоТипу(СсылочныйТипПоМетаданным); + КонецЕсли; +КонецФункции // ПолучитьСсылкуПВХОбъектыЖурналаПоМетаданнымОбъекта() + +// Функция возвращает массив элементов ПВХ по описанию типов. +// +// Параметры: +// ОписаниеТипов - ОписаниеТипов - Описание типов. +// ПолучатьПомеченныеНаУдаление - Булево - Признак получения помеченных на удаление. +// +// Возвращаемое значение: +// Неопределено или Массив - Массив элементов ПВХ. +// +Функция ПолучитьМассивЭлементовПВХОбъектыЖурналаПоОписаниюТипов(ОписаниеТипов, ПолучатьПомеченныеНаУдаление = Ложь) Экспорт + Результат = Новый Массив(); + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ОбъектыЖурнала.Ссылка КАК Ссылка, + | ОбъектыЖурнала.Наименование КАК Наименование, + | ОбъектыЖурнала.ТипЗначения КАК ТипЗначения + |ИЗ + | ПланВидовХарактеристик.CRM_ОбъектыЖурналаДокументов КАК ОбъектыЖурнала + |" + ?(ПолучатьПомеченныеНаУдаление, "", " + |ГДЕ + | НЕ ОбъектыЖурнала.ПометкаУдаления") + " + |"); + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Для Каждого Тип Из ОписаниеТипов.Типы() Цикл + Если Выборка.ТипЗначения.СодержитТип(Тип) Тогда + Результат.Добавить(Выборка.Ссылка); + Прервать; + КонецЕсли; + КонецЦикла; + КонецЦикла; + Возврат Результат; +КонецФункции // ПолучитьМассивЭлементовПВХОбъектыЖурналаПоОписаниюТипов() + +// Функция возвращает ссылку ПВХ по типу. +// +// Параметры: +// Тип - ОписаниеТипов - Тип элемента ПВХ. +// ПолучатьПомеченныеНаУдаление - Булево - Признак получения помеченных на удаление. +// МассивСсылок - Массив - Массив элементов ПВХ. +// +// Возвращаемое значение: +// Неопределено или Массив - Массив ссылок на элемент ПВХ. +// +Функция ПолучитьСсылкуПВХОбъектыЖурналаПоТипу(Тип, ПолучатьПомеченныеНаУдаление = Ложь, МассивСсылок = Неопределено) Экспорт + МассивТипов = Новый Массив(); + МассивТипов.Добавить(Тип); + ОписаниеТипов = Новый ОписаниеТипов(МассивТипов); + МассивСсылок = ПолучитьМассивЭлементовПВХОбъектыЖурналаПоОписаниюТипов(ОписаниеТипов, ПолучатьПомеченныеНаУдаление); + Если МассивСсылок.Количество() = 0 Тогда + Возврат Неопределено; + Иначе + Возврат МассивСсылок[0]; + КонецЕсли; +КонецФункции // ПолучитьСсылкуПВХОбъектыЖурналаПоТипу() + +// Процедура заполняет и проверяет корректность элементов ПВХ CRM_ОбъектыЖурналаДокументов, +// вызывается при обновлении конфигурации. +// +// Параметры: +// ПерезаписыватьНаименования - Булево - Признак перезаписи наименования. +// +Процедура ЗаполнитьПроверитьПВХОбъектыЖурнала(ПерезаписыватьНаименования = Ложь) Экспорт + Типы = Метаданные.ПланыВидовХарактеристик.CRM_ОбъектыЖурналаДокументов.Тип.Типы(); + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ОбъектыЖурнала.Ссылка КАК Ссылка, + | ОбъектыЖурнала.ТипЗначения КАК ТипЗначения + |ИЗ + | ПланВидовХарактеристик.CRM_ОбъектыЖурналаДокументов КАК ОбъектыЖурнала + |ГДЕ + | НЕ ОбъектыЖурнала.ПометкаУдаления + |"); + ТаблицаВсеЭлементы = Запрос.Выполнить().Выгрузить(); + ОписаниеТиповБулево = Новый ОписаниеТипов("Булево"); + ТаблицаВсеЭлементы.Колонки.Добавить("НеОбрабатывать", ОписаниеТиповБулево); + // Пометим на удаление заведомо неверные ссылки. + Для Каждого СтрокаТаблицы Из ТаблицаВсеЭлементы Цикл + Если СтрокаТаблицы.ТипЗначения.Типы().Количество() = 0 Или СтрокаТаблицы.ТипЗначения.Типы().Количество() > 1 Тогда + Объект = СтрокаТаблицы.Ссылка.ПолучитьОбъект(); + Объект.УстановитьПометкуУдаления(Истина); + СтрокаТаблицы.НеОбрабатывать = Истина; + КонецЕсли; + КонецЦикла; + ОписаниеТиповБулево = Новый ОписаниеТипов("Булево"); + МассивТиповДляСоздания = Новый Массив(); + МассивДублирующихсяТипов = Новый Массив(); + Для Каждого Тип Из Типы Цикл + СчетчикНайденныхТипов = 0; + Для Каждого СтрокаТаблицы Из ТаблицаВсеЭлементы Цикл + Если СтрокаТаблицы.НеОбрабатывать Тогда Продолжить; КонецЕсли; + Если СтрокаТаблицы.ТипЗначения.СодержитТип(Тип) Тогда + СчетчикНайденныхТипов = СчетчикНайденныхТипов + 1; + + Если ПерезаписыватьНаименования Тогда + Объект = СтрокаТаблицы.Ссылка.ПолучитьОбъект(); + Объект.Наименование = Строка(Тип); + Объект.Записать(); + КонецЕсли; + КонецЕсли; + КонецЦикла; + Если СчетчикНайденныхТипов = 0 Тогда + Если СтрНайти(ВРег(Метаданные.НайтиПоТипу(Тип).Имя), Врег("Удалить")) = 0 Тогда + МассивТиповДляСоздания.Добавить(Тип); + КонецЕсли; + ИначеЕсли СчетчикНайденныхТипов > 1 Тогда + МассивДублирующихсяТипов.Добавить(Тип); + КонецЕсли; + КонецЦикла; + // Создаем элементы + Если МассивТиповДляСоздания.Количество() > 0 Тогда + Для Каждого Тип Из МассивТиповДляСоздания Цикл + Попытка МетаданныеТипа = Метаданные.НайтиПоТипу(Тип); + Исключение МетаданныеТипа = Неопределено; + КонецПопытки; + Если МетаданныеТипа = Неопределено Тогда Продолжить; КонецЕсли; + МассивТипов = Новый Массив(); + МассивТипов.Добавить(Тип); + ОписаниеТипов = Новый ОписаниеТипов(МассивТипов); + Объект = ПланыВидовХарактеристик.CRM_ОбъектыЖурналаДокументов.СоздатьЭлемент(); + Объект.Наименование = МетаданныеТипа.Синоним; + Объект.ТипЗначения = ОписаниеТипов; + Объект.Записать(); + КонецЦикла; + КонецЕсли; + // Обработаем дублирующиеся типы. + Для Каждого Тип Из МассивДублирующихсяТипов Цикл + МассивДублирующихсяСсылок = Новый Массив(); + ПолучитьСсылкуПВХОбъектыЖурналаПоТипу(Тип,, МассивДублирующихсяСсылок); + Для Каждого ДублирующаясяСсылка Из МассивДублирующихсяСсылок Цикл + Массив = Новый Массив(); + Массив.Добавить(ДублирующаясяСсылка); + ТаблицаСсылок = НайтиПоСсылкам(Массив); + Если ТаблицаСсылок.Количество() = 0 Тогда + // Если на элемент ПВХ нет ссылок - ставим ему пометку удаления. + Объект = ДублирующаясяСсылка.ПолучитьОбъект(); + Объект.УстановитьПометкуУдаления(Истина); + КонецЕсли; + КонецЦикла; + КонецЦикла; + // Удаляем записи регистра сведений, связанные с помечаемыми на удаление элементами. + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ОбъектыЖурнала.Ссылка КАК Ссылка + |ИЗ + | ПланВидовХарактеристик.CRM_ОбъектыЖурналаДокументов КАК ОбъектыЖурнала + |ГДЕ + | ОбъектыЖурнала.ПометкаУдаления + |"); + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Запрос = Новый Запрос( + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ЖурналОбъектов.Клиент КАК Клиент, + | ЖурналОбъектов.Объект КАК Объект + |ИЗ + | РегистрСведений.CRM_ЖурналДокументов КАК ЖурналОбъектов + |ГДЕ + | ЖурналОбъектов.ТипОбъекта = &ТипОбъекта + |"); + Запрос.УстановитьПараметр("ТипОбъекта", Выборка.Ссылка); + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + МенеджерЗаписи = РегистрыСведений.CRM_ЖурналДокументов.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.Клиент = Выборка.Клиент; + МенеджерЗаписи.Объект = Выборка.Объект; + МенеджерЗаписи.Удалить(); + КонецЦикла; + КонецЦикла; +КонецПроцедуры // ЗаполнитьПроверитьПВХОбъектыЖурнала() + +// Процедура - обработчик подписки на событие "CRM_ПередЗаписьюОбъектаЖурнала". +// +// Параметры: +// Источник - Произвольный - Источник подписки. +// Отказ - Булево - Флаг отказа от подписки. +// РежимЗаписи - РежимЗаписиДокумента - Режим записи документа. +// РежимПроведения - РежимПроведенияДокумента - Режим проведения документа. +// +Процедура ПередЗаписьюОбъектаОбщегоЖурнала(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт + + Если Источник.ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если Отказ Тогда Возврат; КонецЕсли; + ТипИсточника = ТипЗнч(Источник.Ссылка); + + // Если Это вх. электронное письмо и оно не новое, тогда проверим не поменяли ли в не папку. + // + Если ТипЗнч(Источник) = Тип("ДокументОбъект.ЭлектронноеПисьмоВходящее") Тогда + Если Источник.ЭтоНовый() Тогда + CRM_ОбщегоНазначенияСервер.СвязатьВходящееПисьмоСИнтересом(Источник, Истина); + КонецЕсли; + ИначеЕсли ТипЗнч(Источник) = Тип("ДокументОбъект.ТелефонныйЗвонок") Тогда + Если Источник.ЭтоНовый() Тогда + CRM_ОбщегоНазначенияСервер.СвязатьТелефонныйЗвонокСИнтересом(Источник, Истина); + КонецЕсли; + ИначеЕсли ТипЗнч(Источник) = Тип("ДокументОбъект.CRM_СообщениеМессенджера") Тогда + Если Источник.ЭтоНовый() Тогда + CRM_ОбщегоНазначенияСервер.СвязатьСообщениеМессенджераСИнтересом(Источник, Истина); + КонецЕсли; + КонецЕсли; + + // Если Это вх. электронное письмо или СообщениеSMS и оно помечено на удаление + // то удалим связанные с ним записи оповещений, если они есть. + // + Если (ТипЗнч(Источник) = Тип("ДокументОбъект.ЭлектронноеПисьмоИсходящее") + ИЛИ ТипЗнч(Источник) = Тип("ДокументОбъект.СообщениеSMS")) И НЕ Источник.ЭтоНовый() Тогда + Если НЕ (Источник.ПометкаУдаления = Источник.Ссылка.ПометкаУдаления) И Источник.ПометкаУдаления Тогда + CRM_ОповещенияСервер.УдалитьОповещенияПоДокументу(Источник.Ссылка); + КонецЕсли; + КонецЕсли; + + // Получение элемента ПВХ, соответствующего источнику. + ТипОбъекта = ПолучитьСсылкуПВХОбъектыЖурналаПоТипу(ТипИсточника); + // Если не найдено элемента ПВХ, соответствующего записываемому объекту - ничего больше не делаем. + Если ТипОбъекта = Неопределено Тогда Возврат; КонецЕсли; + Если Источник.ЭтоНовый() И НЕ Источник.ДополнительныеСвойства.Свойство("ЭтоНовый") Тогда + Источник.ДополнительныеСвойства.Вставить("ЭтоНовый"); + КонецЕсли; + + Если ТипЗнч(Источник) = Тип("ДокументОбъект.CRM_Взаимодействие") Тогда + Если Источник.ЭтоНовый() Тогда + Источник.ДополнительныеСвойства.ЭтоНовый = Истина; + Если Источник.СостояниеИнтереса.Завершено Тогда + + Источник.ДополнительныеСвойства.Вставить("ИнтересЗавершен", Истина); + + ИначеЕсли ТипЗнч(Источник.ДокументОснование) = Тип("ДокументСсылка.CRM_Интерес") И Источник.ДокументОснование.СостояниеИнтереса <> Источник.СостояниеИнтереса Тогда + Источник.ДополнительныеСвойства.Вставить("ИзмененоСостояниеИнтереса", Истина); + КонецЕсли; + Иначе + // Поменяли состояние интереса + Если НЕ Источник.СостояниеИнтереса = Источник.Ссылка.СостояниеИнтереса Тогда + + // Поменялся статус взаимодействия + Если НЕ Источник.СтатусВзаимодействия = Источник.Ссылка.СтатусВзаимодействия Тогда + + // Завершили взаимодествие + Если Источник.СтатусВзаимодействия = Справочники.CRM_СостоянияСобытий.Завершено Тогда + + // Интерес закрыт или Потерян + Если Источник.СостояниеИнтереса.Завершено Тогда + + Источник.ДополнительныеСвойства.Вставить("ИнтересЗавершен", Истина); + + // Просто изменилось состояние интереса + Иначе + Источник.ДополнительныеСвойства.Вставить("ИзмененоСостояниеИнтереса", Истина); + КонецЕсли; + + // Отменили завершение взаимодествия + ИначеЕсли Источник.Ссылка.СтатусВзаимодействия = Справочники.CRM_СостоянияСобытий.Завершено Тогда + + Источник.ДополнительныеСвойства.Вставить("ИзмененоСостояниеИнтереса", Истина); + + КонецЕсли; + + Иначе + Если Источник.СостояниеИнтереса.Завершено Тогда + + Источник.ДополнительныеСвойства.Вставить("ИнтересЗавершен", Истина); + + Иначе + + Источник.ДополнительныеСвойства.Вставить("ИнтересОтменаЗавершения", Истина); + + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + КонецЕсли; + + // Проверим следующее: если это событие, не новое и изменен ответственный, + // то в доп. свойства добавим свойство "ИзмененОтветственный". + Если НЕ Источник.ЭтоНовый() И ТипЗнч(Источник) = Тип("ДокументОбъект.CRM_Взаимодействие") И (НЕ Источник.Ответственный = Источник.Ссылка.Ответственный) Тогда + Источник.ДополнительныеСвойства.Вставить("ИзмененОтветственный", Истина); + КонецЕсли; + +КонецПроцедуры // ПередЗаписьюОбъектаОбщегоЖурнала() + +// Процедура - обработчик подписки на событие "CRM_ПриЗаписиОбъектаКлиента". +// +// Параметры: +// Источник - Произвольный - Источник подписки. +// Отказ - Булево - Флаг отказа от подписки. +// +Процедура ЗарегистрироватьОбъектВОбщемЖурнале(Источник, Отказ) Экспорт + + Если Источник.ОбменДанными.Загрузка И Источник.ДополнительныеСвойства.Свойство("ОтключитьБизнесЛогику") Тогда + Возврат; + КонецЕсли; + + Если Источник.ДополнительныеСвойства.Свойство("НеРегистрироватьВЖурнале") И Источник.ДополнительныеСвойства.НеРегистрироватьВЖурнале Тогда + Возврат; + КонецЕсли; + + Если Отказ Тогда Возврат; КонецЕсли; + ТипИсточника = ТипЗнч(Источник.Ссылка); + // Получение элемента ПВХ, соответствующего источнику. + ТипОбъекта = ПолучитьСсылкуПВХОбъектыЖурналаПоТипу(ТипИсточника); + // Если не найдено элемента ПВХ, соответствующего записываемому объекту - ничего больше не делаем. + Если ТипОбъекта = Неопределено Тогда Возврат; КонецЕсли; + МетаданныеИсточника = Источник.Метаданные(); + // Набор записей с отбором по источнику. + НаборЗаписей = РегистрыСведений.CRM_ЖурналДокументов.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Объект.Установить(Источник.Ссылка); + ТаблицаЗаписей = НаборЗаписей.Выгрузить(); // Только для создания пустой таблицы с нужными колонками. + ЭтоДокумент = Метаданные.Документы.Содержит(МетаданныеИсточника); + Если ЭтоДокумент Тогда + ПроведениеДокументаРазрешено = (МетаданныеИсточника.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить); + Иначе + ПроведениеДокументаРазрешено = Ложь; + КонецЕсли; + + Попытка + ЭтоНовый = Источник.ДополнительныеСвойства.Свойство("ЭтоНовый"); + Исключение + ЭтоНовый = Ложь; + КонецПопытки; + + Если ТипИсточника = Тип("ДокументСсылка.КоммерческоеПредложениеКлиенту") Тогда + ГлавнаяЗапись = ТаблицаЗаписей.Добавить(); + ГлавнаяЗапись.ГлавнаяЗапись = Истина; + ГлавнаяЗапись.Клиент = Источник.Партнер; + ЗаполнитьЗначенияСвойств(ГлавнаяЗапись, Источник, "Организация"); + ГлавнаяЗапись.Ответственный = Источник.Менеджер; + ГлавнаяЗапись.Автор = Источник.CRM_Автор; + ГлавнаяЗапись.Подразделение = Источник.CRM_Подразделение; + ГлавнаяЗапись.Проект = Источник.CRM_Проект; + ГлавнаяЗапись.Валюта = Источник.Валюта; + ГлавнаяЗапись.Сумма = Источник.СуммаДокумента; + // Если КП создали в результате мастера конвертации, то пропишем связь с интересом. + Если Источник.Проведен И СтрНайти(Источник.Комментарий, Нстр("ru='#Конвертация';en='#Conversion'")) > 0 Тогда + Если ТипЗнч(Источник.ДокументОснование) = Тип("ДокументСсылка.CRM_Интерес") + И СтрНайти(Строка(Источник.ДокументОснование), НСтр("ru='<Объект не найден>';en=''")) = 0 Тогда + ГлавнаяЗапись.CRM_Интерес = Источник.ДокументОснование; + ГлавнаяЗапись.СостояниеИнтереса = Источник.ДокументОснование.СостояниеИнтереса; + ГлавнаяЗапись.ИнтересЯвляетсяОснованием = Истина; + ГлавнаяЗапись.ОсновнойИнтерес = Истина; + КонецЕсли; + КонецЕсли; + + // #ГК-ЧА 20180825 { + ИначеЕсли ТипИсточника = Тип("ДокументСсылка.гк_Сделка") Тогда + // #ГК-ТВВ 20200903{ + НаборЗаписей.Отбор.ГлавнаяЗапись.Установить(Истина); + // #ГК-ТВВ 20200903} + Документы.гк_Сделка.ЗарегистрироватьОбъектВОбщемЖурнале(ТаблицаЗаписей, Источник, Отказ); + + // #ГК-ЧА 20180825 } + + // #ГК-ИН 20190929 { + ИначеЕсли ТипИсточника = Тип("ДокументСсылка.гк_Договор") Тогда + + Документы.гк_Договор.ЗарегистрироватьОбъектВОбщемЖурнале(ТаблицаЗаписей, Источник, Отказ); + + // #ГК-ИН 20190929 } + + ИначеЕсли ТипИсточника = Тип("ДокументСсылка.CRM_РассылкаЭлектронныхПисем") Тогда + ГлавнаяЗапись = ТаблицаЗаписей.Добавить(); + ГлавнаяЗапись.ГлавнаяЗапись = Истина; + ЗаполнитьЗначенияСвойств(ГлавнаяЗапись, Источник, "Важность,Ответственный,Подразделение,Автор,Проект"); + Для Каждого СтрокаТаблицы Из Источник.Получатели Цикл + Если НЕ ЗначениеЗаполнено(СтрокаТаблицы.Партнер) Тогда Продолжить; КонецЕсли; + НоваяЗапись = ТаблицаЗаписей.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяЗапись, ГлавнаяЗапись,, "ГлавнаяЗапись"); + НоваяЗапись.Клиент = СтрокаТаблицы.Партнер; + КонецЦикла; + + ИначеЕсли ТипИсточника = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее") Тогда + ГлавнаяЗапись = ТаблицаЗаписей.Добавить(); + ГлавнаяЗапись.ГлавнаяЗапись = Истина; + Если ТипЗнч(Источник.ОтправительКонтакт) = Тип("СправочникСсылка.Партнеры") И ЗначениеЗаполнено(Источник.ОтправительКонтакт) Тогда + ГлавнаяЗапись.Клиент = Источник.ОтправительКонтакт; + ИначеЕсли ТипЗнч(Источник.ОтправительКонтакт) = Тип("СправочникСсылка.КонтактныеЛицаПартнеров") И ЗначениеЗаполнено(Источник.ОтправительКонтакт) Тогда + ГлавнаяЗапись.Клиент = Источник.ОтправительКонтакт.Владелец; + ГлавнаяЗапись.КонтактноеЛицо = Источник.ОтправительКонтакт; + КонецЕсли; + + // Для Входящих писем заполняем ресурс "СписокУчастников" на основе реквизитов письма "СписокПолучателейКопий" И + // "СписокПолучателейПисьма". + ГлавнаяЗапись.СписокУчастников = "" + Источник.СписокПолучателейПисьма + + ?(ПустаяСтрока(Источник.СписокПолучателейКопий), "", ", " + Источник.СписокПолучателейКопий); + + ////// + ЗаполнитьЗначенияСвойств(ГлавнаяЗапись, Источник, "Важность,Ответственный"); + ГлавнаяЗапись.CRM_Интерес = Источник.гк_Интерес; + ГлавнаяЗапись.Дата = Источник.ДатаПолучения; + + МассивТабличныхЧастей = Новый Массив(); + МассивТабличныхЧастей.Добавить("ПолучателиПисьма"); + МассивТабличныхЧастей.Добавить("ПолучателиКопий"); + МассивТабличныхЧастей.Добавить("ПолучателиОтвета"); + Для Каждого ИмяТабличнойЧасти Из МассивТабличныхЧастей Цикл + Для Каждого СтрокаТаблицы Из Источник[ИмяТабличнойЧасти] Цикл + Если НЕ ЗначениеЗаполнено(СтрокаТаблицы.Контакт) Или (ТипЗнч(СтрокаТаблицы.Контакт) <> Тип("СправочникСсылка.Партнеры") И ТипЗнч(СтрокаТаблицы.Контакт) <> Тип("СправочникСсылка.КонтактныеЛицаПартнеров")) Тогда + Продолжить; + КонецЕсли; + НоваяЗапись = ТаблицаЗаписей.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяЗапись, ГлавнаяЗапись,, "ГлавнаяЗапись, СписокУчастников"); + НоваяЗапись.Клиент = ?(ТипЗнч(СтрокаТаблицы.Контакт) = Тип("СправочникСсылка.Партнеры"),СтрокаТаблицы.Контакт,СтрокаТаблицы.Контакт.Владелец); + Если ТипЗнч(СтрокаТаблицы.Контакт) = Тип("СправочникСсылка.КонтактныеЛицаПартнеров") Тогда + НоваяЗапись.КонтактноеЛицо = СтрокаТаблицы.Контакт; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + ИначеЕсли ТипИсточника = Тип("ДокументСсылка.ЭлектронноеПисьмоИсходящее") Тогда + ГлавнаяЗапись = ТаблицаЗаписей.Добавить(); + ГлавнаяЗапись.ГлавнаяЗапись = Истина; + + // Для Исходящих писем заполняем ресурс "СписокУчастников" на основе реквизитов письма + // "СписокПолучателейКопий", "СписокПолучателейПисьма" И "СписокПолучателейСкрытыхКопий" + ГлавнаяЗапись.СписокУчастников = "" + Источник.СписокПолучателейПисьма + + ?(ПустаяСтрока(Источник.СписокПолучателейКопий), "", ", " + Источник.СписокПолучателейКопий) + + ?(ПустаяСтрока(Источник.СписокПолучателейСкрытыхКопий), "", ", " + Источник.СписокПолучателейСкрытыхКопий); + + // #ГК-ИН 20240508 { + Если ЗначениеЗаполнено(Источник.гк_Интерес) Тогда + ГлавнаяЗапись.CRM_Интерес = Источник.гк_Интерес; + КонецЕсли; + // #ГК-ИН 20240508 } + + ///// + ЗаполнитьЗначенияСвойств(ГлавнаяЗапись, Источник, "Автор,Важность,Ответственный"); + + // #ГК-ИН 20240513 { + + //МассивТабличныхЧастей = Новый Массив(); + //МассивТабличныхЧастей.Добавить("ПолучателиПисьма"); + //МассивТабличныхЧастей.Добавить("ПолучателиКопий"); + //МассивТабличныхЧастей.Добавить("ПолучателиОтвета"); + //МассивТабличныхЧастей.Добавить("ПолучателиСкрытыхКопий"); + + //Для Каждого ИмяТабличнойЧасти Из МассивТабличныхЧастей Цикл + // Для Каждого СтрокаТаблицы Из Источник[ИмяТабличнойЧасти] Цикл + // Если НЕ ЗначениеЗаполнено(СтрокаТаблицы.Контакт) Или + // (ТипЗнч(СтрокаТаблицы.Контакт) <> Тип("СправочникСсылка.Партнеры") И ТипЗнч(СтрокаТаблицы.Контакт) <> Тип("СправочникСсылка.КонтактныеЛицаПартнеров")) Тогда + // Продолжить; + // КонецЕсли; + // НоваяЗапись = ТаблицаЗаписей.Добавить(); + // ЗаполнитьЗначенияСвойств(НоваяЗапись, ГлавнаяЗапись,, "ГлавнаяЗапись, СписокУчастников"); + // НоваяЗапись.Клиент = ?(ТипЗнч(СтрокаТаблицы.Контакт)=Тип("СправочникСсылка.Партнеры"),СтрокаТаблицы.Контакт,СтрокаТаблицы.Контакт.Владелец); + // // #ГК-ИН 20240508 { + // НоваяЗапись.CRM_Интерес = Источник.гк_Интерес; + // // #ГК-ИН 20240508 } + // Если ТипЗнч(СтрокаТаблицы.Контакт) = Тип("СправочникСсылка.КонтактныеЛицаПартнеров") Тогда + // НоваяЗапись.КонтактноеЛицо = СтрокаТаблицы.Контакт; + // КонецЕсли; + // КонецЦикла; + //КонецЦикла; + // #ГК-ИН 20240513 } + + ИначеЕсли ТипИсточника = Тип("ДокументСсылка.СообщениеSMS") Тогда + ГлавнаяЗапись = ТаблицаЗаписей.Добавить(); + ГлавнаяЗапись.ГлавнаяЗапись = Истина; + ЗаполнитьЗначенияСвойств(ГлавнаяЗапись, Источник, "Автор,Ответственный,СписокУчастников"); + ТипПартнер = Тип("СправочникСсылка.Партнеры"); + ТипПотенциальныйКлиент = Тип("СправочникСсылка.CRM_ПотенциальныеКлиенты"); + СписокТипов = Новый Массив; + СписокТипов.Добавить(ТипПартнер); + СписокТипов.Добавить(ТипПотенциальныйКлиент); + ДопустимыеТипыКлиенты = Новый ОписаниеТипов(СписокТипов); + Для Каждого СтрокаТаблицы Из Источник.Адресаты Цикл + ТипКонтакта = ТипЗнч(СтрокаТаблицы.Контакт); + Если НЕ ЗначениеЗаполнено(СтрокаТаблицы.Контакт) + Или Не ДопустимыеТипыКлиенты.СодержитТип(ТипКонтакта) Тогда + Продолжить; + КонецЕсли; + Клиент = СтрокаТаблицы.Контакт; + НоваяЗапись = ТаблицаЗаписей.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяЗапись, ГлавнаяЗапись,, "ГлавнаяЗапись"); + НоваяЗапись.Клиент = Клиент; + + // #ГК-ИН 20240508 { + //НоваяЗапись.CRM_Интерес = гк_УправлениеИнтересами.АктивныйИнтересКлиента(Клиент); + НоваяЗапись.CRM_Интерес = Источник.гк_Интерес; + // #ГК-ИН 20240508 } + КонецЦикла; + + ИначеЕсли ТипИсточника = Тип("ДокументСсылка.CRM_СообщениеМессенджера") Тогда + ГлавнаяЗапись = ТаблицаЗаписей.Добавить(); + ГлавнаяЗапись.ГлавнаяЗапись = Истина; + ЗаполнитьЗначенияСвойств(ГлавнаяЗапись, Источник, "Ответственный"); + Если ТипЗнч(Источник.Контакт) = Тип("СправочникСсылка.Партнеры") И ЗначениеЗаполнено(Источник.Контакт) Тогда + ГлавнаяЗапись.Клиент = Источник.Контакт; + ИначеЕсли ТипЗнч(Источник.Контакт) = Тип("СправочникСсылка.КонтактныеЛицаПартнеров") И ЗначениеЗаполнено(Источник.Контакт) Тогда + ГлавнаяЗапись.Клиент = Источник.Контакт.Владелец; + ГлавнаяЗапись.КонтактноеЛицо = Источник.Контакт; + КонецЕсли; + Если Источник.ВидСообщения = Перечисления.CRM_ВидыСообщенияМессенджера.Входящее Тогда + ГлавнаяЗапись.ВходящееИсходящее = Перечисления.CRM_ВходящееИсходящееСобытие.Входящее; + Иначе + ГлавнаяЗапись.ВходящееИсходящее = Перечисления.CRM_ВходящееИсходящееСобытие.Исходящее; + КонецЕсли; + + ИначеЕсли ТипИсточника = Тип("ДокументСсылка.CRM_Заявка") Тогда + ГлавнаяЗапись = ТаблицаЗаписей.Добавить(); + ГлавнаяЗапись.ГлавнаяЗапись = Истина; + ЗаполнитьЗначенияСвойств(ГлавнаяЗапись, Источник, "Ответственный"); + + // #ГК-КА 20210422 { + // Интерес в журнал устанавливается принудительно из реквизита заявки. + // См. обработчик гк_ОбработчикиПодписокНаСобытияРегистровСведений.ПередЗаписью_ЖурналДокументов. + ПустаяТаблица = Новый ТаблицаЗначений(); + Источник.ДополнительныеСвойства.Вставить("CRM_ТаблицаИнтересов", ПустаяТаблица); + // #ГК-КА 20210422 } + + ИначеЕсли ТипИсточника = Тип("ДокументСсылка.CRM_Интерес") Тогда + ГлавнаяЗапись = ТаблицаЗаписей.Добавить(); + ЗаполнитьЗначенияСвойств(ГлавнаяЗапись, Источник); + ГлавнаяЗапись.ГлавнаяЗапись = Истина; + ГлавнаяЗапись.СостояниеСобытия = ?(Источник.Завершен, ?(Источник.СостояниеИнтереса.ВидСостояния = Перечисления.CRM_ВидыСостоянияИнтереса.НеудачноеЗавершение, + Справочники.CRM_СостоянияСобытий.Отменено, Справочники.CRM_СостоянияСобытий.Завершено), Справочники.CRM_СостоянияСобытий.ВРаботе); + ГлавнаяЗапись.CRM_Интерес = Источник.Ссылка; + ГлавнаяЗапись.Валюта = Константы.ВалютаУправленческогоУчета.Получить(); + ГлавнаяЗапись.Клиент = Источник.Партнер; + + ИначеЕсли ТипИсточника = Тип("ДокументСсылка.CRM_Взаимодействие") Тогда + + ГлавнаяЗапись = ТаблицаЗаписей.Добавить(); + ЗаполнитьЗначенияСвойств(ГлавнаяЗапись, Источник); + ГлавнаяЗапись.ГлавнаяЗапись = Истина; + ГлавнаяЗапись.СостояниеСобытия = Источник.СтатусВзаимодействия; + Если ЗначениеЗаполнено(Источник.ДокументОснование) И ТипЗнч(Источник.ДокументОснование) = Тип("ДокументСсылка.CRM_Интерес") Тогда + ГлавнаяЗапись.CRM_Интерес = Источник.ДокументОснование; + ГлавнаяЗапись.СостояниеИнтереса = Источник.ДокументОснование.СостояниеИнтереса; + КонецЕсли; + ГлавнаяЗапись.Валюта = Константы.ВалютаУправленческогоУчета.Получить(); + + Если Источник.ВидВзаимодействия.ВидСобытия <> Перечисления.CRM_ВидыСобытий.ЛичнаяВстреча Тогда // пока только у Встречи выводится ТЧ участников + ГлавнаяЗапись.Клиент = Источник.Партнер; + ГлавнаяЗапись.КонтактноеЛицо = Источник.КонтактноеЛицо; + КонецЕсли; + ГлавнаяЗапись.СписокУчастников = Источник.СписокКлиентов; + + Для Каждого СтрокаТаблицы Из Источник.СторонниеЛица Цикл + Если НЕ ЗначениеЗаполнено(СтрокаТаблицы.Партнер) Тогда + Продолжить; + КонецЕсли; + НоваяЗапись = ТаблицаЗаписей.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяЗапись, ГлавнаяЗапись,, "ГлавнаяЗапись"); + НоваяЗапись.Клиент = СтрокаТаблицы.Партнер; + КонецЦикла; + + ИначеЕсли ТипИсточника = Тип("ДокументСсылка.CRM_Телемаркетинг") Тогда + ГлавнаяЗапись = ТаблицаЗаписей.Добавить(); + ГлавнаяЗапись.ГлавнаяЗапись = Истина; + ЗаполнитьЗначенияСвойств(ГлавнаяЗапись, Источник, "Автор,Важность,Ответственный"); + Для Каждого СтрокаТаблицы Из Источник.Участники Цикл + Если НЕ ЗначениеЗаполнено(СтрокаТаблицы.Партнер) Или ТипЗнч(СтрокаТаблицы.Партнер) <> Тип("СправочникСсылка.Партнеры") Тогда + Продолжить; + КонецЕсли; + НоваяЗапись = ТаблицаЗаписей.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяЗапись, ГлавнаяЗапись,, "ГлавнаяЗапись"); + НоваяЗапись.Клиент = СтрокаТаблицы.Партнер; + КонецЦикла; + + ИначеЕсли ТипИсточника = Тип("БизнесПроцессСсылка.CRM_БизнесПроцесс") Тогда + ГлавнаяЗапись = ТаблицаЗаписей.Добавить(); + ГлавнаяЗапись.ГлавнаяЗапись = Истина; + ГлавнаяЗапись.Клиент = Источник.Партнер; + Если ТипЗнч(Источник.Предмет) = Тип("ДокументСсылка.CRM_Интерес") Тогда + ГлавнаяЗапись.CRM_Интерес = Источник.Предмет; + КонецЕсли; + ЗаполнитьЗначенияСвойств(ГлавнаяЗапись, Источник, "Автор,Важность,Организация,Подразделение,Ответственный,Проект,Сумма"); + ГлавнаяЗапись.Проведен = (Источник.Стартован); + + ИначеЕсли ТипИсточника = Тип("ДокументСсылка.Анкета") Тогда + + Если ТипЗнч(Источник.Респондент) = Тип("СправочникСсылка.Пользователи") Тогда + ГлавнаяЗапись = ТаблицаЗаписей.Добавить(); + ГлавнаяЗапись.ГлавнаяЗапись = Истина; + Иначе + ГлавнаяЗапись = ТаблицаЗаписей.Добавить(); + ГлавнаяЗапись.ГлавнаяЗапись = Истина; + ГлавнаяЗапись.Клиент = Источник.Респондент; + ГлавнаяЗапись.CRM_Интерес = Источник.гк_Интерес; + КонецЕсли; + + // +СофтФон + ИначеЕсли ТипИсточника = Тип("ДокументСсылка.ТелефонныйЗвонок") Тогда + ГлавнаяЗапись = ТаблицаЗаписей.Добавить(); + ГлавнаяЗапись.ГлавнаяЗапись = Истина; + ГлавнаяЗапись.ВидСобытия = Перечисления.CRM_ВидыСобытий.ТелефонныйЗвонок; + ГлавнаяЗапись.СостояниеСобытия = Справочники.CRM_СостоянияСобытий.Завершено; + ЗаполнитьЗначенияСвойств(ГлавнаяЗапись, Источник); + Если Источник.Входящий Тогда + ГлавнаяЗапись.ВходящееИсходящее = Перечисления.CRM_ВходящееИсходящееСобытие.Входящее; + Иначе + ГлавнаяЗапись.ВходящееИсходящее = Перечисления.CRM_ВходящееИсходящееСобытие.Исходящее; + КонецЕсли; + Если ТипЗнч(Источник.АбонентКонтакт) = Тип("СправочникСсылка.Партнеры") Тогда + ГлавнаяЗапись.Клиент = Источник.АбонентКонтакт; + ИначеЕсли ТипЗнч(Источник.АбонентКонтакт) = Тип("СправочникСсылка.КонтактныеЛицаПартнеров") Тогда + ГлавнаяЗапись.Клиент = Источник.АбонентКонтакт.Владелец; + ГлавнаяЗапись.КонтактноеЛицо = Источник.АбонентКонтакт; + КонецЕсли; + // -СофтФон + + ИначеЕсли ТипИсточника = Тип("ЗадачаСсылка.ЗадачаИсполнителя") Тогда + ГлавнаяЗапись = ТаблицаЗаписей.Добавить(); + ГлавнаяЗапись.ГлавнаяЗапись = Истина; + ЗаполнитьЗначенияСвойств(ГлавнаяЗапись, Источник, "Автор,Важность,Дата"); + Если Источник.CRM_Личная И ЗначениеЗаполнено(Источник.Предмет) И ТипЗнч(Источник.Предмет) = Тип("ДокументСсылка.CRM_Интерес") Тогда + ГлавнаяЗапись.CRM_Интерес = Источник.Предмет; + ИначеЕсли ЗначениеЗаполнено(Источник.БизнесПроцесс) И ТипЗнч(Источник.БизнесПроцесс.Предмет) = Тип("ДокументСсылка.CRM_Интерес") + И (ТипЗнч(Источник.БизнесПроцесс) <> Тип("БизнесПроцессСсылка.CRM_БизнесПроцесс") ИЛИ НЕ ЗначениеЗаполнено(Источник.БизнесПроцесс.Интерес)) Тогда + ГлавнаяЗапись.CRM_Интерес = Источник.БизнесПроцесс.Предмет; + КонецЕсли; + ГлавнаяЗапись.Клиент = Источник.CRM_Партнер; + ГлавнаяЗапись.КонтактноеЛицо = Источник.CRM_КонтактноеЛицо; + ГлавнаяЗапись.Ответственный = Источник.Исполнитель; + + // #ГК-ГРП 20220702 { + ИначеЕсли ТипИсточника = Тип("ДокументСсылка.гк_ЗаявкаНаВзаимодействие") Тогда + Документы.гк_ЗаявкаНаВзаимодействие.ЗарегистрироватьОбъектВОбщемЖурнале(ТаблицаЗаписей, Источник, Отказ); + // #ГК-ГРП 20220702 } + + // #ГК-КЕА 20220831 { + ИначеЕсли ТипИсточника = Тип("ДокументСсылка.гк_СообщениеМессенджера") Тогда + Документы.гк_СообщениеМессенджера.ЗарегистрироватьОбъектВОбщемЖурнале(ТаблицаЗаписей, Источник, Отказ); + // #ГК-КЕА 20220831 } + + Иначе + // "универсальная" регистрация документа в журнале. + ГлавнаяЗапись = ТаблицаЗаписей.Добавить(); + ГлавнаяЗапись.ГлавнаяЗапись = Истина; + + ЗаполнитьЗначенияСвойств(ГлавнаяЗапись, Источник); + + Если Не ЗначениеЗаполнено(ГлавнаяЗапись.Дата) Тогда + Попытка + ГлавнаяЗапись.Дата = Источник.Дата; + Исключение + Попытка + ГлавнаяЗапись.Дата = Источник.ДатаНачала; + Исключение + КонецПопытки; + КонецПопытки; + КонецЕсли; + + Если Не ЗначениеЗаполнено(ГлавнаяЗапись.Номер) Тогда + Попытка + ГлавнаяЗапись.Номер = Источник.Номер; + Исключение + Попытка + ГлавнаяЗапись.Номер = Источник.Код; + Исключение + КонецПопытки; + КонецПопытки; + КонецЕсли; + + Если Не ЗначениеЗаполнено(ГлавнаяЗапись.Ответственный) Тогда + Попытка + ГлавнаяЗапись.Ответственный = Источник.Менеджер; + Исключение + КонецПопытки; + КонецЕсли; + + Если Не ЗначениеЗаполнено(ГлавнаяЗапись.Клиент) Тогда + Попытка + ГлавнаяЗапись.Клиент = Источник.Партнер; + Исключение + Попытка + ГлавнаяЗапись.Клиент = Источник.Контрагент.Партнер; + Исключение + Попытка + ГлавнаяЗапись.Клиент = Источник.Контрагент; + Исключение + КонецПопытки; + КонецПопытки; + КонецПопытки; + КонецЕсли; + + Если Не ЗначениеЗаполнено(ГлавнаяЗапись.Сумма) Тогда + Попытка + ГлавнаяЗапись.Сумма = Источник.СуммаДокумента; + Исключение + КонецПопытки; + КонецЕсли; + + // Попытка найти реквизиты "Партнер" в табличных частях объекта. + ИсточникМетаданные = Источник.Метаданные(); + Попытка ТабличныеЧастиИтератор = ИсточникМетаданные.ТабличныеЧасти; + Исключение ТабличныеЧастиИтератор = Неопределено; + КонецПопытки; + Если ТабличныеЧастиИтератор <> Неопределено Тогда + Для Каждого ТабЧасть Из ТабличныеЧастиИтератор Цикл + ИмяРеквизитаПартнерИлиКонтрагент = Неопределено; + Для Каждого РеквизитТЧ Из ТабЧасть.Реквизиты Цикл + Если РеквизитТЧ.Тип.СодержитТип(Тип("СправочникСсылка.Партнеры")) Тогда + ИмяРеквизитаПартнерИлиКонтрагент = РеквизитТЧ.Имя; + Прервать; + КонецЕсли; + КонецЦикла; + Если ИмяРеквизитаПартнерИлиКонтрагент <> Неопределено Тогда + Для Каждого СтрокаТаблицы Из Источник[ТабЧасть.Имя] Цикл + ПартнерВТЧ = Неопределено; + Если ЗначениеЗаполнено(СтрокаТаблицы[ИмяРеквизитаПартнерИлиКонтрагент]) И ТипЗнч(СтрокаТаблицы[ИмяРеквизитаПартнерИлиКонтрагент]) = Тип("СправочникСсылка.Партнеры") Тогда + ПартнерВТЧ = СтрокаТаблицы[ИмяРеквизитаПартнерИлиКонтрагент]; + КонецЕсли; + Если ЗначениеЗаполнено(ПартнерВТЧ) Тогда + Если ТаблицаЗаписей.Найти(ПартнерВТЧ, "Клиент") = Неопределено Тогда + НоваяЗапись = ТаблицаЗаписей.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяЗапись, ГлавнаяЗапись,, "ГлавнаяЗапись"); + НоваяЗапись.Клиент = ПартнерВТЧ; + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЕсли; + + Если Источник.Метаданные().Реквизиты.Найти("КонтактноеЛицо")<>Неопределено Тогда + ГлавнаяЗапись.КонтактноеЛицо = Источник.КонтактноеЛицо; + КонецЕсли; + + Если ГлавнаяЗапись <> Неопределено Тогда + ГлавнаяЗапись.Описание = гк_РегистрСведений_CRM_ЖурналДокументов.ПолучитьТекстовоеОписанияОбъекта(Источник.Ссылка, ТипОбъекта); + КонецЕсли; + + Если НЕ Отказ Тогда + + // #ГК-КА 20200602 { + Если Источник.ДополнительныеСвойства.Свойство("УдалитьРегистрациюВЖурнале") + И Источник.ДополнительныеСвойства.УдалитьРегистрациюВЖурнале Тогда + ТаблицаЗаписей.Очистить(); + КонецЕсли; + // #ГК-КА 20200602 } + + Если ТаблицаЗаписей.Количество() > 0 Тогда + // Удаление неуникальных записей. + ТаблицаЗаписейКопия = ТаблицаЗаписей.Скопировать(); + ТаблицаЗаписей.Очистить(); + СтруктураПоиска = Новый Структура("Клиент, CRM_Интерес"); + Для Каждого СтрокаТаблицы Из ТаблицаЗаписейКопия Цикл + бДобавлятьСтроку = Истина; + Если НЕ СтрокаТаблицы.ГлавнаяЗапись Тогда + ЗаполнитьЗначенияСвойств(СтруктураПоиска, СтрокаТаблицы); + + НайденныеСтроки = ТаблицаЗаписей.НайтиСтроки(СтруктураПоиска); + Если НайденныеСтроки.Количество() > 0 Тогда + бДобавлятьСтроку = Ложь; + КонецЕсли; + КонецЕсли; + Если бДобавлятьСтроку Тогда + НоваяСтрока = ТаблицаЗаписей.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТаблицы); + КонецЕсли; + КонецЦикла; + ТаблицаЗаписейКопия = Неопределено; + + // Заполнение обязательных полей. + Для Каждого СтрокаТаблицы Из ТаблицаЗаписей Цикл + Если НЕ ЗначениеЗаполнено(СтрокаТаблицы.Объект) Тогда + СтрокаТаблицы.Объект = Источник.Ссылка; + КонецЕсли; + Если НЕ ЗначениеЗаполнено(СтрокаТаблицы.ТипОбъекта) Тогда + СтрокаТаблицы.ТипОбъекта = ТипОбъекта; + КонецЕсли; + Если ЭтоДокумент Тогда + Если ПроведениеДокументаРазрешено Тогда + СтрокаТаблицы.Проведен = Источник.Проведен; + Иначе + // Если проведение документа запрещено, ставим всегда "Проведен" - + // это нужно для вычисления индекса картинки в списке, + // чтобы отображение картинки соответствовало стандартному поведению платформы - + // документы, которые не проводятся, всегда отображать как проведенные. + СтрокаТаблицы.Проведен = Истина; + КонецЕсли; + КонецЕсли; + // Номер, если он есть + Попытка СтрокаТаблицы.Номер = Строка(Источник.Номер); + Исключение КонецПопытки; + // Дата, если она есть + Попытка + Если ТипЗнч(Источник.Дата) = Тип("Дата") Тогда + // Для входящего письма нужно использовать не "Дата" документа, а "ДатаПолучения". + Если ТипЗнч(СтрокаТаблицы.Объект) = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее") Тогда + СтрокаТаблицы.Дата = Источник.ДатаПолучения; + ИначеЕсли ТипЗнч(СтрокаТаблицы.Объект) = Тип("ДокументСсылка.CRM_Взаимодействие") Тогда + // #ГК-ИН 20230403 { + //СтрокаТаблицы.Дата = Источник.ПлановаяДата; + + СтатусыЗавершенного = гк_Взаимодействия.СтатусыЗавершенногоВзаимодействия(); + Если НЕ СтатусыЗавершенного.Найти(Источник.СтатусВзаимодействия) = Неопределено Тогда + Если ЗначениеЗаполнено(Источник.ДатаЗавершенияВзаимодействия) Тогда + СтрокаТаблицы.Дата = Источник.ДатаЗавершенияВзаимодействия; + Иначе + СтрокаТаблицы.Дата = Источник.ПлановаяДата; + КонецЕсли; + Иначе + СтрокаТаблицы.Дата = Источник.ПлановаяДата; + КонецЕсли; + // #ГК-ИН 20230403 } + + Иначе + СтрокаТаблицы.Дата = Источник.Дата; + КонецЕсли; + КонецЕсли; + Исключение КонецПопытки; + СтрокаТаблицы.ПометкаУдаления = Источник.ПометкаУдаления; + КонецЦикла; + + // Если НЕ ТипЗнч(Источник) = Тип("ДокументОбъект.CRM_Интерес") Тогда + // Это пишем из формы документа. + Если Источник.ДополнительныеСвойства.Свойство("CRM_ТаблицаИнтересов") Тогда + CRM_ОбщегоНазначенияСервер.ДозаписатьСвязьСИнтересами(Источник, ТаблицаЗаписей, Источник.ДополнительныеСвойства.CRM_ТаблицаИнтересов); + Иначе + // Пишем программно + // Проверим не было ли связей с интересами. + Если ТипЗнч(Источник) = Тип("ЗадачаОбъект.ЗадачаИсполнителя") + И Источник.ДополнительныеСвойства.Свойство("ЭтоНовый") + И Источник.ДополнительныеСвойства.ЭтоНовый Тогда + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Объект", Источник.БизнесПроцесс); + Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | CRM_ЖурналДокументов.CRM_Интерес КАК Ссылка, + | CRM_ЖурналДокументов.СостояниеИнтереса, + | CRM_ЖурналДокументов.ОсновнойИнтерес КАК ОсновнойИнтерес, + | CRM_ЖурналДокументов.ИнтересЯвляетсяОснованием КАК ВведенНаОсновании + |ИЗ + | РегистрСведений.CRM_ЖурналДокументов КАК CRM_ЖурналДокументов + |ГДЕ + | CRM_ЖурналДокументов.Объект = &Объект + | И НЕ CRM_ЖурналДокументов.CRM_Интерес = ЗНАЧЕНИЕ(Документ.CRM_Интерес.ПустаяСсылка) + | И НЕ CRM_ЖурналДокументов.ГлавнаяЗапись + | + |УПОРЯДОЧИТЬ ПО + | ОсновнойИнтерес УБЫВ"; + + ТаблицаСвязей = Запрос.Выполнить().Выгрузить(); + + Если ТаблицаСвязей.Количество() > 0 Тогда + CRM_ОбщегоНазначенияСервер.ДозаписатьСвязьСИнтересами(Источник, ТаблицаЗаписей,ТаблицаСвязей); + КонецЕсли; + Иначе + Если Источник.ДополнительныеСвойства.Свойство("ЭтоНовый") И Источник.ДополнительныеСвойства.ЭтоНовый <> Неопределено И Источник.ДополнительныеСвойства.ЭтоНовый Тогда + // Пока непонятно надо ли тут + Основание = CRM_ОбщегоНазначенияСервер.ПроверитьПринадлежностьОснованияЖурналуДокументов(Источник.Ссылка); + + Если НЕ Основание = Неопределено ИЛИ CRM_ОбщегоНазначенияСервер.ЯвляетсяОснованиемИнтереса(Источник.Ссылка) Тогда + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Объект", Основание); + + ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | CRM_ЖурналДокументов.CRM_Интерес КАК Ссылка, + | CRM_ЖурналДокументов.СостояниеИнтереса, + | CRM_ЖурналДокументов.ОсновнойИнтерес КАК ОсновнойИнтерес, + | CRM_ЖурналДокументов.ИнтересЯвляетсяОснованием КАК ВведенНаОсновании, + | CRM_ЖурналДокументов.ГлавнаяЗапись + |ИЗ + | РегистрСведений.CRM_ЖурналДокументов КАК CRM_ЖурналДокументов + |ГДЕ + | CRM_ЖурналДокументов.Объект = &Объект + | И НЕ CRM_ЖурналДокументов.CRM_Интерес = ЗНАЧЕНИЕ(Документ.CRM_Интерес.ПустаяСсылка) + | И CRM_ЖурналДокументов.ГлавнаяЗапись + | + |УПОРЯДОЧИТЬ ПО + | ОсновнойИнтерес УБЫВ"; + + Запрос.Текст = ТекстЗапроса; + ТаблицаСвязей = Запрос.Выполнить().Выгрузить(); + Если ТаблицаСвязей.Количество() > 0 Тогда + CRM_ОбщегоНазначенияСервер.ДозаписатьСвязьСИнтересами(Источник, ТаблицаЗаписей,ТаблицаСвязей); + КонецЕсли; + Иначе + // попробуем связать по табличной части + + // Попытка найти реквизиты "Заказ" в табличных частях объекта. + ИсточникМетаданные = Источник.Метаданные(); + Попытка ТабличныеЧастиИтератор = ИсточникМетаданные.ТабличныеЧасти; + Исключение ТабличныеЧастиИтератор = Неопределено; + КонецПопытки; + + Если ТабличныеЧастиИтератор <> Неопределено Тогда + + МассивОснованийВТабличнойЧасти = Новый Массив; + + Для Каждого ТабЧасть Из ТабличныеЧастиИтератор Цикл + ИмяТабличнойЧасти = ТабЧасть.Имя; + Если СтрНайти(ТабЧасть.Имя, "РасшифровкаПлатежа") <> 1 Тогда + Продолжить; + КонецЕсли; + + ИмяРеквизитаОснование = ""; + + Попытка + РеквизитОснование = ТабЧасть.Реквизиты.Заказ; + ИмяРеквизитаОснование = "Заказ"; + Исключение + КонецПопытки; + + Если ИмяРеквизитаОснование = "" Тогда + Продолжить; + КонецЕсли; + + ТабличнаяЧастьИсточника = Источник[ИмяТабличнойЧасти]; + + Для Каждого СтрокаТабличнойЧасти Из ТабличнаяЧастьИсточника Цикл + + ЗначениеРеквизитаТабличнойЧасти = СтрокаТабличнойЧасти[ИмяРеквизитаОснование]; + + Если ЗначениеЗаполнено(ЗначениеРеквизитаТабличнойЧасти) + И МассивОснованийВТабличнойЧасти.Найти(ЗначениеРеквизитаТабличнойЧасти) = Неопределено Тогда + МассивОснованийВТабличнойЧасти.Добавить(ЗначениеРеквизитаТабличнойЧасти); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Если МассивОснованийВТабличнойЧасти.Количество() > 0 Тогда + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("МассивОбъектов", МассивОснованийВТабличнойЧасти); + + ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | CRM_ЖурналДокументов.CRM_Интерес КАК Ссылка, + | CRM_ЖурналДокументов.СостояниеИнтереса, + | CRM_ЖурналДокументов.ОсновнойИнтерес КАК ОсновнойИнтерес, + | CRM_ЖурналДокументов.ИнтересЯвляетсяОснованием КАК ВведенНаОсновании, + | CRM_ЖурналДокументов.ГлавнаяЗапись + |ИЗ + | РегистрСведений.CRM_ЖурналДокументов КАК CRM_ЖурналДокументов + |ГДЕ + | CRM_ЖурналДокументов.Объект В (&МассивОбъектов) + | И НЕ CRM_ЖурналДокументов.CRM_Интерес = ЗНАЧЕНИЕ(Документ.CRM_Интерес.ПустаяСсылка) + | И CRM_ЖурналДокументов.ГлавнаяЗапись + | + |УПОРЯДОЧИТЬ ПО + | ОсновнойИнтерес УБЫВ"; + + Запрос.Текст = ТекстЗапроса; + ТаблицаСвязей = Запрос.Выполнить().Выгрузить(); + Если ТаблицаСвязей.Количество() > 0 Тогда + + ГлавнаяЗапись = ТаблицаЗаписей[0]; + + // создаём дополнительные записи журнала для отображения нескольких объектов + + Для Каждого СтрокаТаблицаСвязей Из ТаблицаСвязей Цикл + + ВведенныеСтроки = ТаблицаЗаписей.НайтиСтроки(Новый Структура("ГлавнаяЗапись, CRM_Интерес", Ложь, СтрокаТаблицаСвязей.Ссылка)); + + Если ВведенныеСтроки.Количество() > 0 Тогда + Продолжить; + КонецЕсли; + + НоваяЗапись = ТаблицаЗаписей.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяЗапись, ГлавнаяЗапись,, "ГлавнаяЗапись"); + + НоваяЗапись.CRM_Интерес = СтрокаТаблицаСвязей.Ссылка; + НоваяЗапись.ОсновнойИнтерес = СтрокаТаблицаСвязей.ОсновнойИнтерес; + НоваяЗапись.ИнтересЯвляетсяОснованием = СтрокаТаблицаСвязей.ВведенНаОсновании; + НоваяЗапись.СостояниеИнтереса = СтрокаТаблицаСвязей.Ссылка.СостояниеИнтереса; + + КонецЦикла; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЕсли; + Иначе + + Основание = CRM_ОбщегоНазначенияСервер.ПроверитьПринадлежностьОснованияЖурналуДокументов(Источник.Ссылка); + + Если НЕ Основание = Неопределено ИЛИ CRM_ОбщегоНазначенияСервер.ЯвляетсяОснованиемИнтереса(Источник.Ссылка) Тогда + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Объект", Источник.Ссылка); + + ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | CRM_ЖурналДокументов.CRM_Интерес КАК Ссылка, + | CRM_ЖурналДокументов.СостояниеИнтереса, + | CRM_ЖурналДокументов.ОсновнойИнтерес КАК ОсновнойИнтерес, + | CRM_ЖурналДокументов.ИнтересЯвляетсяОснованием КАК ВведенНаОсновании, + | CRM_ЖурналДокументов.ГлавнаяЗапись + |ИЗ + | РегистрСведений.CRM_ЖурналДокументов КАК CRM_ЖурналДокументов + |ГДЕ + | CRM_ЖурналДокументов.Объект = &Объект + // #ГК-ИН 20200902 { + | И НЕ CRM_ЖурналДокументов.Объект ССЫЛКА Документ.CRM_Заявка + // #ГК-ИН 20200902 } + | И НЕ CRM_ЖурналДокументов.CRM_Интерес = ЗНАЧЕНИЕ(Документ.CRM_Интерес.ПустаяСсылка) + | И CRM_ЖурналДокументов.ГлавнаяЗапись + | + |УПОРЯДОЧИТЬ ПО + | ОсновнойИнтерес УБЫВ"; + + Запрос.Текст = ТекстЗапроса; + ТаблицаСвязей = Запрос.Выполнить().Выгрузить(); + Если ТаблицаСвязей.Количество() > 0 Тогда + CRM_ОбщегоНазначенияСервер.ДозаписатьСвязьСИнтересами(Источник, ТаблицаЗаписей,ТаблицаСвязей); + КонецЕсли; + + Иначе + // попробуем связать по табличной части + + // Попытка найти реквизиты "Партнер" в табличных частях объекта. + ИсточникМетаданные = Источник.Метаданные(); + Попытка ТабличныеЧастиИтератор = ИсточникМетаданные.ТабличныеЧасти; + Исключение ТабличныеЧастиИтератор = Неопределено; + КонецПопытки; + + Если ТабличныеЧастиИтератор <> Неопределено Тогда + + МассивОснованийВТабличнойЧасти = Новый Массив; + + Для Каждого ТабЧасть Из ТабличныеЧастиИтератор Цикл + ИмяТабличнойЧасти = ТабЧасть.Имя; + Если СтрНайти(ТабЧасть.Имя, "РасшифровкаПлатежа") <> 1 Тогда + Продолжить; + КонецЕсли; + + ИмяРеквизитаОснование = ""; + + Попытка + РеквизитОснование = ТабЧасть.Реквизиты.Заказ; + ИмяРеквизитаОснование = "Заказ"; + Исключение + КонецПопытки; + + Если ИмяРеквизитаОснование = "" Тогда + Продолжить; + КонецЕсли; + + ТабличнаяЧастьИсточника = Источник[ИмяТабличнойЧасти]; + + Для Каждого СтрокаТабличнойЧасти Из ТабличнаяЧастьИсточника Цикл + + ЗначениеРеквизитаТабличнойЧасти = СтрокаТабличнойЧасти[ИмяРеквизитаОснование]; + + Если ЗначениеЗаполнено(ЗначениеРеквизитаТабличнойЧасти) + И МассивОснованийВТабличнойЧасти.Найти(ЗначениеРеквизитаТабличнойЧасти) = Неопределено Тогда + МассивОснованийВТабличнойЧасти.Добавить(ЗначениеРеквизитаТабличнойЧасти); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Если МассивОснованийВТабличнойЧасти.Количество() > 0 Тогда + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("МассивОбъектов", МассивОснованийВТабличнойЧасти); + + ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | CRM_ЖурналДокументов.CRM_Интерес КАК Ссылка, + | CRM_ЖурналДокументов.СостояниеИнтереса, + | CRM_ЖурналДокументов.ОсновнойИнтерес КАК ОсновнойИнтерес, + | CRM_ЖурналДокументов.ИнтересЯвляетсяОснованием КАК ВведенНаОсновании, + | CRM_ЖурналДокументов.ГлавнаяЗапись + |ИЗ + | РегистрСведений.CRM_ЖурналДокументов КАК CRM_ЖурналДокументов + |ГДЕ + | CRM_ЖурналДокументов.Объект В (&МассивОбъектов) + | И НЕ CRM_ЖурналДокументов.CRM_Интерес = ЗНАЧЕНИЕ(Документ.CRM_Интерес.ПустаяСсылка) + | И CRM_ЖурналДокументов.ГлавнаяЗапись + | + |УПОРЯДОЧИТЬ ПО + | ОсновнойИнтерес УБЫВ"; + + Запрос.Текст = ТекстЗапроса; + ТаблицаСвязей = Запрос.Выполнить().Выгрузить(); + Если ТаблицаСвязей.Количество() > 0 Тогда + + ГлавнаяЗапись = ТаблицаЗаписей[0]; + + // создаём дополнительные записи журнала для отображения нескольких объектов + + Для Каждого СтрокаТаблицаСвязей Из ТаблицаСвязей Цикл + + ВведенныеСтроки = ТаблицаЗаписей.НайтиСтроки(Новый Структура("ГлавнаяЗапись, CRM_Интерес", Ложь, СтрокаТаблицаСвязей.Ссылка)); + + Если ВведенныеСтроки.Количество() > 0 Тогда + Продолжить; + КонецЕсли; + + НоваяЗапись = ТаблицаЗаписей.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяЗапись, ГлавнаяЗапись,, "ГлавнаяЗапись"); + + НоваяЗапись.CRM_Интерес = СтрокаТаблицаСвязей.Ссылка; + НоваяЗапись.ОсновнойИнтерес = СтрокаТаблицаСвязей.ОсновнойИнтерес; + НоваяЗапись.ИнтересЯвляетсяОснованием = СтрокаТаблицаСвязей.ВведенНаОсновании; + НоваяЗапись.СостояниеИнтереса = СтрокаТаблицаСвязей.Ссылка.СостояниеИнтереса; + + КонецЦикла; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + // удалим возможные дубли + Если ТаблицаЗаписей.Количество() > 1 Тогда + + КопияТаблицыЗаписей = ТаблицаЗаписей.Скопировать(); + ТаблицаЗаписей.Очистить(); + + Для Каждого СтрокаТаблицаКопия Из КопияТаблицыЗаписей Цикл + + ВведенныеСтроки = ТаблицаЗаписей.НайтиСтроки(Новый Структура("ГлавнаяЗапись, Клиент, Объект, CRM_Интерес", СтрокаТаблицаКопия.ГлавнаяЗапись, СтрокаТаблицаКопия.Клиент, СтрокаТаблицаКопия.Объект, СтрокаТаблицаКопия.CRM_Интерес)); + + Если ВведенныеСтроки.Количество() = 0 Тогда + СтрокаТаблицаЗаписей = ТаблицаЗаписей.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаТаблицаЗаписей, СтрокаТаблицаКопия); + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + // #ГК-ИН 20190521 { + гк_РегистрСведений_CRM_ЖурналДокументов.ДополнитьЗаписи(ТаблицаЗаписей); + // #ГК-ИН 20190521 } + + НаборЗаписей.Загрузить(ТаблицаЗаписей); + КонецЕсли; + НаборЗаписей.Записать(Истина); + КонецЕсли; + + Если ТипИсточника = Тип("ДокументСсылка.CRM_Интерес") И Не Отказ Тогда + Если ЗначениеЗаполнено(Источник.Партнер) Тогда + CRM_УправлениеДоступомВызовСервера.ДобавитьПравоДоступаККонтакту(Источник.Партнер, Источник.КонтактноеЛицо, Источник.Ответственный, Источник.Подразделение, Источник.Офис, Истина); + КонецЕсли; + КонецЕсли; + + Если Не Отказ Тогда + Если ЭтоНовый И Не Источник.ПометкаУдаления Тогда + МенеджерЗаписи = РегистрыСведений.CRM_ОбъектыДляРегламентногоФормированияОповещений.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.Объект = Источник.Ссылка; + МенеджерЗаписи.Записать(); + КонецЕсли; + КонецЕсли; + + Если Не Отказ Тогда + Если ТипИсточника = Тип("ДокументСсылка.CRM_Взаимодействие") И Источник.ДополнительныеСвойства.Свойство("ИзмененОтветственный") Тогда + Если Источник.ДополнительныеСвойства.ИзмененОтветственный Тогда + CRM_ОповещенияСервер.ПриСменеОтвественногоСобытия(Источник.Ссылка); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если ТипЗнч(Источник) = Тип("БизнесПроцессОбъект.CRM_БизнесПроцесс") Тогда + Если Источник.ЗавершенДосрочно Тогда + CRM_БизнесПроцессыСервер.ОбработкаДосрочногоЗавершенияБизнесПроцесса(Источник); + КонецЕсли; + КонецЕсли; + + // #ГК-ИН 20220214 { Регистр не используется + //Если РегистрыСведений.CRM_СостоянияЛидов.СсылкаЯвляетсяЛидом(Источник.Ссылка) Тогда + // Если НЕ Источник.CRM_СкрытьВАРМ И РегистрыСведений.CRM_СостоянияЛидов.ПолучитьТекущееСостояниеЛида(Источник.Ссылка) = Неопределено Тогда + // Если НаборЗаписей.Количество() > 0 Тогда + // СвязанСКлиентом = ЗначениеЗаполнено(НаборЗаписей[0].Клиент); + // Иначе + // СвязанСКлиентом = Ложь; + // КонецЕсли; + // РегистрыСведений.CRM_СостоянияЛидов.ЗаписатьСостояниеЛида(Источник.Ссылка,,,,, СвязанСКлиентом); + // КонецЕсли; + //КонецЕсли; + // #ГК-ИН 20220214 } + + CRM_ОбщегоНазначенияСервер.ЗаполнитьНаличиеПрисоединенногоФайлаВЗаписиОбщегоЖурнала(Источник.ссылка); + +КонецПроцедуры // ЗарегистрироватьОбъектВОбщемЖурнале() + +// Процедура анализирует документы, в которых введен телефон/e-mail, но не указан партнер/контактное лицо +// и при наличии у партнер/контактного лица этих контактных данных прописывает ссылку на него в документ. +// +// Параметры: +// ПартнерИлиМассив - Массив, СправочникСсылка.Партнеры, СправочникСсылка.КонтактныеЛицаПартнеров - партнеры +// или контактные лица анализа. +// СтрокаСообщения - Строка - строка, в которую возвращается результат выполнения процедуры. +// МассивПривязанныхДокументов - Массив, в который возвращаются привязанные документы. +// +Процедура ПривязатьВзаимодействияПоКлиенту(ПартнерИлиМассив, СтрокаСообщения = "", МассивПривязанныхДокументов = Неопределено) Экспорт + Если ТипЗнч(ПартнерИлиМассив) = Тип("Массив") Тогда + МассивПартнеров = ПартнерИлиМассив; + Иначе + МассивПартнеров = Новый Массив(); + МассивПартнеров.Добавить(ПартнерИлиМассив); + КонецЕсли; + + ТаблицаПартнеров = Новый ТаблицаЗначений(); + ТаблицаПартнеров.Колонки.Добавить("Партнер"); + ТаблицаПартнеров.Колонки.Добавить("НомерТелефона", Новый ОписаниеТипов("Строка")); + ТаблицаПартнеров.Колонки.Добавить("НомерТелефонаБезКодов", Новый ОписаниеТипов("Строка")); + ТаблицаПартнеров.Колонки.Добавить("ПредставлениеТелефона", Новый ОписаниеТипов("Строка")); + ТаблицаПартнеров.Колонки.Добавить("АдресЭП", Новый ОписаниеТипов("Строка")); + ТаблицаПартнеров.Колонки.Добавить("ПредставлениеЭП", Новый ОписаниеТипов("Строка")); + + Для Каждого Партнер Из МассивПартнеров Цикл + Если ((ТипЗнч(Партнер) <> Тип("СправочникСсылка.Партнеры") Или Партнер.ЭтоГруппа) + И ТипЗнч(Партнер) <> Тип("СправочникСсылка.КонтактныеЛицаПартнеров")) + Или Не ЗначениеЗаполнено(Партнер) Тогда + // + Продолжить; + КонецЕсли; + + Для Каждого СтрокаТаблицы Из Партнер.КонтактнаяИнформация Цикл + Если СтрокаТаблицы.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты И + (ЗначениеЗаполнено(СтрокаТаблицы.АдресЭП) Или ЗначениеЗаполнено(СтрокаТаблицы.Представление)) Тогда + // + Если ЗначениеЗаполнено(СтрокаТаблицы.АдресЭП) Тогда + НоваяСтрока = ТаблицаПартнеров.Добавить(); + НоваяСтрока.Партнер = Партнер; + НоваяСтрока.АдресЭП = ВРег(СокрЛП(СтрокаТаблицы.АдресЭП)); + КонецЕсли; + Если ЗначениеЗаполнено(СтрокаТаблицы.Представление) Тогда + НоваяСтрока = ТаблицаПартнеров.Добавить(); + НоваяСтрока.Партнер = Партнер; + НоваяСтрока.ПредставлениеЭП = ВРег(СокрЛП(СтрокаТаблицы.Представление)); + КонецЕсли; + + ИначеЕсли СтрокаТаблицы.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон И + (ЗначениеЗаполнено(СтрокаТаблицы.НомерТелефона) Или ЗначениеЗаполнено(СтрокаТаблицы.НомерТелефонаБезКодов) Или ЗначениеЗаполнено(СтрокаТаблицы.Представление)) Тогда + // + НоваяСтрока = ТаблицаПартнеров.Добавить(); + НоваяСтрока.Партнер = Партнер; + Если ЗначениеЗаполнено(СтрокаТаблицы.НомерТелефона) Тогда + НомерТлф = СокрЛП(СтрокаТаблицы.НомерТелефона); + НомерТлф = СтрЗаменить(НомерТлф, "(", ""); + НомерТлф = СтрЗаменить(НомерТлф, ")", ""); + НомерТлф = СтрЗаменить(НомерТлф, " ", ""); + НоваяСтрока.НомерТелефона = НомерТлф; + КонецЕсли; + Если ЗначениеЗаполнено(СтрокаТаблицы.НомерТелефонаБезКодов) Тогда + НомерТлф = СокрЛП(СтрокаТаблицы.НомерТелефонаБезКодов); + НомерТлф = СтрЗаменить(НомерТлф, "(", ""); + НомерТлф = СтрЗаменить(НомерТлф, ")", ""); + НомерТлф = СтрЗаменить(НомерТлф, " ", ""); + НоваяСтрока.НомерТелефонаБезКодов = НомерТлф; + КонецЕсли; + Если ЗначениеЗаполнено(СтрокаТаблицы.Представление) Тогда + НомерТлф = СокрЛП(СтрокаТаблицы.Представление); + НомерТлф = СтрЗаменить(НомерТлф, "(", ""); + НомерТлф = СтрЗаменить(НомерТлф, ")", ""); + НомерТлф = СтрЗаменить(НомерТлф, " ", ""); + НоваяСтрока.ПредставлениеТелефона = SMS4B_ОтправкаSMS.ФорматироватьНомер(НомерТлф); + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + КонецЦикла; + + Если ТаблицаПартнеров.Количество() = 0 Тогда + // СтрокаСообщения = СтрокаСообщения + ?(ПустаяСтрока(СтрокаСообщения), "", Символы.ПС); + // СтрокаСообщения = СтрокаСообщения + // + НСтр("ru='Не заполнены номер телефона и E-Mail в контактной информации!';en='Phone number and E-Mail in the contact information was not fill!'"); + //// + Возврат; + КонецЕсли; + + ТекстЗапроса = " + |ВЫБРАТЬ + | Таблица.Ссылка КАК Ссылка + |ИЗ + | Документ.ЭлектронноеПисьмоВходящее КАК Таблица + |ГДЕ + | (ТИПЗНАЧЕНИЯ(Таблица.ОтправительКонтакт) = ТИП(СТРОКА) И Таблица.ОтправительКонтакт <> """" ИЛИ Таблица.ОтправительКонтакт = НЕОПРЕДЕЛЕНО) + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | Таблица.Ссылка КАК Ссылка + |ИЗ + | Документ.ЭлектронноеПисьмоВходящее.ПолучателиПисьма КАК Таблица + |ГДЕ + | (ТИПЗНАЧЕНИЯ(Таблица.Контакт) = ТИП(СТРОКА) И Таблица.Контакт <> """" ИЛИ Таблица.Контакт = НЕОПРЕДЕЛЕНО) + | И Таблица.Адрес <> """" + | И НЕ Таблица.Ссылка.ПометкаУдаления + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | Таблица.Ссылка КАК Ссылка + |ИЗ + | Документ.ЭлектронноеПисьмоВходящее.ПолучателиКопий КАК Таблица + |ГДЕ + | (ТИПЗНАЧЕНИЯ(Таблица.Контакт) = ТИП(СТРОКА) И Таблица.Контакт <> """" ИЛИ Таблица.Контакт = НЕОПРЕДЕЛЕНО) + | И Таблица.Адрес <> """" + | И НЕ Таблица.Ссылка.ПометкаУдаления + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | Таблица.Ссылка КАК Ссылка + |ИЗ + | Документ.ЭлектронноеПисьмоВходящее.ПолучателиОтвета КАК Таблица + |ГДЕ + | (ТИПЗНАЧЕНИЯ(Таблица.Контакт) = ТИП(СТРОКА) И Таблица.Контакт <> """" ИЛИ Таблица.Контакт = НЕОПРЕДЕЛЕНО) + | И Таблица.Адрес <> """" + | И НЕ Таблица.Ссылка.ПометкаУдаления + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | Таблица.Ссылка КАК Ссылка + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее.ПолучателиПисьма КАК Таблица + |ГДЕ + | (ТИПЗНАЧЕНИЯ(Таблица.Контакт) = ТИП(СТРОКА) И Таблица.Контакт <> """" ИЛИ Таблица.Контакт = НЕОПРЕДЕЛЕНО) + | И Таблица.Адрес <> """" + | И НЕ Таблица.Ссылка.ПометкаУдаления + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | Таблица.Ссылка КАК Ссылка + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее.ПолучателиКопий КАК Таблица + |ГДЕ + | (ТИПЗНАЧЕНИЯ(Таблица.Контакт) = ТИП(СТРОКА) И Таблица.Контакт <> """" ИЛИ Таблица.Контакт = НЕОПРЕДЕЛЕНО) + | И Таблица.Адрес <> """" + | И НЕ Таблица.Ссылка.ПометкаУдаления + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | Таблица.Ссылка КАК Ссылка + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее.ПолучателиОтвета КАК Таблица + |ГДЕ + | (ТИПЗНАЧЕНИЯ(Таблица.Контакт) = ТИП(СТРОКА) И Таблица.Контакт <> """" ИЛИ Таблица.Контакт = НЕОПРЕДЕЛЕНО) + | И Таблица.Адрес <> """" + | И НЕ Таблица.Ссылка.ПометкаУдаления + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | Таблица.Ссылка КАК Ссылка + |ИЗ + | Документ.СообщениеSMS.Адресаты КАК Таблица + |ГДЕ + | Таблица.Контакт = НЕОПРЕДЕЛЕНО + | И Таблица.КакСвязаться <> """" + | И НЕ Таблица.Ссылка.ПометкаУдаления + | + | СГРУППИРОВАТЬ + |ПО + | Ссылка + |"; + + Запрос = Новый Запрос(ТекстЗапроса); + ВыборкаСсылки = Запрос.Выполнить().Выбрать(); + КоличествоПривязанныхВзаимодействий = 0; + Пока ВыборкаСсылки.Следующий() Цикл + ДокументСсылка = ВыборкаСсылки.Ссылка; + Попытка + ДокументОбъект = ДокументСсылка.ПолучитьОбъект(); + Исключение + ИнфОбОшибке = ИнформацияОбОшибке(); + + СтрокаСообщения = СтрокаСообщения + ?(ПустаяСтрока(СтрокаСообщения), "", Символы.ПС); + СтрокаСообщения = СтрокаСообщения + + НСтр("ru='Ошибка при получении объекта документа';en='Error when obtaining object of the document'") + + " """ + Строка(ДокументСсылка) + """: " + + КраткоеПредставлениеОшибки(ИнфОбОшибке); + // + Продолжить; + КонецПопытки; + + бБылиИзменения = Ложь; + Если ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.ЭлектронноеПисьмоВходящее") Или ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.ЭлектронноеПисьмоИсходящее") Тогда + Если ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.ЭлектронноеПисьмоВходящее") Тогда + Если (Не ЗначениеЗаполнено(ДокументОбъект.ОтправительКонтакт) Или ТипЗнч(ДокументОбъект.ОтправительКонтакт) = Тип("Строка")) И ЗначениеЗаполнено(ДокументОбъект.ОтправительАдрес) Тогда + НайденныеСтроки = ТаблицаПартнеров.НайтиСтроки(Новый Структура("АдресЭП", ВРег(СокрЛп(ДокументОбъект.ОтправительАдрес)))); + Иначе + НайденныеСтроки = Новый Массив; + КонецЕсли; + Если НайденныеСтроки.Количество() = 0 Тогда + НайденныеСтроки = ТаблицаПартнеров.НайтиСтроки(Новый Структура("ПредставлениеЭП", ВРег(СокрЛп(ДокументОбъект.ОтправительАдрес)))); + КонецЕсли; + Если НайденныеСтроки.Количество() > 0 Тогда + ДокументОбъект.ОтправительКонтакт = НайденныеСтроки[0].Партнер; + бБылиИзменения = Истина; + КонецЕсли; + КонецЕсли; + + Для Каждого СтрокаТаблицы Из ДокументОбъект.ПолучателиПисьма Цикл + Если (Не ЗначениеЗаполнено(СтрокаТаблицы.Контакт) Или ТипЗнч(СтрокаТаблицы.Контакт) = Тип("Строка")) И ЗначениеЗаполнено(СтрокаТаблицы.Адрес) Тогда + НайденныеСтроки = ТаблицаПартнеров.НайтиСтроки(Новый Структура("АдресЭП", ВРег(СокрЛп(СтрокаТаблицы.Адрес)))); + Если НайденныеСтроки.Количество() = 0 Тогда + НайденныеСтроки = ТаблицаПартнеров.НайтиСтроки(Новый Структура("ПредставлениеЭП", ВРег(СокрЛп(СтрокаТаблицы.Адрес)))); + КонецЕсли; + Если НайденныеСтроки.Количество() > 0 Тогда + СтрокаТаблицы.Контакт = НайденныеСтроки[0].Партнер; + бБылиИзменения = Истина; + КонецЕсли; + КонецЕсли; + КонецЦикла; + Для Каждого СтрокаТаблицы Из ДокументОбъект.ПолучателиКопий Цикл + Если (Не ЗначениеЗаполнено(СтрокаТаблицы.Контакт) Или ТипЗнч(СтрокаТаблицы.Контакт) = Тип("Строка")) И ЗначениеЗаполнено(СтрокаТаблицы.Адрес) Тогда + НайденныеСтроки = ТаблицаПартнеров.НайтиСтроки(Новый Структура("АдресЭП", ВРег(СокрЛп(СтрокаТаблицы.Адрес)))); + Если НайденныеСтроки.Количество() = 0 Тогда + НайденныеСтроки = ТаблицаПартнеров.НайтиСтроки(Новый Структура("ПредставлениеЭП", ВРег(СокрЛп(СтрокаТаблицы.Адрес)))); + КонецЕсли; + Если НайденныеСтроки.Количество() > 0 Тогда + СтрокаТаблицы.Контакт = НайденныеСтроки[0].Партнер; + бБылиИзменения = Истина; + КонецЕсли; + КонецЕсли; + КонецЦикла; + Для Каждого СтрокаТаблицы Из ДокументОбъект.ПолучателиОтвета Цикл + Если (Не ЗначениеЗаполнено(СтрокаТаблицы.Контакт) Или ТипЗнч(СтрокаТаблицы.Контакт) = Тип("Строка")) И ЗначениеЗаполнено(СтрокаТаблицы.Адрес) Тогда + НайденныеСтроки = ТаблицаПартнеров.НайтиСтроки(Новый Структура("АдресЭП", ВРег(СокрЛп(СтрокаТаблицы.Адрес)))); + Если НайденныеСтроки.Количество() = 0 Тогда + НайденныеСтроки = ТаблицаПартнеров.НайтиСтроки(Новый Структура("ПредставлениеЭП", ВРег(СокрЛп(СтрокаТаблицы.Адрес)))); + КонецЕсли; + Если НайденныеСтроки.Количество() > 0 Тогда + СтрокаТаблицы.Контакт = НайденныеСтроки[0].Партнер; + бБылиИзменения = Истина; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + ИначеЕсли ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.СообщениеSMS") Тогда + Для Каждого СтрокаТаблицы Из ДокументОбъект.Адресаты Цикл + Если (Не ЗначениеЗаполнено(СтрокаТаблицы.Контакт) Или ТипЗнч(СтрокаТаблицы.Контакт) = Тип("Строка")) И ЗначениеЗаполнено(СтрокаТаблицы.НомерДляОтправки) Тогда + НомерТлф = СокрЛП(СтрокаТаблицы.НомерДляОтправки); + НомерТлф = СтрЗаменить(НомерТлф, "(", ""); + НомерТлф = СтрЗаменить(НомерТлф, ")", ""); + НомерТлф = СтрЗаменить(НомерТлф, " ", ""); + НайденныеСтроки = ТаблицаПартнеров.НайтиСтроки(Новый Структура("НомерТелефона", НомерТлф)); + Если НайденныеСтроки.Количество() = 0 Тогда + НайденныеСтроки = ТаблицаПартнеров.НайтиСтроки(Новый Структура("НомерТелефонаБезКодов", НомерТлф)); + КонецЕсли; + Если НайденныеСтроки.Количество() = 0 Тогда + НайденныеСтроки = ТаблицаПартнеров.НайтиСтроки(Новый Структура("ПредставлениеТелефона", НомерТлф)); + КонецЕсли; + Если НайденныеСтроки.Количество() > 0 Тогда + СтрокаТаблицы.Контакт = НайденныеСтроки[0].Партнер; + СтрокаТаблицы.ПредставлениеКонтакта = СтрокаТаблицы.Контакт.Наименование; + бБылиИзменения = Истина; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + КонецЕсли; + + Если бБылиИзменения Тогда + Попытка + // ДокументОбъект.ОбменДанными.Загрузка = Истина; + ДокументОбъект.Записать(); + КоличествоПривязанныхВзаимодействий = КоличествоПривязанныхВзаимодействий + 1; + Если ТипЗнч(МассивПривязанныхДокументов) = Тип("Массив") И МассивПривязанныхДокументов.Найти(ДокументСсылка) = Неопределено Тогда + МассивПривязанныхДокументов.Добавить(ДокументСсылка); + КонецЕсли; + ДокументОбъект = Неопределено; + Исключение + ИнфОбОшибке = ИнформацияОбОшибке(); + + СтрокаСообщения = СтрокаСообщения + ?(ПустаяСтрока(СтрокаСообщения), "", Символы.ПС); + СтрокаСообщения = СтрокаСообщения + + НСтр("ru='Ошибка при записи документа';en='Error at record of the document'") + + " """ + Строка(ДокументСсылка) + """: " + + КраткоеПредставлениеОшибки(ИнфОбОшибке); + // + + ДокументОбъект = Неопределено; + КонецПопытки; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Возвращает текст сообщения в случае, если отключена константа "CRM_ПланироватьПродажи" (Планирование продаж, контактов) +// +Функция ТекстСообщенияОНевозможностиПланирования() Экспорт + + Возврат (НСтр("ru='Возможность планирования продаж и контактов отключена в настройках параметров учета CRM.';en='The ability to plan sales and contacts is disabled in the CRM account settings.'")); + +КонецФункции + +// Процедура делает записи о изменениях в реквизитах партнера. +// +// Параметры: +// ПартнерИлиКонтактноеЛицоПартнера - СправочникСсылка.Партнеры, СправочникСсылка.КонтактныеЛицаПартнеров - Ссылка на +// партнера или КЛ партнера. +// СтруктураОбрабатываемыеРеквизиты - Структура - Структура в которой указано, какие реквизиты обрабатывать. +// НаДату - Дата - Если передан, то используется как дата в истории вместо текущей даты. +// АвторИзменений - СправочникСсылка.Пользователи - ссылка на пользователя, делающего изменения. +// +Процедура ЗаписатьИсториюРеквизитовПартнера(ПартнерИлиКонтактноеЛицоПартнера, СтруктураОбрабатываемыеРеквизиты, НаДату = Неопределено, АвторИзменений = Неопределено, ЭтоНовый = Ложь) Экспорт + + // #ГК-ИН 20210831 { Раскомментирован закомментированный типовой код. + Если Не ПолучитьФункциональнуюОпцию("CRM_ВестиИсториюРеквизитовКлиентов") Тогда Возврат; КонецЕсли; + // #ГК-ИН 20210831 } + + Если Не ЗначениеЗаполнено(ПартнерИлиКонтактноеЛицоПартнера) Тогда Возврат; КонецЕсли; + + Попытка ЭтоГруппа = ПартнерИлиКонтактноеЛицоПартнера.ЭтоГруппа; + Исключение ЭтоГруппа = Ложь; + КонецПопытки; + Если ЭтоГруппа Тогда Возврат; КонецЕсли; + + Настройка = РегистрыСведений.CRM_НастройкаВерсионированияРеквизитовПартнеров.ПолучитьНастройку(); + Если ТипЗнч(Настройка) = Тип("Структура") И Настройка.Свойство("СтруктураНастройки") Тогда + Если ТипЗнч(Настройка.СтруктураНастройки) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + Иначе + Возврат; + КонецЕсли; + + Реквизиты = Неопределено; + РеквизитыКонтактногоЛица = Неопределено; + РеквизитыИнтереса = Неопределено; + + Настройка.СтруктураНастройки.Свойство("Реквизиты", Реквизиты); + Настройка.СтруктураНастройки.Свойство("РеквизитыКонтактногоЛица", РеквизитыКонтактногоЛица); + Настройка.СтруктураНастройки.Свойство("РеквизитыИнтереса", РеквизитыИнтереса); + + Если ТипЗнч(Реквизиты) <> Тип("Массив") И ТипЗнч(РеквизитыКонтактногоЛица) <> ТипЗнч("Массив") И ТипЗнч(РеквизитыИнтереса) <> ТипЗнч("Массив") Тогда Возврат; КонецЕсли; + + ИспользоватьДополнительныеРеквизитыИСведения = ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеРеквизитыИСведения"); + + ТекДата = ?(ЗначениеЗаполнено(НаДату), НаДату, ТекущаяДатаСеанса()); + Автор = ?(ЗначениеЗаполнено(АвторИзменений), АвторИзменений, Пользователи.АвторизованныйПользователь()); + + Если СтруктураОбрабатываемыеРеквизиты.Свойство("Партнер") Или СтруктураОбрабатываемыеРеквизиты.Свойство("КонтактноеЛицоПартнера") Тогда + ТаблицаДанныеИсторииПартнера = РегистрыСведений.CRM_ИсторияРеквизитовПартнеров.СрезПоследних(ТекДата, Новый Структура("Партнер", ПартнерИлиКонтактноеЛицоПартнера)); + ТаблицаДанныеИсторииПартнера.Сортировать("Период убыв"); + КонецЕсли; + + НаборЗаписей = РегистрыСведений.CRM_ИсторияРеквизитовПартнеров.СоздатьНаборЗаписей(); + ТаблицаЗаписей = НаборЗаписей.Выгрузить(); + + Если ТипЗнч(ПартнерИлиКонтактноеЛицоПартнера) = Тип("СправочникСсылка.Партнеры") Тогда + ИтераторРеквизитов = Реквизиты; + ИначеЕсли ТипЗнч(ПартнерИлиКонтактноеЛицоПартнера) = Тип("СправочникСсылка.КонтактныеЛицаПартнеров") Тогда + ИтераторРеквизитов = РеквизитыКонтактногоЛица; + ИначеЕсли ТипЗнч(ПартнерИлиКонтактноеЛицоПартнера) = Тип("ДокументСсылка.CRM_Интерес") Тогда + ИтераторРеквизитов = РеквизитыИнтереса; + Иначе + Возврат; + КонецЕсли; + Если ТипЗнч(ИтераторРеквизитов) <> Тип("Массив") Тогда Возврат; КонецЕсли; + + Для Каждого Реквизит Из ИтераторРеквизитов Цикл + + Если Реквизит = "Сегмент" И СтруктураОбрабатываемыеРеквизиты.Свойство("Сегмент") И ТипЗнч(ПартнерИлиКонтактноеЛицоПартнера) = Тип("СправочникСсылка.Партнеры") Тогда + Запрос = Новый Запрос(" + |ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Сегмент, + | Партнер + |ИЗ + | РегистрСведений.ПартнерыСегмента + |ГДЕ + | Партнер = &Партнер"); + Запрос.УстановитьПараметр("Партнер", ПартнерИлиКонтактноеЛицоПартнера); + ПартнерыСегмента = Запрос.Выполнить().Выгрузить(); + + НаборЗаписейПартнерыСегмента = РегистрыСведений.CRM_ПартнерыСегментаПериодический.СоздатьНаборЗаписей(); + ТаблицаЗаписейЗаписейПартнерыСегмента = НаборЗаписейПартнерыСегмента.Выгрузить(); + + Для Каждого СтрокаТаблицы Из ПартнерыСегмента Цикл + НоваяСтрока = ТаблицаЗаписейЗаписейПартнерыСегмента.Добавить(); + НоваяСтрока.Партнер = СтрокаТаблицы.Партнер; + НоваяСтрока.Сегмент = СтрокаТаблицы.Сегмент; + НоваяСтрока.Период = ТекДата; + КонецЦикла; + Если ТаблицаЗаписейЗаписейПартнерыСегмента.Количество() > 0 Тогда + НаборЗаписейПартнерыСегмента.Загрузить(ТаблицаЗаписейЗаписейПартнерыСегмента); + НаборЗаписейПартнерыСегмента.Отбор.Партнер.Установить(ПартнерИлиКонтактноеЛицоПартнера); + НаборЗаписейПартнерыСегмента.Отбор.Период.Установить(ТекДата); + НаборЗаписейПартнерыСегмента.Записать(); + + НоваяСтрока = ТаблицаЗаписей.Добавить(); + НоваяСтрока.Партнер = ПартнерИлиКонтактноеЛицоПартнера; + НоваяСтрока.Автор = Автор; + НоваяСтрока.Период = ТекДата; + НоваяСтрока.ПутьКДанным = "Сегмент"; + КонецЕсли; + + ИначеЕсли СтруктураОбрабатываемыеРеквизиты.Свойство("Партнер") Или СтруктураОбрабатываемыеРеквизиты.Свойство("КонтактноеЛицоПартнера") Тогда + бСохранять = Ложь; + + Если ТипЗнч(Реквизит) = Тип("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения") И ИспользоватьДополнительныеРеквизитыИСведения Тогда + СтрокаДопРеквизита = ПартнерИлиКонтактноеЛицоПартнера.ДополнительныеРеквизиты.Найти(Реквизит, "Свойство"); + Если СтрокаДопРеквизита = Неопределено Тогда + НайденныеСтроки = ТаблицаДанныеИсторииПартнера.НайтиСтроки(Новый Структура("ПутьКДанным", Реквизит)); + Если НайденныеСтроки.Количество() = 0 Тогда + Продолжить; + Иначе + // Значение доп. реквизита было очищено. + Если ЗначениеЗаполнено(НайденныеСтроки[0].Значение) Тогда + Попытка ЗначениеРеквизита = Реквизит.ТипЗначения.ПривестиЗначение(Неопределено); + Исключение ЗначениеРеквизита = Неопределено; + КонецПопытки; + бСохранять = Истина; + Иначе + Продолжить; + КонецЕсли; + КонецЕсли; + Иначе + ЗначениеРеквизита = СтрокаДопРеквизита.Значение; + КонецЕсли; + ИначеЕсли ТипЗнч(Реквизит) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда + СтрокаКИ = ПартнерИлиКонтактноеЛицоПартнера.КонтактнаяИнформация.Найти(Реквизит, "Вид"); + Если СтрокаКИ = Неопределено Тогда + НайденныеСтроки = ТаблицаДанныеИсторииПартнера.НайтиСтроки(Новый Структура("ПутьКДанным", Реквизит)); + Если НайденныеСтроки.Количество() = 0 Тогда + Продолжить; + Иначе + // Значение КИ было очищено + Если ЗначениеЗаполнено(НайденныеСтроки[0].Значение) Тогда + ЗначениеРеквизита = ""; + бСохранять = Истина; + Иначе + Продолжить; + КонецЕсли; + КонецЕсли; + Иначе + ЗначениеРеквизита = СтрокаКИ.Представление; + КонецЕсли; + Иначе + Попытка ЗначениеРеквизита = ПартнерИлиКонтактноеЛицоПартнера[Реквизит]; + Исключение Продолжить; + КонецПопытки; + КонецЕсли; + + Если Не бСохранять Тогда + НайденныеСтроки = ТаблицаДанныеИсторииПартнера.НайтиСтроки(Новый Структура("ПутьКДанным", Реквизит)); + Если НайденныеСтроки.Количество() > 0 Тогда + Если НайденныеСтроки[0].Значение <> ЗначениеРеквизита Тогда + бСохранять = Истина; + КонецЕсли; + Иначе + бСохранять = ЗначениеЗаполнено(ЗначениеРеквизита); + КонецЕсли; + КонецЕсли; + Если бСохранять Тогда + НоваяСтрока = ТаблицаЗаписей.Добавить(); + НоваяСтрока.Партнер = ПартнерИлиКонтактноеЛицоПартнера; + НоваяСтрока.Автор = Автор; + НоваяСтрока.ЭтоНовый = ЭтоНовый; + НоваяСтрока.Период = ТекДата; + НоваяСтрока.ПутьКДанным = Реквизит; + НоваяСтрока.Значение = ЗначениеРеквизита; + НайденныеСтроки = ТаблицаДанныеИсторииПартнера.НайтиСтроки(Новый Структура("ПутьКДанным", Реквизит)); + Если НайденныеСтроки.Количество() > 0 Тогда + НоваяСтрока.СтароеЗначение = НайденныеСтроки[0].Значение; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + Если СтруктураОбрабатываемыеРеквизиты.Свойство("ABCКласс") И ТипЗнч(ПартнерИлиКонтактноеЛицоПартнера) = Тип("СправочникСсылка.Партнеры") Тогда + НоваяСтрока = ТаблицаЗаписей.Добавить(); + НоваяСтрока.Партнер = ПартнерИлиКонтактноеЛицоПартнера; + НоваяСтрока.Автор = Автор; + НоваяСтрока.Период = ТекДата; + НоваяСтрока.ПутьКДанным = "ABCКласс"; + ИначеЕсли СтруктураОбрабатываемыеРеквизиты.Свойство("XYZКласс") И ТипЗнч(ПартнерИлиКонтактноеЛицоПартнера) = Тип("СправочникСсылка.Партнеры") Тогда + НоваяСтрока = ТаблицаЗаписей.Добавить(); + НоваяСтрока.Партнер = ПартнерИлиКонтактноеЛицоПартнера; + НоваяСтрока.Автор = Автор; + НоваяСтрока.Период = ТекДата; + НоваяСтрока.ПутьКДанным = "XYZКласс"; + КонецЕсли; + + // #ГК-ГЕ 20190711 { + УстановитьПривилегированныйРежим(Истина); + // #ГК-ГЕ 20190711 } + + Если ТаблицаЗаписей.Количество() > 0 Тогда + СтрокаСвернуть = ""; + Для Каждого Измерение Из Метаданные.РегистрыСведений.CRM_ИсторияРеквизитовПартнеров.Измерения Цикл + СтрокаСвернуть = СтрокаСвернуть + Измерение.Имя + ","; + КонецЦикла; + Для Каждого Ресурс Из Метаданные.РегистрыСведений.CRM_ИсторияРеквизитовПартнеров.Ресурсы Цикл + СтрокаСвернуть = СтрокаСвернуть + Ресурс.Имя + ","; + КонецЦикла; + Для Каждого Реквизит Из Метаданные.РегистрыСведений.CRM_ИсторияРеквизитовПартнеров.Реквизиты Цикл + СтрокаСвернуть = СтрокаСвернуть + Реквизит.Имя + ","; + КонецЦикла; + СтрокаСвернуть = СтрокаСвернуть + "Период"; + ТаблицаЗаписей.Свернуть(СтрокаСвернуть); + + Для Каждого СтрокаТаблицы Из ТаблицаЗаписей Цикл + МенеджерЗаписи = РегистрыСведений.CRM_ИсторияРеквизитовПартнеров.СоздатьМенеджерЗаписи(); + ЗаполнитьЗначенияСвойств(МенеджерЗаписи, СтрокаТаблицы, СтрокаСвернуть); + МенеджерЗаписи.Записать(); + КонецЦикла; + КонецЕсли; + + // #ГК-ГЕ 20190711 { + УстановитьПривилегированныйРежим(Ложь); + // #ГК-ГЕ 20190711 } + +КонецПроцедуры + +// Возвращает массив всех дополнительных реквизитов партнеров. +// +Функция ПолучитьВсеДополнительныеРеквизитыПартнеров() Экспорт + МассивВсехДопРеквизитов = Новый Массив(); + Для Каждого СтрокаТаблицы Из Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Партнеры_Общие.ДополнительныеРеквизиты Цикл + Если МассивВсехДопРеквизитов.Найти(СтрокаТаблицы.Свойство) = Неопределено Тогда + МассивВсехДопРеквизитов.Добавить(СтрокаТаблицы.Свойство); + КонецЕсли; + КонецЦикла; + + Для Каждого СтрокаТаблицы Из Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Партнеры_Компании_CRM.ДополнительныеРеквизиты Цикл + Если МассивВсехДопРеквизитов.Найти(СтрокаТаблицы.Свойство) = Неопределено Тогда + МассивВсехДопРеквизитов.Добавить(СтрокаТаблицы.Свойство); + КонецЕсли; + КонецЦикла; + + Для Каждого СтрокаТаблицы Из Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Партнеры_ЧастныеЛица_CRM.ДополнительныеРеквизиты Цикл + Если МассивВсехДопРеквизитов.Найти(СтрокаТаблицы.Свойство) = Неопределено Тогда + МассивВсехДопРеквизитов.Добавить(СтрокаТаблицы.Свойство); + КонецЕсли; + КонецЦикла; + + Возврат МассивВсехДопРеквизитов; + +КонецФункции + +Функция НайтиДубли(Объект, СтруктураПоиска, СписокКонтактов, ТочноеСоответствие) Экспорт + УстановитьПривилегированныйРежим(Истина); + Запрос = Новый Запрос; + Сч = 0; + ПервоеЗначение = Истина; + Для Каждого КлючИЗначение Из СтруктураПоиска Цикл + ИмяРеквизита = КлючИЗначение.Ключ; + Если ТочноеСоответствие Тогда + СтепеньСхожести = "="; + Иначе + СтепеньСхожести = КлючИЗначение.Значение; + КонецЕсли; + ЗначениеРеквизита = Неопределено; + Реквизиты = ""; + Сч = Сч + 1; + Если Найти(ИмяРеквизита,"Контакт") = 0 Тогда + Если ТипЗнч(Объект) = Тип("Структура") Тогда + Объект.Свойство(ИмяРеквизита, ЗначениеРеквизита); + Иначе + ЗначениеРеквизита = Объект[ИмяРеквизита]; + КонецЕсли; + Если НЕ ЗначениеЗаполнено(ЗначениеРеквизита) Тогда + Продолжить; + КонецЕсли; + + Если НЕ ПервоеЗначение Тогда + Реквизиты = " + | ОБЪЕДИНИТЬ ВСЕ + |"; + КонецЕсли; + Реквизиты = Реквизиты + " + |ВЫБРАТЬ + |Данные.Ссылка" + ?(ПервоеЗначение, " КАК Ссылка", ""); + Реквизиты = Реквизиты + " + |,Данные." + ИмяРеквизита + ?(ПервоеЗначение, " КАК Реквизит", ""); + Реквизиты = Реквизиты + " + |,""" + ИмяРеквизита + """" + ?(ПервоеЗначение, " КАК ИмяРеквизита", ""); + Условия = " + |Данные." + ИмяРеквизита + " " + СтепеньСхожести + " &" + ИмяРеквизита + Строка(Сч); + Запрос.УстановитьПараметр(ИмяРеквизита + Строка(Сч), ?(СтепеньСхожести = "ПОДОБНО", "%" + ЗначениеРеквизита + "%", ЗначениеРеквизита)); + Запрос.Текст = Запрос.Текст + Реквизиты + " + |ИЗ Справочник.Партнеры КАК Данные + |ГДЕ " + Сред(Условия, 2); + ПервоеЗначение = Ложь; + Иначе + Массив = Новый Массив; + Для Каждого Стр Из СписокКонтактов Цикл + ИмяРеквизита = СтрЗаменить(ИмяРеквизита, "Контакт_", ""); + Если Стр.Значение = ИмяРеквизита И ЗначениеЗаполнено(Стр.Представление) Тогда + Массив.Добавить(Стр.Представление); + КонецЕсли; + КонецЦикла; + Если Массив.Количество() > 0 Тогда + Для Каждого Стр Из Массив Цикл + Если НЕ ПервоеЗначение Тогда + Реквизиты = " + | ОБЪЕДИНИТЬ ВСЕ + |"; + КонецЕсли; + Реквизиты = Реквизиты + " + |ВЫБРАТЬ + |Данные.Ссылка" + ?(ПервоеЗначение, " КАК Ссылка", ""); + Реквизиты = Реквизиты + " + |,Данные.Представление" + ?(ПервоеЗначение, " КАК Реквизит", ""); + Реквизиты = Реквизиты + " + |,""" + ИмяРеквизита + """" + ?(ПервоеЗначение, " КАК ИмяРеквизита", ""); + Условия = " + |Данные.Представление " + СтепеньСхожести + " &" + ИмяРеквизита + Строка(Сч) + " + |И Данные.Тип = &Тип" + Строка(Сч); + Запрос.УстановитьПараметр(ИмяРеквизита + Строка(Сч), ?(СтепеньСхожести = "ПОДОБНО", "%" + Стр + "%", Стр)); + Если ИмяРеквизита = "Адрес" Тогда + Запрос.УстановитьПараметр("Тип" + Строка(Сч), Перечисления.ТипыКонтактнойИнформации.Адрес); + ИначеЕсли ИмяРеквизита = "Телефон" Тогда + Запрос.УстановитьПараметр("Тип" + Строка(Сч), Перечисления.ТипыКонтактнойИнформации.Телефон); + ИначеЕсли ИмяРеквизита = "АдресЭлектроннойПочты" Тогда + Запрос.УстановитьПараметр("Тип" + Строка(Сч), Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты); + КонецЕсли; + Запрос.Текст = Запрос.Текст + Реквизиты + " + |ИЗ Справочник.Партнеры.КонтактнаяИнформация КАК Данные + |ГДЕ " + Сред(Условия, 2); + Сч = Сч + 1; + ПервоеЗначение = Ложь; + КонецЦикла; + КонецЕсли; + КонецЕсли; + КонецЦикла; + Если ПустаяСтрока(Запрос.Текст) Тогда + Возврат Неопределено; + КонецЕсли; + Возврат Запрос.Выполнить().Выбрать(); +КонецФункции + +#Область ДетальныйПоиск + +Функция НайтиДублиПартнеров(СтруктураОбъекта, СтруктураПоиска) Экспорт + УстановитьПривилегированныйРежим(Истина); + МассивНайденных = Новый Массив; + Для Каждого КлючИЗначение Из СтруктураПоиска Цикл + ИмяРеквизита = КлючИЗначение.Ключ; + НайденноеЗначение = ""; + Если ТипЗнч(СтруктураОбъекта) = Тип("Структура") Тогда + СтруктураОбъекта.Свойство(ИмяРеквизита, НайденноеЗначение); + Иначе + НайденноеЗначение = СтруктураОбъекта[ИмяРеквизита]; + КонецЕсли; + Если НЕ ЗначениеЗаполнено(НайденноеЗначение) Тогда + Если Найти(ИмяРеквизита, "CRM_") = 1 Тогда + ИмяРеквизита = СтрЗаменить(ИмяРеквизита, "CRM_", ""); + ИначеЕсли Найти(ИмяРеквизита, "Контакт_") = 1 Тогда + ИмяРеквизита = СтрЗаменить(ИмяРеквизита, "Контакт_", ""); + Иначе + Продолжить; + КонецЕсли; + Если ТипЗнч(СтруктураОбъекта) = Тип("Структура") Тогда + СтруктураОбъекта.Свойство(ИмяРеквизита, НайденноеЗначение); + Иначе + НайденноеЗначение = СтруктураОбъекта[ИмяРеквизита]; + КонецЕсли; + Если НЕ ЗначениеЗаполнено(НайденноеЗначение) Тогда + Продолжить; + КонецЕсли; + КонецЕсли; + Если ИмяРеквизита = "Наименование" Тогда + МассивПартнеров = НайтиПартнераПоНаименованию(НайденноеЗначение, 0, Ложь); + ИначеЕсли ИмяРеквизита = "НаименованиеПолное" Тогда + МассивПартнеров = НайтиПартнераПоНаименованию(НайденноеЗначение, 1, Ложь); + ИначеЕсли (ИмяРеквизита = "ИНН") ИЛИ (ИмяРеквизита = "CRM_ИНН") Тогда + МассивПартнеров = НайтиПартнераПоИНН(НайденноеЗначение, Ложь); + ИначеЕсли (ИмяРеквизита = "Телефон") ИЛИ (ИмяРеквизита = "Контакт_Телефон") Тогда + МассивПартнеров = НайтиПартнераПоКИ(НайденноеЗначение, 1, Ложь); + // #ГК-ИН 20190128 { + ИначеЕсли (ИмяРеквизита = "Телефон1") ИЛИ (ИмяРеквизита = "Телефон2") ИЛИ (ИмяРеквизита = "Телефон3") Тогда + МассивПартнеров = НайтиПартнераПоКИ(НайденноеЗначение, 1, Ложь); + // #ГК-ИН 20190128 } + ИначеЕсли (ИмяРеквизита = "АдресЭлектроннойПочты") ИЛИ (ИмяРеквизита = "Контакт_АдресЭлектроннойПочты") Тогда + МассивПартнеров = НайтиПартнераПоКИ(НайденноеЗначение, 2, Ложь); + ИначеЕсли (ИмяРеквизита = "Адрес") ИЛИ (ИмяРеквизита = "Контакт_Адрес") Тогда + МассивПартнеров = НайтиПартнераПоКИ(НайденноеЗначение, 6, Ложь); + ИначеЕсли ИмяРеквизита = "Сайт" Тогда + МассивПартнеров = НайтиПартнераПоКИ(НайденноеЗначение, 4, Ложь); + Иначе + МассивПартнеров = Новый Массив; + КонецЕсли; + Для Каждого СтрокаМассива Из МассивПартнеров Цикл + МассивНайденных.Добавить(СтрокаМассива); + КонецЦикла; + КонецЦикла; + Возврат МассивНайденных; +КонецФункции + +Функция НайтиПартнераПоКонтактномуЛицу(КонтактноеЛицо) Экспорт + Если ПустаяСтрока(КонтактноеЛицо) Тогда + Возврат Новый Массив(); + КонецЕсли; + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("КонтактноеЛицо", КонтактноеЛицо); + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | КонтактныеЛицаПартнеров.Владелец КАК Ссылка + |ИЗ + | Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров + |ГДЕ + | КонтактныеЛицаПартнеров.Наименование ПОДОБНО ""%"" + &КонтактноеЛицо + ""%"""; + Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); +КонецФункции + +Функция НайтиПартнераПоКИ(Представление, ТипКИ, ТолькоСсылка = Истина, СписокТиповКИИсключая = Неопределено) Экспорт + МассивПартнеров = Новый Массив(); + Если ПустаяСтрока(Представление) Тогда + Возврат МассивПартнеров; + КонецЕсли; + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Представление", Представление); + Если ТолькоСсылка Тогда + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ПартнерыКонтактнаяИнформация.Ссылка, + | ВЫРАЗИТЬ(ПартнерыКонтактнаяИнформация.Ссылка.НаименованиеПолное КАК СТРОКА(250)) КАК НаименованиеПолное, + | ПартнерыКонтактнаяИнформация.Ссылка.ОсновнойМенеджер КАК ОсновнойМенеджер + |ИЗ + | Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация + |ГДЕ + | (ПартнерыКонтактнаяИнформация.Представление ПОДОБНО ""%"" + &Представление + ""%"" + | ИЛИ ПартнерыКонтактнаяИнформация.НомерТелефона ПОДОБНО ""%"" + &Представление + ""%"" + | ИЛИ ПартнерыКонтактнаяИнформация.НомерТелефонаБезКодов ПОДОБНО ""%"" + &Представление + ""%"") + | И ПартнерыКонтактнаяИнформация.Тип = &Тип + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | КонтактныеЛицаПартнеровКонтактнаяИнформация.Ссылка.Владелец, + | НЕОПРЕДЕЛЕНО, + | НЕОПРЕДЕЛЕНО + |ИЗ + | Справочник.КонтактныеЛицаПартнеров.КонтактнаяИнформация КАК КонтактныеЛицаПартнеровКонтактнаяИнформация + |ГДЕ + | КонтактныеЛицаПартнеровКонтактнаяИнформация.Представление ПОДОБНО ""%"" + &Представление + ""%"" + | И КонтактныеЛицаПартнеровКонтактнаяИнформация.Тип = &Тип"; + Иначе + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ПартнерыКонтактнаяИнформация.Ссылка, + | ВЫРАЗИТЬ(ПартнерыКонтактнаяИнформация.Ссылка.НаименованиеПолное КАК СТРОКА(250)) КАК НаименованиеПолное, + | ПартнерыКонтактнаяИнформация.Ссылка.ОсновнойМенеджер КАК ОсновнойМенеджер, + | ПартнерыКонтактнаяИнформация.Представление КАК Реквизит, + | ПартнерыКонтактнаяИнформация.Вид.Наименование КАК ИмяРеквизита + |ИЗ + | Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация + |ГДЕ + | (ПартнерыКонтактнаяИнформация.Представление ПОДОБНО ""%"" + &Представление + ""%"" + | ИЛИ ПартнерыКонтактнаяИнформация.НомерТелефона ПОДОБНО ""%"" + &Представление + ""%"" + | ИЛИ ПартнерыКонтактнаяИнформация.НомерТелефонаБезКодов ПОДОБНО ""%"" + &Представление + ""%"") + | И ПартнерыКонтактнаяИнформация.Тип = &Тип + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | КонтактныеЛицаПартнеровКонтактнаяИнформация.Ссылка, + | НЕОПРЕДЕЛЕНО, + // #ГК-ИН 20190128 { + //| НЕОПРЕДЕЛЕНО, + | ВЫРАЗИТЬ(КонтактныеЛицаПартнеровКонтактнаяИнформация.Ссылка.Наименование КАК СТРОКА(250)) КАК НаименованиеПолное, + // #ГК-ИН 20190128 } + | КонтактныеЛицаПартнеровКонтактнаяИнформация.Представление, + | КонтактныеЛицаПартнеровКонтактнаяИнформация.Вид.Наименование + |ИЗ + | Справочник.КонтактныеЛицаПартнеров.КонтактнаяИнформация КАК КонтактныеЛицаПартнеровКонтактнаяИнформация + |ГДЕ + | КонтактныеЛицаПартнеровКонтактнаяИнформация.Представление ПОДОБНО ""%"" + &Представление + ""%"" + | И КонтактныеЛицаПартнеровКонтактнаяИнформация.Тип = &Тип"; + КонецЕсли; + Если ТипКИ = 1 Тогда + Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.Телефон); + РезультатЗапроса = Запрос.Выполнить(); + Если РезультатЗапроса.Пустой() Тогда + Если СтрДлина(Представление) = 11 Тогда + Представление1 = Лев(Представление, 1) + Сред(Представление, 2, 3) + Сред(Представление, 5, 3) + "-" + Сред(Представление, 8, 2) + "-" + Сред(Представление, 10, 2); + Запрос.УстановитьПараметр("Представление", Представление1); + ИначеЕсли СтрДлина(Представление) = 7 Тогда + Представление1 = Сред(Представление, 1, 3) + "-" + Сред(Представление, 4, 2)+ "-" + Сред(Представление, 6, 2); + Запрос.УстановитьПараметр("Представление", Представление1); + КонецЕсли; + КонецЕсли; + ИначеЕсли ТипКИ = 2 Тогда + Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты); + ИначеЕсли ТипКИ = 4 Тогда + Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.ВебСтраница); + ИначеЕсли ТипКИ = 6 Тогда + Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес); + МассивСлов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивСлов(Представление, ", "); + УсловиеДоп = "ИСТИНА"; + УсловиеДоп2 = "ИСТИНА"; + Итератор = 0; + Для Каждого Слово Из МассивСлов Цикл + Итератор = Итератор + 1; + УсловиеДоп = УсловиеДоп + " И ПартнерыКонтактнаяИнформация.Представление ПОДОБНО ""%"" + &Представление" + Строка(Итератор) + " + ""%"""; + УсловиеДоп2 = УсловиеДоп2 + " И КонтактныеЛицаПартнеровКонтактнаяИнформация.Представление ПОДОБНО ""%"" + &Представление" + Строка(Итератор) + " + ""%"""; + Запрос.УстановитьПараметр("Представление" + Строка(Итератор), Слово); + КонецЦикла; + Запрос.Текст = СтрЗаменить(Запрос.Текст, "ПартнерыКонтактнаяИнформация.Представление ПОДОБНО ""%"" + &Представление + ""%""", УсловиеДоп); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "КонтактныеЛицаПартнеровКонтактнаяИнформация.Представление ПОДОБНО ""%"" + &Представление + ""%""", УсловиеДоп2); + ИначеЕсли ТипКИ = 9 Тогда // Поиск по всей КИ исключая указанные + Если СписокТиповКИИсключая = Неопределено Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, "И ПартнерыКонтактнаяИнформация.Тип = &Тип", ""); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "И КонтактныеЛицаПартнеровКонтактнаяИнформация.Тип = &Тип", ""); + Иначе + Запрос.Текст = СтрЗаменить(Запрос.Текст, "И ПартнерыКонтактнаяИнформация.Тип = &Тип", "И НЕ ПартнерыКонтактнаяИнформация.Тип В (&Тип)"); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "И КонтактныеЛицаПартнеровКонтактнаяИнформация.Тип = &Тип", "И НЕ КонтактныеЛицаПартнеровКонтактнаяИнформация.Тип В (&Тип)"); + Запрос.УстановитьПараметр("Тип", СписокТиповКИИсключая); + КонецЕсли; + МассивСлов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивСлов(Представление, ", "); + УсловиеДоп = "ИСТИНА"; + УсловиеДоп2 = "ИСТИНА"; + Итератор = 0; + Для Каждого Слово Из МассивСлов Цикл + Итератор = Итератор + 1; + УсловиеДоп = УсловиеДоп + " И ПартнерыКонтактнаяИнформация.Представление ПОДОБНО ""%"" + &Представление" + Строка(Итератор) + " + ""%"""; + УсловиеДоп2 = УсловиеДоп2 + " И КонтактныеЛицаПартнеровКонтактнаяИнформация.Представление ПОДОБНО ""%"" + &Представление" + Строка(Итератор) + " + ""%"""; + Запрос.УстановитьПараметр("Представление" + Строка(Итератор), Слово); + КонецЦикла; + Запрос.Текст = СтрЗаменить(Запрос.Текст, "ПартнерыКонтактнаяИнформация.Представление ПОДОБНО ""%"" + &Представление + ""%""", УсловиеДоп); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "КонтактныеЛицаПартнеровКонтактнаяИнформация.Представление ПОДОБНО ""%"" + &Представление + ""%""", УсловиеДоп2); + КонецЕсли; + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Если ТолькоСсылка Тогда + МассивПартнеров.Добавить(Выборка.Ссылка); + Иначе + СтруктураВозврата = Новый Структура; + СтруктураВозврата.Вставить("Ссылка", Выборка.Ссылка); + СтруктураВозврата.Вставить("НаименованиеПолное", Выборка.НаименованиеПолное); + СтруктураВозврата.Вставить("ОсновнойМенеджер", Выборка.ОсновнойМенеджер); + СтруктураВозврата.Вставить("ИмяРеквизита", Выборка.ИмяРеквизита); + СтруктураВозврата.Вставить("Реквизит", Выборка.Реквизит); + МассивПартнеров.Добавить(СтруктураВозврата); + КонецЕсли; + КонецЦикла; + Возврат МассивПартнеров; +КонецФункции + +Функция НайтиПартнераПоНаименованию(Наименование, Тип = 0, ТолькоСсылка = Истина) Экспорт + МассивПартнеров = Новый Массив(); + Если ПустаяСтрока(Наименование) Тогда + Возврат МассивПартнеров; + КонецЕсли; + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Наименование", Наименование); + Если ТолькоСсылка Тогда + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Партнеры.Ссылка КАК Ссылка, + | Партнеры.НаименованиеПолное КАК НаименованиеПолное, + | Партнеры.ОсновнойМенеджер КАК ОсновнойМенеджер + |ИЗ + | Справочник.Партнеры КАК Партнеры + |ГДЕ + | (Партнеры.Наименование ПОДОБНО ""%"" + &Наименование + ""%"" + | ИЛИ Партнеры.НаименованиеПолное ПОДОБНО ""%"" + &Наименование + ""%"")"; + ИначеЕсли Тип = 0 Тогда + Запрос.УстановитьПараметр("ИмяРеквизита", "Наименование"); + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Партнеры.Ссылка КАК Ссылка, + | Партнеры.НаименованиеПолное КАК НаименованиеПолное, + | Партнеры.ОсновнойМенеджер КАК ОсновнойМенеджер, + | Партнеры.Наименование КАК Реквизит, + | &ИмяРеквизита КАК ИмяРеквизита + |ИЗ + | Справочник.Партнеры КАК Партнеры + |ГДЕ + | Партнеры.Наименование ПОДОБНО ""%"" + &Наименование + ""%"""; + Иначе + Запрос.УстановитьПараметр("ИмяРеквизита", "НаименованиеПолное"); + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Партнеры.Ссылка КАК Ссылка, + | Партнеры.НаименованиеПолное КАК НаименованиеПолное, + | Партнеры.ОсновнойМенеджер КАК ОсновнойМенеджер, + | Партнеры.НаименованиеПолное КАК Реквизит, + | &ИмяРеквизита КАК ИмяРеквизита + |ИЗ + | Справочник.Партнеры КАК Партнеры + |ГДЕ + | Партнеры.НаименованиеПолное ПОДОБНО ""%"" + &Наименование + ""%"""; + КонецЕсли; + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Если ТолькоСсылка Тогда + МассивПартнеров.Добавить(Выборка.Ссылка); + Иначе + СтруктураВозврата = Новый Структура; + СтруктураВозврата.Вставить("Ссылка", Выборка.Ссылка); + СтруктураВозврата.Вставить("НаименованиеПолное", Выборка.НаименованиеПолное); + СтруктураВозврата.Вставить("ОсновнойМенеджер", Выборка.ОсновнойМенеджер); + СтруктураВозврата.Вставить("ИмяРеквизита", Выборка.ИмяРеквизита); + СтруктураВозврата.Вставить("Реквизит", Выборка.Реквизит); + МассивПартнеров.Добавить(СтруктураВозврата); + КонецЕсли; + КонецЦикла; + Возврат МассивПартнеров; +КонецФункции + +Функция НайтиПартнераПоИНН(ИНН, ТолькоСсылка = Истина) Экспорт + МассивПартнеров = Новый Массив(); + Если ПустаяСтрока(ИНН) Тогда + Возврат МассивПартнеров; + КонецЕсли; + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ИНН", ИНН); + Запрос.УстановитьПараметр("ИмяРеквизита", "ИНН"); + Если CRM_ОбщегоНазначенияПовтИсп.ЭтоCRM() Тогда + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Партнеры.Ссылка КАК Ссылка, + | Партнеры.НаименованиеПолное КАК НаименованиеПолное, + | Партнеры.ОсновнойМенеджер КАК ОсновнойМенеджер, + | Партнеры.CRM_ИНН КАК Реквизит, + | &ИмяРеквизита КАК ИмяРеквизита + |ИЗ + | Справочник.Партнеры КАК Партнеры + |ГДЕ + | Партнеры.CRM_ИНН ПОДОБНО ""%"" + &ИНН + ""%"""; + ИначеЕсли НЕ CRM_ОбщегоНазначенияСервер.НайтиВМетаданныхПоИмени("Справочники", "Партнеры") Тогда // Для УНФ + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Контрагенты.Ссылка КАК Ссылка, + | Контрагенты.НаименованиеПолное КАК НаименованиеПолное, + | НЕОПРЕДЕЛЕНО КАК ОсновнойМенеджер, + | Контрагенты.ИНН КАК Реквизит, + | &ИмяРеквизита КАК ИмяРеквизита + |ИЗ + | Справочник.Контрагенты КАК Контрагенты + |ГДЕ + | Контрагенты.ИНН ПОДОБНО ""%"" + &ИНН + ""%"""; + Иначе // ERP, КА, УТ + Запрос.УстановитьПараметр("ИмяРеквизита", НСтр("ru='ИНН контрагента';en=""Counterparty's TIN""")); + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Партнеры.Ссылка КАК Ссылка, + | Партнеры.НаименованиеПолное КАК НаименованиеПолное, + | Партнеры.ОсновнойМенеджер КАК ОсновнойМенеджер, + | Контрагенты.ИНН КАК Реквизит, + | &ИмяРеквизита КАК ИмяРеквизита + |ИЗ + | Справочник.Партнеры КАК Партнеры + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты + | ПО Контрагенты.Партнер = Партнеры.Ссылка + |ГДЕ + | Контрагенты.ИНН ПОДОБНО ""%"" + &ИНН + ""%"""; + КонецЕсли; + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Если ТолькоСсылка Тогда + МассивПартнеров.Добавить(Выборка.Ссылка); + Иначе + СтруктураВозврата = Новый Структура; + СтруктураВозврата.Вставить("Ссылка", Выборка.Ссылка); + СтруктураВозврата.Вставить("НаименованиеПолное", Выборка.НаименованиеПолное); + СтруктураВозврата.Вставить("ОсновнойМенеджер", Выборка.ОсновнойМенеджер); + СтруктураВозврата.Вставить("ИмяРеквизита", Выборка.ИмяРеквизита); + СтруктураВозврата.Вставить("Реквизит", Выборка.Реквизит); + МассивПартнеров.Добавить(СтруктураВозврата); + КонецЕсли; + КонецЦикла; + Возврат МассивПартнеров; +КонецФункции + +#КонецОбласти + +#Область МеханизмыНастройкиРаботыСРеквизитами + +Функция РеквизитыОтключенныеПоФО() Экспорт + + Результат = Новый Массив; + + Возврат Результат; + +КонецФункции + +Функция ЗависимостьРеквизитов() Экспорт + + // Сформировать таблицу реквизитов для заполнения. + ТаблицаРеквизитов = Новый ТаблицаЗначений; + ТаблицаРеквизитов.Колонки.Добавить("Реквизит"); + ТаблицаРеквизитов.Колонки.Добавить("ДействиеСРеквизитом"); + + Реквизиты = Метаданные.Справочники.Партнеры.Реквизиты; + Для Каждого Реквизит из Реквизиты Цикл + НоваяСтрока = ТаблицаРеквизитов.Добавить(); + НоваяСтрока.Реквизит = Реквизит; + НоваяСтрока.ДействиеСРеквизитом = "Добавить"; + + КонецЦикла; + + Возврат ТаблицаРеквизитов; + +КонецФункции + +#КонецОбласти + +#Область ВыводНовогоСпискаКонтактныхЛицПартнера + +Процедура ИнициализацияКонтактныхЛицПартнера(Форма, ТипыКИ, ИмяРеквизитаКонтактноеЛицо="") Экспорт + Строка500 = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(500)); + ИмяОписания = "КонтактныеЛицаПартнера"; + МассивДобавляемыхРеквизитов = Новый Массив; + МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ИмяОписания, Новый ОписаниеТипов("ТаблицаЗначений"))); + МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("КонтактноеЛицо", Новый ОписаниеТипов("СправочникСсылка.КонтактныеЛицаПартнеров"), ИмяОписания, НСтр("ru = 'Контактное лицо'"))); + МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Должность", Новый ОписаниеТипов("СправочникСсылка.CRM_Должности"), ИмяОписания, НСтр("ru = 'Должность'"))); + МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Состояние", Новый ОписаниеТипов("ПеречислениеСсылка.CRM_Состояние"), ИмяОписания, НСтр("ru = 'Состояние'"))); + МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Основное", Новый ОписаниеТипов("Булево"), ИмяОписания)); + МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ИмяРеквизита", Строка500, ИмяОписания)); + Для каждого ТипКИ из ТипыКИ Цикл + МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("КИТипа"+СтрЗаменить(Строка(ТипКИ), " ", "_"), Новый ОписаниеТипов("Строка"), ИмяОписания, ТипКИ)); + МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ТипКИ"+СтрЗаменить(Строка(ТипКИ), " ", "_"), Новый ОписаниеТипов("ПеречислениеСсылка.ТипыКонтактнойИнформации"), ИмяОписания)); + КонецЦикла; + + МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ИмяРеквизитаКонтактноеЛицо", Строка500)); + + Форма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); + Форма.ИмяРеквизитаКонтактноеЛицо = ИмяРеквизитаКонтактноеЛицо; + +КонецПроцедуры + +Процедура ВывестиКонтактныеЛицаПартнера(Форма, Партнер, ОсновнойКонтакт = Неопределено, ИмяЭлементаДляРазмещения, ТипыКИ, ВыводитьВсегда = Ложь) Экспорт + + ВыводитьКонтактов = 3; + ЭлементРазмещения = Форма.Элементы[ИмяЭлементаДляРазмещения]; + Пока ЭлементРазмещения.ПодчиненныеЭлементы.Количество() > 0 Цикл + Форма.Элементы.Удалить(ЭлементРазмещения.ПодчиненныеЭлементы[0]); + КонецЦикла; + Форма.КонтактныеЛицаПартнера.Очистить(); + Если НЕ ЗначениеЗаполнено(Партнер) И НЕ ВыводитьВсегда Тогда + Возврат; + КонецЕсли; + КонтактныеЛица = CRM_ОбщегоНазначенияСервер.ПолучитьКонтактныхЛицКонтрагентаПодробно(Партнер, ТипыКИ); + Если ЗначениеЗаполнено(ОсновнойКонтакт) Тогда + СтрокаОсновногоКонтакта = КонтактныеЛица.Найти(ОсновнойКонтакт, "КонтактноеЛицо"); + Если СтрокаОсновногоКонтакта<>Неопределено Тогда + СтрокаОсновногоКонтакта.Основное = Истина; + КонтактныеЛица.Сортировать("Основное убыв"); + КонецЕсли; + КонецЕсли; + + Выведено = 0; + Для каждого Контакт из КонтактныеЛица Цикл + + СтрокаКЛ = Форма.КонтактныеЛицаПартнера.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаКЛ, Контакт); + Если Выведено < ВыводитьКонтактов Тогда + Идентификатор = СТРЗаменить(Строка(Контакт.КонтактноеЛицо.УникальныйИдентификатор()), "-", "_"); + + Если Форма.Команды.Найти("ЭлементКЛ"+Идентификатор) = Неопределено Тогда + Команда = Форма.Команды.Добавить("ЭлементКЛ"+Идентификатор); + Команда.Действие = "Подключаемый_КонтактныеЛицаНажатие"; + КонецЕсли; + + ГруппаКЛ = Форма.Элементы.Добавить("ГруппаКЛ"+Идентификатор, Тип("ГруппаФормы"), ЭлементРазмещения); + ГруппаКЛ.Вид = ВидГруппыФормы.ОбычнаяГруппа; + ГруппаКЛ.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; + ГруппаКЛ.ОтображатьЗаголовок= Ложь; + ГруппаКЛ.ВертикальныйИнтервал = ИнтервалМеждуЭлементамиФормы.Нет; + + ЭлементКЛ = Форма.Элементы.Добавить("ЭлементКЛ"+Идентификатор, Тип("КнопкаФормы"), ГруппаКЛ); + ЭлементКЛ.Заголовок = Контакт.КонтактноеЛицо; + ЭлементКЛ.ОтображениеФигуры = ОтображениеФигурыКнопки.Нет; + ЭлементКЛ.ЦветТекста = ЦветаСтиля.CRM_ЧерныйЦветТекста; + ЭлементКЛ.Шрифт = Новый Шрифт(, 10, Контакт.Основное); + ЭлементКЛ.Картинка = БиблиотекаКартинок.CRM_СтрелкаВниз; + ЭлементКЛ.ИмяКоманды = "ЭлементКЛ"+Идентификатор; + Если Контакт.Состояние = Перечисления.CRM_Состояние.ВременноНеРаботает ИЛИ Контакт.Состояние = Перечисления.CRM_Состояние.Уволен Тогда + ЭлементКЛ.Заголовок = ЭлементКЛ.Заголовок + " ("+Контакт.Состояние+")"; + КонецЕсли; + + СтрокаКЛ.ИмяРеквизита = ЭлементКЛ.Имя; + + ГруппаДолжность_КИ_КЛ = Форма.Элементы.Добавить("ГруппаДолжность_КИ_КЛ"+Идентификатор, Тип("ГруппаФормы"), ГруппаКЛ); + ГруппаДолжность_КИ_КЛ.Вид = ВидГруппыФормы.ОбычнаяГруппа; + ГруппаДолжность_КИ_КЛ.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда; + ГруппаДолжность_КИ_КЛ.РастягиватьПоВертикали = Ложь; + ГруппаДолжность_КИ_КЛ.ОтображатьЗаголовок= Ложь; + + Если ЗначениеЗаполнено(Контакт.Должность) Тогда + ЭлементКЛДолжность = Форма.Элементы.Добавить("ЭлементКЛДолжность"+Идентификатор, Тип("ДекорацияФормы"), ГруппаДолжность_КИ_КЛ); + ЭлементКЛДолжность.Заголовок = Контакт.Должность; + ЭлементКЛДолжность.Шрифт = Новый Шрифт(); + ЭлементКЛДолжность.ЦветТекста = Новый Цвет(109,109,109); + КонецЕсли; + + ГруппаКИКЛ = Форма.Элементы.Добавить("ГруппаКИКЛ"+Идентификатор, Тип("ГруппаФормы"), ГруппаДолжность_КИ_КЛ); + ГруппаКИКЛ.Вид = ВидГруппыФормы.ОбычнаяГруппа; + ГруппаКИКЛ.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда; + ГруппаКИКЛ.РастягиватьПоВертикали = Ложь; + ГруппаКИКЛ.ОтображатьЗаголовок= Ложь; + ГруппаКИКЛ.ГоризонтальныйИнтервал = ИнтервалМеждуЭлементамиФормы.Нет; + + CRM_УправлениеКонтактнойИнформацией.ВывестиКонтактнуюИнформациюОбъекта(Форма, Контакт.КонтактноеЛицо, ГруппаКИКЛ.Имя, ТипыКИ); + + Выведено = Выведено + 1; + КонецЕсли; + + КонецЦикла; + + ГруппаЕщеКонтакты = Форма.Элементы.Добавить("ГруппаЕщеКонтакты", Тип("ГруппаФормы"), ЭлементРазмещения); + ГруппаЕщеКонтакты.Вид = ВидГруппыФормы.ОбычнаяГруппа; + ГруппаЕщеКонтакты.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда; + ГруппаЕщеКонтакты.ОтображатьЗаголовок= Ложь; + ГруппаЕщеКонтакты.ГоризонтальныйИнтервал = ИнтервалМеждуЭлементамиФормы.Нет; + + Если Форма.Команды.Найти("ЭлементЕщеКонтакты") = Неопределено Тогда + Команда = Форма.Команды.Добавить("ЭлементЕщеКонтакты"); + Команда.Действие = "Подключаемый_КонтактныеЛицаНажатие"; + КонецЕсли; + ЭлементКЛ = Форма.Элементы.Добавить("ЭлементЕщеКонтакты", Тип("КнопкаФормы"), ГруппаЕщеКонтакты); + Если КонтактныеЛица.Количество() > 3 Тогда + ЭлементКЛ.Заголовок = НСтр("ru = 'Еще контакты +'") + Строка(КонтактныеЛица.Количество() - ВыводитьКонтактов); + Иначе + ЭлементКЛ.Заголовок = НСтр("ru = 'Добавить контакты'"); + КонецЕсли; + ЭлементКЛ.ОтображениеФигуры = ОтображениеФигурыКнопки.Нет; + ЭлементКЛ.ЦветТекста = ЦветаСтиля.CRM_ОсновнойГолубой; + ЭлементКЛ.Шрифт = Новый Шрифт(,,Истина); + ЭлементКЛ.Картинка = БиблиотекаКартинок.CRM_СтрелкаВниз; + ЭлементКЛ.ИмяКоманды = "ЭлементЕщеКонтакты"; + + ГруппаСписокКЛ = Форма.Элементы.Добавить("ГруппаСписокКЛ", Тип("ГруппаФормы"), ГруппаЕщеКонтакты); + ГруппаСписокКЛ.Вид = ВидГруппыФормы.ОбычнаяГруппа; + ГруппаСписокКЛ.Поведение = ПоведениеОбычнойГруппы.Всплывающая; + ГруппаСписокКЛ.Заголовок = "."; + ГруппаСписокКЛ.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; + ГруппаСписокКЛ.Отображение = ОтображениеОбычнойГруппы.Нет; + ГруппаСписокКЛ.ЦветТекстаЗаголовка = ЦветаСтиля.CRM_СерыйДляПодложек; + ГруппаСписокКЛ.ЦветФона = ЦветаСтиля.CRM_СерыйДляПодложек; + ГруппаСписокКЛ.ШрифтЗаголовка = Новый Шрифт(ШрифтыСтиля.ОбычныйШрифтТекста,,1,Истина); + ГруппаСписокКЛ.ВертикальныйИнтервал = ИнтервалМеждуЭлементамиФормы.Одинарный; + ГруппаСписокКЛ.РастягиватьПоГоризонтали = Ложь; + ГруппаСписокКЛ.РастягиватьПоВертикали = Ложь; + + ГруппаПанельКЛ = Форма.Элементы.Добавить("ГруппаПанельКЛ", Тип("ГруппаФормы"), ГруппаСписокКЛ); + ГруппаПанельКЛ.Вид = ВидГруппыФормы.ОбычнаяГруппа; + ГруппаПанельКЛ.ОтображатьЗаголовок= Ложь; + ГруппаПанельКЛ.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда; + + Если Форма.Команды.Найти("ДобавитьНовоеКЛ") = Неопределено Тогда + Команда = Форма.Команды.Добавить("ДобавитьНовоеКЛ"); + Команда.Действие = "Подключаемый_КонтактныеЛицаНажатие"; + КонецЕсли; + ЭлементКЛ = Форма.Элементы.Добавить("ДобавитьНовоеКЛ", Тип("КнопкаФормы"), ГруппаПанельКЛ); + ЭлементКЛ.Заголовок = НСтр("ru = 'Добавить'"); + ЭлементКЛ.ЦветФона = ЦветаСтиля.CRM_ОсновнойГолубой; + ЭлементКЛ.ЦветРамки = ЭлементКЛ.ЦветФона; + ЭлементКЛ.ЦветТекста = ЦветаСтиля.ЦветФонаПоля; + ЭлементКЛ.Шрифт = Новый Шрифт(,,Истина); + ЭлементКЛ.ИмяКоманды = "ДобавитьНовоеКЛ"; + + Если ЗначениеЗаполнено(Форма.ИмяРеквизитаКонтактноеЛицо) Тогда + Если Форма.Команды.Найти("СделатьКЛОсновным") = Неопределено Тогда + Команда = Форма.Команды.Добавить("СделатьКЛОсновным"); + Команда.Действие = "Подключаемый_КонтактныеЛицаНажатие"; + КонецЕсли; + ЭлементКЛ = Форма.Элементы.Добавить("СделатьКЛОсновным", Тип("КнопкаФормы"), ГруппаПанельКЛ); + ЭлементКЛ.Заголовок = НСтр("ru = 'Сделать основным'"); + //ЭлементКЛ.ЦветФона = ЦветаСтиля.CRM_СерыйДляВторостепенныхФункций; + ЭлементКЛ.Ширина = 15; + ЭлементКЛ.ЦветТекста = ЦветаСтиля.CRM_ОсновнойГолубой; + ЭлементКЛ.ОтображениеФигуры = ОтображениеФигурыКнопки.Нет; + ЭлементКЛ.Шрифт = Новый Шрифт(,,Истина); + ЭлементКЛ.ИмяКоманды = "СделатьКЛОсновным"; + КонецЕсли; + + ЭлементСписокКЛ = Форма.Элементы.Добавить("ЭлементСписокКЛ", Тип("ТаблицаФормы"), ГруппаСписокКЛ); + ЭлементСписокКЛ.ПутьКДанным = "КонтактныеЛицаПартнера"; + ЭлементСписокКЛ.РастягиватьПоГоризонтали = Ложь; + ЭлементСписокКЛ.РастягиватьПоВертикали = Ложь; + ЭлементСписокКЛ.КоманднаяПанель.Видимость = Ложь; + //ЭлементСписокКЛ.ЦветФона = ЦветаСтиля.CRM_СерыйДляПодложек; + ЭлементСписокКЛ.ИзменятьСоставСтрок = Ложь; + ЭлементСписокКЛ.Ширина = 85; + ЭлементСписокКЛ.УстановитьДействие("Выбор", "Подключаемый_КонтактныеЛицаВыбор"); + + Для каждого Колонка из КонтактныеЛица.Колонки Цикл + Если Колонка.Имя = "Основное" ИЛИ СтрНайти(Колонка.Имя, "ТипКИ") > 0 Тогда + Продолжить; + КонецЕсли; + КолонкаСпискаКЛ = Форма.Элементы.Добавить("ЭлементСписокКЛ" + Колонка.Имя, Тип("ПолеФормы"), ЭлементСписокКЛ); + КолонкаСпискаКЛ.Вид = ВидПоляФормы.ПолеВвода; + КолонкаСпискаКЛ.ПутьКДанным = "КонтактныеЛицаПартнера." + Колонка.Имя; + КолонкаСпискаКЛ.ЦветТекста = ЦветаСтиля.CRM_ЧерныйЦветТекста; + КолонкаСпискаКЛ.ТолькоПросмотр = Истина; + КонецЦикла; + Для каждого ТипКИ из ТипыКИ Цикл + ЭлементКИТипа = Форма.Элементы.Найти("ЭлементСписокКЛКИТипа"+СтрЗаменить(Строка(ТипКИ), " ", "_")); + Если ЭлементКИТипа <> Неопределено Тогда + ЭлементКИТипа.ГиперссылкаЯчейки = Истина; + ЭлементКИТипа.ЦветТекста = ЦветаСтиля.CRM_ОсновнойГолубой; + КонецЕсли; + КонецЦикла; + + УО = Форма.УсловноеОформление.Элементы; + + // Для настройки триггера + ЭлементУО = УО.Добавить(); + ЭлементУО.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(ШрифтыСтиля.ОбычныйШрифтТекста,,10,Истина,Ложь,Ложь,Ложь)); + ПолеУсловия = ЭлементУО.Поля.Элементы.Добавить(); + ПолеУсловия.Поле = Новый ПолеКомпоновкиДанных("ЭлементСписокКЛКонтактноеЛицо"); + ЭлементУсловия = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КонтактныеЛицаПартнера.Основное"); + ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементУсловия.ПравоеЗначение = Истина; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти diff --git a/src/test/resources/examples/highlightCrmQuery.bsl b/src/test/resources/examples/highlightCrmQuery.bsl new file mode 100644 index 0000000..04069ab --- /dev/null +++ b/src/test/resources/examples/highlightCrmQuery.bsl @@ -0,0 +1,90 @@ + ТекстЗапроса = " + |ВЫБРАТЬ + | Таблица.Ссылка КАК Ссылка + |ИЗ + | Документ.ЭлектронноеПисьмоВходящее КАК Таблица + |ГДЕ + | (ТИПЗНАЧЕНИЯ(Таблица.ОтправительКонтакт) = ТИП(СТРОКА) И Таблица.ОтправительКонтакт <> """" ИЛИ Таблица.ОтправительКонтакт = НЕОПРЕДЕЛЕНО) + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | Таблица.Ссылка КАК Ссылка + |ИЗ + | Документ.ЭлектронноеПисьмоВходящее.ПолучателиПисьма КАК Таблица + |ГДЕ + | (ТИПЗНАЧЕНИЯ(Таблица.Контакт) = ТИП(СТРОКА) И Таблица.Контакт <> """" ИЛИ Таблица.Контакт = НЕОПРЕДЕЛЕНО) + | И Таблица.Адрес <> """" + | И НЕ Таблица.Ссылка.ПометкаУдаления + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | Таблица.Ссылка КАК Ссылка + |ИЗ + | Документ.ЭлектронноеПисьмоВходящее.ПолучателиКопий КАК Таблица + |ГДЕ + | (ТИПЗНАЧЕНИЯ(Таблица.Контакт) = ТИП(СТРОКА) И Таблица.Контакт <> """" ИЛИ Таблица.Контакт = НЕОПРЕДЕЛЕНО) + | И Таблица.Адрес <> """" + | И НЕ Таблица.Ссылка.ПометкаУдаления + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | Таблица.Ссылка КАК Ссылка + |ИЗ + | Документ.ЭлектронноеПисьмоВходящее.ПолучателиОтвета КАК Таблица + |ГДЕ + | (ТИПЗНАЧЕНИЯ(Таблица.Контакт) = ТИП(СТРОКА) И Таблица.Контакт <> """" ИЛИ Таблица.Контакт = НЕОПРЕДЕЛЕНО) + | И Таблица.Адрес <> """" + | И НЕ Таблица.Ссылка.ПометкаУдаления + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | Таблица.Ссылка КАК Ссылка + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее.ПолучателиПисьма КАК Таблица + |ГДЕ + | (ТИПЗНАЧЕНИЯ(Таблица.Контакт) = ТИП(СТРОКА) И Таблица.Контакт <> """" ИЛИ Таблица.Контакт = НЕОПРЕДЕЛЕНО) + | И Таблица.Адрес <> """" + | И НЕ Таблица.Ссылка.ПометкаУдаления + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | Таблица.Ссылка КАК Ссылка + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее.ПолучателиКопий КАК Таблица + |ГДЕ + | (ТИПЗНАЧЕНИЯ(Таблица.Контакт) = ТИП(СТРОКА) И Таблица.Контакт <> """" ИЛИ Таблица.Контакт = НЕОПРЕДЕЛЕНО) + | И Таблица.Адрес <> """" + | И НЕ Таблица.Ссылка.ПометкаУдаления + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | Таблица.Ссылка КАК Ссылка + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее.ПолучателиОтвета КАК Таблица + |ГДЕ + | (ТИПЗНАЧЕНИЯ(Таблица.Контакт) = ТИП(СТРОКА) И Таблица.Контакт <> """" ИЛИ Таблица.Контакт = НЕОПРЕДЕЛЕНО) + | И Таблица.Адрес <> """" + | И НЕ Таблица.Ссылка.ПометкаУдаления + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | Таблица.Ссылка КАК Ссылка + |ИЗ + | Документ.СообщениеSMS.Адресаты КАК Таблица + |ГДЕ + | Таблица.Контакт = НЕОПРЕДЕЛЕНО + | И Таблица.КакСвязаться <> """" + | И НЕ Таблица.Ссылка.ПометкаУдаления + | + | СГРУППИРОВАТЬ + |ПО + | Ссылка + |"; + diff --git a/src/test/resources/examples/highlightErpIndexByQuery.bsl b/src/test/resources/examples/highlightErpIndexByQuery.bsl new file mode 100644 index 0000000..9d5b0d5 --- /dev/null +++ b/src/test/resources/examples/highlightErpIndexByQuery.bsl @@ -0,0 +1,14 @@ +Процедура ТестИндексироватьПо() Экспорт + ТекстЗапроса = " + |ВЫБРАТЬ + | Т.ГруппаИзделий КАК ГруппаИзделий, + | Т.КлючПартияРодитель КАК КлючПартияРодитель, + | Т.ДлительностьДоВыпускаРодитель КАК ДлительностьДоВыпускаРодитель + |ПОМЕСТИТЬ ВТ_ПартииРодителя + |ИЗ + | РегистрСведений.ПартииРодителя КАК Т + | + |ИНДЕКСИРОВАТЬ + | ПО ГруппаИзделий, КлючПартияРодитель, ДлительностьДоВыпускаРодитель + |;"; +КонецПроцедуры diff --git a/src/test/resources/examples/highlightLongQuery.bsl b/src/test/resources/examples/highlightLongQuery.bsl new file mode 100644 index 0000000..0a0d657 --- /dev/null +++ b/src/test/resources/examples/highlightLongQuery.bsl @@ -0,0 +1,11 @@ +А = "ВЫБРАТЬ +| ЕСТЬNULL(Таблица.Показатель, 0) КАК Показатель, +| ЕСТЬNULL(Таблица.Размер, 0) КАК РазмерНов +|ПОМЕСТИТЬ ВТ_Изменение +|ИЗ +| Таблица КАК Таблица +| ПОЛНОЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2 +| ПО Таблица.Показатель = Таблица2.Показатель +| И Таблица.Позиция = Таблица2.Позиция +|ГДЕ +| Таблица.Начисление <> Таблица2.Начисление";