При создании на сервере. Обработчик для события формы ПриСозданииНаСервере.
// Обработчик для события формы ПриСозданииНаСервере.
// Вызывается из модуля формы объекта-владельца КИ при внедрении подсистемы.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - Форма объекта-владельца, предназначенная для вывода контактной информации.
// Объект - Произвольный - Объект-владелец контактной информации. Если это ссылка, то контактная информация
// будет получена из объекта по ссылке, иначе из таблицы КонтактнаяИнформация объекта.
// ДополнительныеПараметры - Структура - Описание настроек контактной информации - см. ПараметрыКонтактнойИнформации.
// Предыдущее название параметра ИмяЭлементаДляРазмещения. Устарел, следует
// использовать ДополнительныеПараметры. Группа, куда будут размещены элементы
// контактной информации.
// УдалитьПоложениеЗаголовкаКИ - ПоложениеЗаголовкаЭлементаФормы - Устарел, следует использовать ДополнительныеПараметры.
// Может принимать значения:
// ПоложениеЗаголовкаЭлементаФормы.Верх или
// ПоложениеЗаголовкаЭлементаФормы.Лево (по умолчанию).
// УдалитьИсключаемыеВиды - Массив - Устарел,следует использовать ДополнительныеПараметры.
// УдалитьОтложеннаяИнициализация - Массив - Устарел,следует использовать ДополнительныеПараметры.
//
Процедура ПриСозданииНаСервере(Форма, Объект, ДополнительныеПараметры = Неопределено, УдалитьПоложениеЗаголовкаКИ = "",
Знач УдалитьИсключаемыеВиды = Неопределено, УдалитьОтложеннаяИнициализация = Ложь) Экспорт
ТипПомещения = Неопределено;
Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда
ДополнительныеПараметры.Свойство("ТипПомещения", ТипПомещения);
ОтложеннаяИнициализация = ?(ДополнительныеПараметры.Свойство("ОтложеннаяИнициализация"), ДополнительныеПараметры.ОтложеннаяИнициализация, Ложь);
ПоложениеЗаголовкаКИ = ?(ДополнительныеПараметры.Свойство("ПоложениеЗаголовкаКИ"), ДополнительныеПараметры.ПоложениеЗаголовкаКИ, "");
ИсключаемыеВиды = ?(ДополнительныеПараметры.Свойство("ИсключаемыеВиды"), ДополнительныеПараметры.ИсключаемыеВиды, Неопределено);
СкрываемыеВиды = ?(ДополнительныеПараметры.Свойство("СкрываемыеВиды"), ДополнительныеПараметры.СкрываемыеВиды, Неопределено);
ИмяЭлементаДляРазмещения = ?(ДополнительныеПараметры.Свойство("ИмяЭлементаДляРазмещения"), ДополнительныеПараметры.ИмяЭлементаДляРазмещения, "ГруппаКонтактнаяИнформация");
ОбработкаНавигационнойСсылки = ?(ДополнительныеПараметры.Свойство("ОбработкаНавигационнойСсылки"), ДополнительныеПараметры.ОбработкаНавигационнойСсылки, Ложь);
Иначе
ИмяЭлементаДляРазмещения = ?(ДополнительныеПараметры = Неопределено, "ГруппаКонтактнаяИнформация", ДополнительныеПараметры);
ОтложеннаяИнициализация = УдалитьОтложеннаяИнициализация;
ИсключаемыеВиды = УдалитьИсключаемыеВиды;
СкрываемыеВиды = Неопределено;
ПоложениеЗаголовкаКИ = УдалитьПоложениеЗаголовкаКИ;
ОбработкаНавигационнойСсылки = Ложь;
КонецЕсли;
Если ИсключаемыеВиды = Неопределено Тогда
ИсключаемыеВиды = Новый Массив;
КонецЕсли;
Если СкрываемыеВиды = Неопределено Тогда
СкрываемыеВиды = Новый Массив;
КонецЕсли;
ДобавляемыеРеквизиты = Новый Массив;
ПроверитьНаличиеРеквизитовКонтактнойИнформации(Форма, ДобавляемыеРеквизиты);
// Кэширование часто используемых значений
СсылкаНаОбъект = Объект.Ссылка;
МетаданныеОбъекта = СсылкаНаОбъект.Метаданные();
ПолноеИмяОбъектаМетаданных = МетаданныеОбъекта.ПолноеИмя();
ИмяОбъекта = МетаданныеОбъекта.Имя;
ГруппаВидовКонтактнойИнформации = ГруппаВидовКонтактнойИнформацииОбъекта(ПолноеИмяОбъектаМетаданных);
ИспользуетсяКонтактнаяИнформация = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ГруппаВидовКонтактнойИнформации, "Используется");
Если ИспользуетсяКонтактнаяИнформация = Ложь Тогда
ПараметрыВыводаКонтактнойИнформации = Новый Структура();
ПараметрыВыводаКонтактнойИнформации.Вставить("ИмяЭлементаДляРазмещения", ИмяЭлементаДляРазмещения);
ПараметрыВыводаКонтактнойИнформации.Вставить("ПоложениеЗаголовкаКИ", ПоложениеЗаголовкаКИ);
ПараметрыВыводаКонтактнойИнформации.Вставить("ОтложеннаяИнициализация", ОтложеннаяИнициализация);
ПараметрыВыводаКонтактнойИнформации.Вставить("ИсключаемыеВиды", ИсключаемыеВиды);
ПараметрыВыводаКонтактнойИнформации.Вставить("СкрываемыеВиды", СкрываемыеВиды);
ПараметрыВыводаКонтактнойИнформации.Вставить("СсылкаНаОбъект", СсылкаНаОбъект);
СкрытьКонтактнуюИнформацию(Форма, ДобавляемыеРеквизиты, ПараметрыВыводаКонтактнойИнформации);
Возврат;
КонецЕсли;
РеквизитыОбъекта = МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты;
ЕстьКолонкаДействуетС = (РеквизитыОбъекта.Найти("ДействуетС") <> Неопределено);
ЕстьКолонкаИдентификаторСтрокиТабличнойЧасти = (РеквизитыОбъекта.Найти("ИдентификаторСтрокиТабличнойЧасти") <> Неопределено);
Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Объект)) Тогда
ТекстЗапроса = "ВЫБРАТЬ
| КонтактнаяИнформация.Представление КАК Представление,
| КонтактнаяИнформация.НомерСтроки КАК НомерСтроки,
| КонтактнаяИнформация.Вид КАК Вид,
| ВидыКонтактнойИнформации.ХранитьИсториюИзменений КАК ХранитьИсториюИзменений,
| КонтактнаяИнформация.ЗначенияПолей,
| КонтактнаяИнформация.Значение,
| """" КАК ДействуетС,
| 0 КАК ИдентификаторСтрокиТабличнойЧасти,
| ЛОЖЬ КАК ЭтоИсторическаяКонтактнаяИнформация
|ИЗ
| Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
| ЛЕВОЕ СОЕДИНЕНИЕ " + ПолноеИмяОбъектаМетаданных + ".КонтактнаяИнформация КАК КонтактнаяИнформация
| ПО (КонтактнаяИнформация.Вид = ВидыКонтактнойИнформации.Ссылка)
|ГДЕ
| КонтактнаяИнформация.Ссылка = &Ссылка УПОРЯДОЧИТЬ ПО Вид, ДействуетС";
Если ЕстьКолонкаИдентификаторСтрокиТабличнойЧасти Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "0 КАК ИдентификаторСтрокиТабличнойЧасти",
"ЕСТЬNULL(КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти, 0) КАК ИдентификаторСтрокиТабличнойЧасти");
КонецЕсли;
Если ЕстьКолонкаДействуетС Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, """"" КАК ДействуетС", "КонтактнаяИнформация.ДействуетС КАК ДействуетС");
КонецЕсли;
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект);
КонтактнаяИнформация = Запрос.Выполнить().Выгрузить();
Иначе
КонтактнаяИнформация = Объект.КонтактнаяИнформация.Выгрузить();
Если ЕстьКолонкаДействуетС Тогда
ТипБулево = Новый ОписаниеТипов("Булево");
КонтактнаяИнформация.Колонки.Добавить("ХранитьИсториюИзменений", ТипБулево);
КонтактнаяИнформация.Колонки.Добавить("ЭтоИсторическаяКонтактнаяИнформация", ТипБулево);
КонтактнаяИнформация.Сортировать("Вид, ДействуетС");
Для каждого СтрокаКонтактнойИнформации Из КонтактнаяИнформация Цикл
СтрокаКонтактнойИнформации.ХранитьИсториюИзменений = СтрокаКонтактнойИнформации.Вид.ХранитьИсториюИзменений;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Если ЕстьКолонкаДействуетС Тогда
ПредыдущийВид = Неопределено;
Для каждого СтрокаКонтактнойИнформации Из КонтактнаяИнформация Цикл
Если СтрокаКонтактнойИнформации.ХранитьИсториюИзменений
И (ПредыдущийВид = Неопределено ИЛИ ПредыдущийВид <> СтрокаКонтактнойИнформации.Вид) Тогда
Отбор = Новый Структура("Вид", СтрокаКонтактнойИнформации.Вид);
НайденныеСтроки = КонтактнаяИнформация.НайтиСтроки(Отбор);
ПоследняяДата = НайденныеСтроки.Получить(НайденныеСтроки.Количество() - 1).ДействуетС;
Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл
Если НайденнаяСтрока.ДействуетС < ПоследняяДата Тогда
НайденнаяСтрока.ЭтоИсторическаяКонтактнаяИнформация = Истина;
КонецЕсли;
КонецЦикла;
ПредыдущийВид = СтрокаКонтактнойИнформации.Вид;
КонецЕсли;
КонецЦикла;
ТекстЗапросаИсторическаяИнформация = " КонтактнаяИнформация.ЭтоИсторическаяКонтактнаяИнформация КАК ЭтоИсторическаяКонтактнаяИнформация,
| КонтактнаяИнформация.ДействуетС КАК ДействуетС,";
Иначе
ТекстЗапросаИсторическаяИнформация = "ЛОЖЬ КАК ЭтоИсторическаяКонтактнаяИнформация,0 КАК ДействуетС, ";
КонецЕсли;
ТекстЗапроса = " ВЫБРАТЬ
| КонтактнаяИнформация.Представление КАК Представление,
| КонтактнаяИнформация.Значение КАК Значение,
| КонтактнаяИнформация.ЗначенияПолей КАК ЗначенияПолей,
| КонтактнаяИнформация.НомерСтроки КАК НомерСтроки, " + ТекстЗапросаИсторическаяИнформация + "
| КонтактнаяИнформация.Вид КАК Вид,
| 0 КАК ИдентификаторСтрокиТабличнойЧасти
|ПОМЕСТИТЬ
| КонтактнаяИнформация
|ИЗ
| &ТаблицаКонтактнойИнформации КАК КонтактнаяИнформация
|ИНДЕКСИРОВАТЬ ПО
| Вид
|;////////////////////////////////////////////////////////////////////////////////
|
|ВЫБРАТЬ
| ВидыКонтактнойИнформации.Ссылка КАК Вид,
|ВЫБОР
| КОГДА ВидыКонтактнойИнформации.ИмяПредопределенногоВида <> """"
| ТОГДА ВидыКонтактнойИнформации.ИмяПредопределенногоВида
| ИНАЧЕ ВидыКонтактнойИнформации.ИмяПредопределенныхДанных
|КОНЕЦ КАК ИмяПредопределенногоВида,
| ВидыКонтактнойИнформации.Тип КАК Тип,
| ВидыКонтактнойИнформации.ОбязательноеЗаполнение КАК ОбязательноеЗаполнение,
| ВидыКонтактнойИнформации.ВидПоляДругое КАК ВидПоляДругое,
| ВЫБОР
| КОГДА &ЭтоОсновнойЯзык
| ТОГДА ВидыКонтактнойИнформации.Наименование
| ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(ВидыКонтактнойИнформацииПредставления.Наименование, ВидыКонтактнойИнформации.Наименование) КАК СТРОКА(150))
| КОНЕЦ КАК Наименование,
| ВидыКонтактнойИнформации.ХранитьИсториюИзменений КАК ХранитьИсториюИзменений,
| ВидыКонтактнойИнформации.РедактированиеТолькоВДиалоге КАК РедактированиеТолькоВДиалоге,
| ВидыКонтактнойИнформации.ЭтоГруппа КАК ЭтоРеквизитТабличнойЧасти,
| ВидыКонтактнойИнформации.РеквизитДопУпорядочивания КАК РеквизитДопУпорядочивания,
| ВидыКонтактнойИнформации.МеждународныйФорматАдреса КАК МеждународныйФорматАдреса,
| ЕСТЬNULL(КонтактнаяИнформация.ЭтоИсторическаяКонтактнаяИнформация, ЛОЖЬ) КАК ЭтоИсторическаяКонтактнаяИнформация,
| ЕСТЬNULL(КонтактнаяИнформация.Представление, """") КАК Представление,
| ЕСТЬNULL(КонтактнаяИнформация.ЗначенияПолей, """") КАК ЗначенияПолей,
| ЕСТЬNULL(КонтактнаяИнформация.Значение, """") КАК Значение,
| ЕСТЬNULL(КонтактнаяИнформация.ДействуетС, 0) КАК ДействуетС,
| ЕСТЬNULL(КонтактнаяИнформация.НомерСтроки, 0) КАК НомерСтроки,
| 0 КАК ИдентификаторСтрокиТабличнойЧасти,
| ВЫРАЗИТЬ("""" КАК СТРОКА(200)) КАК ИмяРеквизита,
| ВидыКонтактнойИнформации.ПометкаУдаления КАК ПометкаУдаления,
| ВЫРАЗИТЬ("""" КАК СТРОКА) КАК Комментарий
|ИЗ
| Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
|ЛЕВОЕ СОЕДИНЕНИЕ
| КонтактнаяИнформация КАК КонтактнаяИнформация
|ПО
| ВидыКонтактнойИнформации.Ссылка = КонтактнаяИнформация.Вид
|ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыКонтактнойИнформации.Представления КАК ВидыКонтактнойИнформацииПредставления
|ПО ВидыКонтактнойИнформацииПредставления.Ссылка = ВидыКонтактнойИнформации.Ссылка
| И ВидыКонтактнойИнформацииПредставления.КодЯзыка = &КодЯзыка
|ГДЕ
| ВидыКонтактнойИнформации.Используется
| И ЕСТЬNULL(ВидыКонтактнойИнформации.Родитель.Используется, ИСТИНА)
| И (
| ВидыКонтактнойИнформации.Родитель = &ГруппаВидовКИ
| ИЛИ ВидыКонтактнойИнформации.Родитель.Родитель = &ГруппаВидовКИ)
| И ВидыКонтактнойИнформации.Ссылка НЕ В (&СкрываемыеВиды)
|УПОРЯДОЧИТЬ ПО
| ВидыКонтактнойИнформации.Ссылка ИЕРАРХИЯ
|";
Если ЕстьКолонкаИдентификаторСтрокиТабличнойЧасти Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "0 КАК ИдентификаторСтрокиТабличнойЧасти",
"ЕСТЬNULL(КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти, 0) КАК ИдентификаторСтрокиТабличнойЧасти");
КонецЕсли;
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ТаблицаКонтактнойИнформации", КонтактнаяИнформация);
Запрос.УстановитьПараметр("ГруппаВидовКИ", ГруппаВидовКонтактнойИнформации);
Запрос.УстановитьПараметр("Владелец", СсылкаНаОбъект);
Запрос.УстановитьПараметр("СкрываемыеВиды", СкрываемыеВиды);
Запрос.УстановитьПараметр("ЭтоОсновнойЯзык", ТекущийЯзык() = Метаданные.ОсновнойЯзык);
Запрос.УстановитьПараметр("КодЯзыка", ТекущийЯзык().КодЯзыка);
УстановитьПривилегированныйРежим(Истина);
КонтактнаяИнформация = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией).Строки;
УстановитьПривилегированныйРежим(Ложь);
КонвертацияКонтактнойИнформацииВJSON(КонтактнаяИнформация);
КонтактнаяИнформация.Сортировать("РеквизитДопУпорядочивания, НомерСтроки");
СоздатьРеквизитыКонтактнойИнформации(Форма, ДобавляемыеРеквизиты, ИмяОбъекта, ИсключаемыеВиды, КонтактнаяИнформация, ОтложеннаяИнициализация, ОбработкаНавигационнойСсылки);
ПараметрыКонтактнойИнформации = ПараметрыВыводаКонтактнойИнформации(Форма, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ,
ОтложеннаяИнициализация, ИсключаемыеВиды, СкрываемыеВиды);
ПараметрыКонтактнойИнформации.Владелец = СсылкаНаОбъект;
ПараметрыКонтактнойИнформации.ПараметрыАдреса.ТипПомещения = ТипПомещения;
ПараметрыКонтактнойИнформации.ОбработкаНавигационнойСсылки = ОбработкаНавигационнойСсылки;
// Кеш значений всех видов контактной информации у данного объекта.
ДанныеВидовКонтактнойИнформации = УправлениеКонтактнойИнформациейСлужебный.ДанныеВидовКонтактнойИнформации(
КонтактнаяИнформация.ВыгрузитьКолонку("Вид"));
Отбор = Новый Структура("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес);
КоличествоАдресов = КонтактнаяИнформация.НайтиСтроки(Отбор).Количество();
// Создадим элементы на форме и заполним значения реквизитов.
СозданныеЭлементы = ОбщегоНазначения.СкопироватьРекурсивно(ИсключаемыеВиды);
ПредыдущийВид = Неопределено;
Для Каждого СтрокаКИ Из КонтактнаяИнформация Цикл
Если СтрокаКИ.ЭтоРеквизитТабличнойЧасти Тогда
СоздатьЭлементыТабличнойЧасти(Форма, ИмяОбъекта, ИмяЭлементаДляРазмещения, СтрокаКИ, ДанныеВидовКонтактнойИнформации);
Продолжить;
КонецЕсли;
Если СтрокаКИ.ПометкаУдаления И ПустаяСтрока(СтрокаКИ.ЗначенияПолей) И ПустаяСтрока(СтрокаКИ.Значение) Тогда
Продолжить;
КонецЕсли;
ИндексЭлемента = СозданныеЭлементы.Найти(СтрокаКИ.Вид);
СтатическийЭлемент = ИндексЭлемента <> Неопределено;
ЭтоНовыйВидКИ = (СтрокаКИ.Вид <> ПредыдущийВид);
Если ОтложеннаяИнициализация Тогда
ДобавитьРеквизитВОписание(Форма, СтрокаКИ, ДанныеВидовКонтактнойИнформации, ЭтоНовыйВидКИ,,
СтатическийЭлемент, ИмяЭлементаДляРазмещения);
Если СтатическийЭлемент Тогда
СозданныеЭлементы.Удалить(ИндексЭлемента);
КонецЕсли;
Продолжить;
КонецЕсли;
ДобавитьРеквизитВОписание(Форма, СтрокаКИ, ДанныеВидовКонтактнойИнформации, ЭтоНовыйВидКИ,,
НЕ СтрокаКИ.ЭтоИсторическаяКонтактнаяИнформация, ИмяЭлементаДляРазмещения);
Если СтатическийЭлемент Тогда
СозданныеЭлементы.Удалить(ИндексЭлемента);
Иначе
СледующаяСтрока = ?(СозданныеЭлементы.Количество() = 0, Неопределено,
ОпределитьСледующуюСтроку(Форма, КонтактнаяИнформация, СтрокаКИ));
Если НЕ СтрокаКИ.ЭтоИсторическаяКонтактнаяИнформация Тогда
ДобавитьСтрокуКонтактнойИнформации(Форма, СтрокаКИ, ИмяЭлементаДляРазмещения, ЭтоНовыйВидКИ, КоличествоАдресов, СледующаяСтрока);
КонецЕсли;
КонецЕсли;
Если НЕ СтрокаКИ.ЭтоИсторическаяКонтактнаяИнформация Тогда
ПредыдущийВид = СтрокаКИ.Вид;
КонецЕсли;
КонецЦикла;
ОбновитьКонтекстноеМеню(Форма, ИмяЭлементаДляРазмещения);
Если Не ОтложеннаяИнициализация
И Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения].СписокДобавляемыхЭлементов.Количество() > 0 Тогда
ДобавитьКнопкуДополнительногоПоляКонтактнойИнформации(Форма, ИмяЭлементаДляРазмещения);
Иначе
ДобавитьПояснениеПоСбросуНастроекФормы(Форма, ИмяЭлементаДляРазмещения, ОтложеннаяИнициализация);
КонецЕсли;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
ПриСозданииНаСервереПользователя (БСП)
СоздаватьЭлектронныеПодписиНаСервере (БСП)
ПриСозданииНаСервереВариантыОтчетов (БСП)
ПечатьДокументовПриСозданииНаСервере (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)